认识
一、认识
Redis(Remote Dictionary Server)
是一个开源(遵循 BSD
许可)的高性能 键值数据库 key-value
, 也是一个非关系 NoSQL
数据库。它支持存储的 value
类型相对更多,包括 string
(字符串)、list
(链表)、set
(集合)、zset
(sorted set
--有序集合) 和 hash
(哈希类型)。Redis
的操作是原子性的。Redis
可以用作缓存、消息队列、实时数据分析等多种场景。
Redis
为什么巨快?
-
Redis
将数据存储在 内存(RAM
) 中,而不是像传统数据库那样依赖磁盘。因此,读取和写入操作非常快速,通常可以达到 微秒级 延迟,每秒可以处理超过10
万次读写操作,是已知性能最快的Key-Value DB
。即便Redis
主要使用内存,它也可以通过RDB
(快照), 以快照方式定期保存到磁盘,影响性能小。 或AOF
(追加日志), 记录每个写操作,启动时可恢复数据,影响性能略高 机制来实现持久化,确保数据不会因服务器宕机而丢失。 -
Redis
提供了一系列高度优化的底层数据结构,这些结构在内存中占用空间少,并能快速执行各种操作,比如 字符串(String
): 采用SDS(Simple Dynamic String)
结构,支持O(1)
读取; 列表(List
): 由快速的链表或压缩列表实现,提供O(1)
头尾插入删除; 哈希(Hash
): 小数据时使用紧凑表,大数据时用哈希表,提供O(1)
查找; 集合(Set
): 基于哈希表,支持快速查找和去重; 有序集合(Sorted Set
): 使用跳表(Skip List
),提供O(log N)
插入和查找,Redis
会根据数据大小自动选择适合的内部编码(如ziplist
、hashtable
),以平衡时间和空间效率。 -
Redis
使用单线程处理客户端请求,避免了多线程带来的 锁竞争、线程切换、上下文切换 等开销, 由于Redis
在内存中操作,CPU
往往不是性能瓶颈,瓶颈更多在于 网络I/O
或 内存带宽, 单线程模型减少了不必要的CPU
竞争,提高了吞吐量。在Redis 6.0
之后,引入了 多线程I/O
处理机制,用于并发处理网络请求,提高网络吞吐。(提示:Redis
单线程,意味着要考虑是否会阻塞后续命令的执行) -
零拷贝(
Zero-Copy
)技术:Redis
使用了底层操作系统的sendfile
和mmap
技术,减少数据在 用户态 和 内核态 之间的拷贝次数,提高网络响应速度。例如,当执行GET
或SET
操作时,Redis
可以直接将数据从内存发送到网络套接字,避免额外的CPU
开销。 -
管道(
Pipelining
)减少RTT
:Redis
提供了管道技术,允许客户端在一次网络请求中批量发送多个命令,而无需等待前一个命令的响应,减少了网络往返延迟(RTT
),提高吞吐量。 -
高效的事件驱动机制:
Redis
使用基于epoll/kqueue
(在Linux/Unix
上)等高效的 事件驱动模型,实现高并发处理。事件循环采用I/O
多路复用(如epoll
),可以同时监听多个客户端连接,提高吞吐量。这种设计使得Redis
能够高效地处理成千上万的并发连接。 -
高效的内存管理:
Redis
使用自己的 内存分配器jemalloc
,比系统默认malloc
更快,减少内存碎片,提高分配效率。jemalloc
提供了更好的内存分配效率,降低Redis
运行时的内存开销。
二、特性
2.1 高性能
Redis
是基于内存运行的数据库,数据的读写速度极快:
-
每秒可以处理数百万次操作。
-
数据操作延迟通常在毫秒级甚至亚毫秒级。
2.2 持久化
Redis
提供多种持久化机制,用于数据的长久保存: Redis
将所有数据保存在内存中,对数据的更新将异步的保存到磁盘上。支持 RDB
(快照) 和 AOF
(增量日志) 两种持久化方式,可以将内存中的数据持久化到磁盘。
-
RDB(Redis Database Backup)
快照:定期生成数据快照。以快照方式定期保存到磁盘,影响性能小。 -
AOF(Append-Only File)
增量日志:将每次写操作记录到日志文件中,支持数据重放。以快照方式定期保存到磁盘,影响性能小。 -
可以结合使用
RDB
和AOF
以提高数据安全性。
2.3 高可用性
通过 主从复制(Replication
)、哨兵(Sentinel
) 和 Redis
集群(Cluster
) 等功能实现高可用和分布式架构。
-
主从复制:通过复制功能(
Replication
),支持数据从主节点同步到从节点,实现数据冗余,读写分离。 -
哨兵模式(
Sentinel
):监控Redis
主节点状态并在故障时自动故障转移。 -
Redis
集群(Cluster
):实现数据分片和高可用,支持大规模分布式架构。
2.4 事务支持
Redis
支持简单的事务操作,保证一组命令的原子性执行。
2.5 发布订阅
Redis
提供发布/订阅模式,允许客户端通过频道发布消息并订阅特定的频道:可用于实时消息推送、聊天系统等场景。
2.6 内存管理
-
LRU(Least Recently Used)
:支持多种淘汰策略(如LRU
、LFU
)。 -
内存分配优化:支持针对内存分配的精细化控制。
-
内存压缩:对数据进行压缩以节省存储空间。
2.7 多种数据结构
Redis
提供了多种数据结构,可以灵活地满足各种场景需求:
-
字符串(
String
):存储简单的键值对,支持字符串操作和整数、自增/自减操作。 -
哈希(
Hash
):适合存储对象,如用户信息。 -
列表(
List
):适用于队列、消息队列等场景。 -
集合(
Set
):用于去重、交集、并集等操作。 -
有序集合(
Sorted Set
):可存储带排序的数据,常用于排行榜。 -
位图(
Bitmap
):处理位操作。 -
HyperLogLog
:用于基数统计。超小内存的唯一值计数。 -
地理空间(
Geo
):支持地理位置存储和查询。
2.8 Lua 脚本支持
-
Redis
可以运行Lua
脚本,提供更强的扩展能力。 -
脚本在服务器端一次性执行,减少网络往返,提高性能。