Redis 概述
Redis 是 Remote Dictionary Server 的缩写。官方副标题为 A persistent-value database with built-in net interface written in ANSI-C for POSIX systems,定义偏向 Value Store。部分观点认为它是 Memory Database,因其高性能基于内存操作。另一些观点视其为 Data Structure Server,支持 List、Set 等复杂数据结构。对 Redis 作用的不同解读决定了使用方式。
互联网数据存储主要采用关系数据库或 Key-Value 模式。但业务数据(如社交关系)往往不符合这两种类型。关系数据库存储需转换为多行记录,存在冗余;Key-Value 存储修改删除较麻烦。Redis 在内存中设计了多种数据类型,支持高速原子访问,无需关心持久存储细节,从架构上解决了传统存储的弯路问题。
Redis 与 Memcached 性能对比
许多开发者认为 Redis 不可能比 Memcached 快,因为 Memcached 完全基于内存,而 Redis 有持久化特性。但测试结果通常显示 Redis 占优势。原因包括:
- Event Loop: Memcached 使用 libevent,代码庞大且牺牲特定平台性能。Redis 修改 libevent 中的两个文件实现了自己的 epoll event loop,保持小巧并减少依赖。编译前无需执行 ./configure。
- 竞争处理: Memcached 使用 CAS (Compare And Swap) 防止竞争,需为每个 key 设置隐藏 token,每次 set 递增 token,带来 CPU 和内存开销。虽然单机开销小,但在高并发下会产生细微性能差异。
内存限制与虚拟内存
Redis 数据全放内存带来高速性能,但也导致冷数据占用内存的问题。例如 100 万用户中仅 5 万活跃,全部存入内存不合理。
类似操作系统 Virtual Memory 概念,当物理内存不足时,将长期未访问数据交换到磁盘。Redis 2.0 增加了此特性,突破物理内存限制,实现数据冷热分离。
实现机制
Redis 依照 epoll 思路自己实现 VM。OS VM 基于 Page 概念(如 4K),即使只访问 1 字节也会换入整个页,造成浪费。Redis 自行实现 VM 可控制换入粒度。此外,访问操作系统内存区域可能导致进程 block,也是 Redis 自行实现 VM 的原因之一。
使用建议
作为 Key-Value 存储,直接 SET 并非最优。未启用 VM 时,所有数据需放入内存,节约内存很重要。
若一个 key-value 单元最小占用 512 字节,存 1 字节也占 512 字节。建议使用 Hashset 复用 key,将多个 key-value 放入一个 key 中,value 再作为集合存入,同样空间可存放 10-100 倍容量。
持久化策略
Redis 默认 Snapshot 方式,定时将内存快照持久化。缺点是持久化后 Crash 可能丢失一段数据。
AOF (Append Only File) 在写入内存同时保存操作命令日志。在高并发系统中,日志庞大,维护成本高,恢复时间长。
Redis 是内存数据结构模型,优势在于高效原子操作,AOF 与此略有冲突。
另一种达到高可用性的方法是 Replication。利用 Redis 高性能,复制基本无延迟,防止单点故障。

