Redis引入和概述
一、Redis的历史和发展过程
Redis是在2008年由意大利的一家创业公司Merzia的创始人Salvatore Sanfilippo(萨尔瓦托.圣菲利波)创造的。
当时,Salvatore 正在开发一款基于MySQL的网站实时统计系统LLOOGG,然而他发现MySQL的性能并不能满足他的需求。因此,他决定为自家产品量身定做一个数据库,这就是Redis。经过一年的开发,Redis在2009年完成并开源发布。由于其出色的性能,Redis吸引了大量的用户,现在已经成为世界上最受欢迎的数据库之一。
2022年Salvatore,宣布退出redis的维护
Redis的官方网站地址:https://redis.io/。
二、Redis的主要特性和优势
一)高性能
10w QPS(每秒查询率)
memcached(缓存)
二)支持数据类型丰富
数据结构
基本的数据类型
三)单线程处理
单线程模型
提高性能
四)持久化机制
RDB
AOF
持久化机制
三、Redis的使用场景
一)会话缓存(Session Cache)
在Web应用中,用户会话信息经常需要被存储和检索。这些信息可能包括用户登录状态、购物车内容等。使用Redis作为会话缓存,可以存储这些会话信息,并在需要时快速检索。相比于其他存储解决方案,如Memcached,Redis提供了持久化服务,这意味着即使服务器重启,会话信息也不会丢失。
二)排行榜/计数器
Redis的有序集合(Sorted Set)和列表(List)数据结构使其成为实现排行榜的理想选择。例如,你可以利用有序集合的排序功能,轻松地创建一个游戏得分排行榜。同时,Redis的原子性操作使其成为实现计数器的理想工具,例如跟踪页面访问量、文章阅读量等。
三)消息队列
在分布式系统中,消息队列是一种重要的通信方式。Redis的发布/订阅模型和列表数据结构可以实现简单的消息队列。生产者可以将消息发布到特定的频道,消费者可以订阅这个频道并接收消息。Redis的高读写速度使得它能够处理高并发的消息队列。
四)全页缓存(Full Page Cache,FPC)
在高流量的Web应用中,减轻数据库负载是提高性能的关键。通过使用Redis作为全页缓存,可以存储预渲染的页面,并在用户请求时快速提供,而无需查询数据库。
五)数据存储和配置
Redis可以作为数据存储系统来使用,对于一些不需要长期持久化的数据,或者一些频繁变动的数据,可以使用Redis进行存储。同时,Redis也常常用来存储一些系统的配置信息,这样在需要读取配置的时候,可以直接从Redis中获取,而不需要读取文件或者查询数据库。
四、Redis的架构
Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务,redis命令的执行过程如下
因为Redis是单线程来处理命令的,所以一条命令从客户端达到服务端不会立刻被执行,所有命令都会进入一个队列中,然后逐个被执行。如下图
所有命令在一个队列里排队等待被执行
为什么单线程还能这么快?
通常来讲,单线程处理能力要比多线程差,例如有10000斤货物,每辆车的运载能力是每次200斤,那么要50次才能完成,但是如果有50辆车,只要安排合理,只需要一次就可以完成任务。那么为什么Redis使用单线程模型会达到每秒万级别的处理能力呢?可以将其归结为三点:
第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
第二,非阻塞I/O,采用I/O多路复用技术,可以使得单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
第三,单线程避免了线程切换和竞态产生的消耗。
既然采用单线程就能达到如此高的性能,那么也不失为一种不错的选择,因为单线程能带来几个好处:
第一,单线程可以简化数据结构和算法的实现。如果对高级编程语言熟悉的读者应该了解并发数据结构实现不但困难而且开发测试比较麻烦。
第二,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。
但是单线程会有一个问题:对于每个命令的执行时间是有要求的。如果某个命令执行过长,会造成其他命令的阻塞,对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。