跳到主要内容

认识

2024年04月08日
柏拉文
越努力,越幸运

一、认识


Redis(Remote Dictionary Server) 是一个开源(遵循 BSD 许可)的高性能 键值数据库 key-value, 也是一个非关系 NoSQL 数据库。它支持存储的 value 类型相对更多,包括 string(字符串)list(链表)set(集合)zset(sorted set --有序集合)hash(哈希类型)Redis的操作是原子性的。Redis 可以用作缓存、消息队列、实时数据分析等多种场景。

Redis 为什么巨快?

  1. Redis 将数据存储在 内存(RAM,而不是像传统数据库那样依赖磁盘。因此,读取和写入操作非常快速,通常可以达到 微秒级 延迟,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。即便 Redis 主要使用内存,它也可以通过 RDB(快照), 以快照方式定期保存到磁盘,影响性能小。 或 AOF(追加日志), 记录每个写操作,启动时可恢复数据,影响性能略高 机制来实现持久化,确保数据不会因服务器宕机而丢失。

  2. Redis 提供了一系列高度优化的底层数据结构,这些结构在内存中占用空间少,并能快速执行各种操作,比如 字符串(String: 采用 SDS(Simple Dynamic String)结构,支持 O(1) 读取; 列表(List: 由快速的链表或压缩列表实现,提供 O(1) 头尾插入删除; 哈希(Hash: 小数据时使用紧凑表,大数据时用哈希表,提供 O(1) 查找; 集合(Set: 基于哈希表,支持快速查找和去重; 有序集合(Sorted Set: 使用跳表(Skip List),提供 O(log N) 插入和查找, Redis 会根据数据大小自动选择适合的内部编码(如 ziplisthashtable),以平衡时间和空间效率

  3. Redis 使用单线程处理客户端请求,避免了多线程带来的 锁竞争、线程切换、上下文切换 等开销, 由于 Redis 在内存中操作,CPU 往往不是性能瓶颈,瓶颈更多在于 网络 I/O 或 内存带宽, 单线程模型减少了不必要的 CPU 竞争,提高了吞吐量。在 Redis 6.0 之后,引入了 多线程 I/O 处理机制,用于并发处理网络请求,提高网络吞吐。(提示: Redis 单线程,意味着要考虑是否会阻塞后续命令的执行)

  4. 零拷贝(Zero-Copy)技术: Redis 使用了底层操作系统的 sendfilemmap 技术,减少数据在 用户态 和 内核态 之间的拷贝次数,提高网络响应速度。例如,当执行 GETSET 操作时,Redis 可以直接将数据从内存发送到网络套接字,避免额外的 CPU 开销。

  5. 管道(Pipelining)减少 RTT: Redis 提供了管道技术,允许客户端在一次网络请求中批量发送多个命令,而无需等待前一个命令的响应,减少了网络往返延迟(RTT),提高吞吐量。

  6. 高效的事件驱动机制: Redis 使用基于 epoll/kqueue(在 Linux/Unix 上)等高效的 事件驱动模型,实现高并发处理。事件循环采用 I/O 多路复用(如 epoll),可以同时监听多个客户端连接,提高吞吐量。这种设计使得 Redis 能够高效地处理成千上万的并发连接。

  7. 高效的内存管理: Redis 使用自己的 内存分配器 jemalloc,比系统默认 malloc 更快,减少内存碎片,提高分配效率。jemalloc 提供了更好的内存分配效率,降低 Redis 运行时的内存开销。

二、特性


2.1 高性能

Redis 是基于内存运行的数据库,数据的读写速度极快

  • 每秒可以处理数百万次操作。

  • 数据操作延迟通常在毫秒级甚至亚毫秒级。

2.2 持久化

Redis 提供多种持久化机制,用于数据的长久保存: Redis 将所有数据保存在内存中,对数据的更新将异步的保存到磁盘上。支持 RDB(快照)AOF(增量日志) 两种持久化方式,可以将内存中的数据持久化到磁盘。

  • RDB(Redis Database Backup) 快照:定期生成数据快照。以快照方式定期保存到磁盘,影响性能小。

  • AOF(Append-Only File) 增量日志:将每次写操作记录到日志文件中,支持数据重放。以快照方式定期保存到磁盘,影响性能小。

  • 可以结合使用 RDBAOF 以提高数据安全性。

2.3 高可用性

通过 主从复制(Replication哨兵(SentinelRedis 集群(Cluster 等功能实现高可用和分布式架构。

  • 主从复制:通过复制功能(Replication),支持数据从主节点同步到从节点,实现数据冗余,读写分离。

  • 哨兵模式(Sentinel:监控 Redis 主节点状态并在故障时自动故障转移。

  • Redis 集群(Cluster:实现数据分片和高可用,支持大规模分布式架构。

2.4 事务支持

Redis 支持简单的事务操作,保证一组命令的原子性执行。

2.5 发布订阅

Redis 提供发布/订阅模式,允许客户端通过频道发布消息并订阅特定的频道:可用于实时消息推送、聊天系统等场景。

2.6 内存管理

  • LRU(Least Recently Used):支持多种淘汰策略(如 LRULFU)。

  • 内存分配优化:支持针对内存分配的精细化控制。

  • 内存压缩:对数据进行压缩以节省存储空间。

2.7 多种数据结构

Redis 提供了多种数据结构,可以灵活地满足各种场景需求

  • 字符串(String:存储简单的键值对,支持字符串操作和整数、自增/自减操作。

  • 哈希(Hash:适合存储对象,如用户信息。

  • 列表(List:适用于队列、消息队列等场景。

  • 集合(Set:用于去重、交集、并集等操作。

  • 有序集合(Sorted Set:可存储带排序的数据,常用于排行榜。

  • 位图(Bitmap:处理位操作。

  • HyperLogLog:用于基数统计。超小内存的唯一值计数。

  • 地理空间(Geo:支持地理位置存储和查询。

2.8 Lua 脚本支持

  • Redis 可以运行 Lua 脚本,提供更强的扩展能力。

  • 脚本在服务器端一次性执行,减少网络往返,提高性能。