核心组件
内存数据存储
- 数据结构丰富:Redis以键值对的形式存储数据,支持多种数据结构,如字符串(Strings)、散列(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、位图(Bitmaps)、超日志(HyperLogLogs)、地理空间索引(Geospatial indexes)等。这些数据结构为开发者提供了灵活且高效的存储解决方案,适用于多种应用场景。
事件驱动模型
- 高效IO处理:Redis采用了作者自己开发的
ae
(Async Event)事件驱动模型,能够高效地处理网络IO读写、命令执行以及时间事件。这种模型使得Redis能够在一个单线程中并发地响应客户端请求,避免了多线程同步开销,保证了高吞吐量。
持久化机制
- RDB(Redis Database):Redis支持定期将内存中的数据以二进制形式dump到磁盘上,生成RDB文件,实现数据的持久化。RDB是Redis的一种全量快照方式,通过
SAVE
或BGSAVE
命令触发,适用于数据备份和灾难恢复。 - AOF(Append-only File):除了RDB,Redis还提供了AOF持久化模式。在这种模式下,Redis将每一个写操作(如SET、HSET等)以命令形式追加到AOF文件中。AOF可以提供更高的数据安全性,因为它记录了完整的操作日志,允许在服务器重启时通过重新执行这些命令来恢复数据状态。
网络通信
- 单线程响应:尽管Redis内部采用单线程处理命令,但它通过非阻塞IO和多路复用技术(如epoll、kqueue等)并行处理多个客户端连接。客户端发送请求到Redis服务器,服务器在单线程内顺序执行这些命令,并将响应返回给相应的客户端。
系统扩展与高可用性
主从复制(Replication)
- 数据同步:Redis支持主从复制架构,主节点处理写入请求并将其同步到一个或多个从节点。数据同步分为全量同步和部分同步(增量同步)。全量同步通过生成并发送RDB快照实现,部分同步则通过将主节点的写命令传播给从节点来保持数据一致性。
- 故障切换:主从复制为Redis提供了数据冗余和故障恢复能力。在主节点故障时,可以手动或通过Redis Sentinel自动将一个从节点提升为主节点,继续提供服务。
Redis Sentinel
- 监控与自动故障转移:Redis Sentinel是一个独立的服务,用于监控Redis集群的健康状况,自动检测主节点故障并执行故障转移操作。Sentinel还负责通知客户端主节点变更情况,使得客户端能够透明地切换到新的主节点。
Redis Cluster
- 分布式数据分片:Redis Cluster实现了数据的水平分区(sharding),每个节点仅存储一部分数据。客户端可以直接与任意节点交互,节点间通过哈希槽(slot)映射机制路由请求到正确的节点。这样可以实现数据的横向扩展,理论上支持无限数量的节点。
- 节点间通信与数据一致性:Redis Cluster节点之间通过Gossip协议进行通信,共享集群状态信息。对于涉及多个键的操作(如跨槽的事务、集合操作等),Redis Cluster提供有限的支持,确保数据在集群内的某种程度上的一致性。
Module System
- 插件化扩展:Redis支持Module System,允许开发者使用C语言编写自定义的数据类型、命令和脚本,无缝集成到Redis服务器中,从而扩展Redis的功能,满足特定业务需求。
其他特性
- Lua脚本:Redis支持在服务器端执行Lua脚本,实现原子性、复合操作,减少网络往返延迟,并确保数据一致性。
- LRU/EVICT策略:Redis提供了多种数据淘汰策略,如LRU(Least Recently Used)和TTL(Time To Live),用于在内存不足时自动删除较旧或过期的数据,以维持内存使用在配置的限制范围内。