Redis

数据结构

string 使用 SDS 记录了 len, free, buf三个字段 特性:空间预分配,惰性释放 优点:常数时间获得长度,防止缓冲区溢出

dict 使用散列表 Rehash 动态均摊扩容,同时维护两个哈希表

zset 有序链表 底层结构是跳跃表

ziplist 压缩列表 是列表键和字典键的底层实现 元素较少,优先存储在 ziplist ,超过某值再转化为标准存储结构

过期

expire 定时删除,通过定时遍历过期的键 每秒扫描十次,从过期字典中随机选取20个键进行删除,过期的键占所有的键的四分之一以上,则重复此过程

持久化机制

RDB 周期性持久化

每隔一段时间生成 redis 内存的数据的一份完整快照 RDB 缺点

  1. 无法秒级持久化
  2. 老版本 Redis 无法兼容新版本 RDB RDB 优点
  3. 文件紧凑,适合备份,全量复制场景。例如每 6 小时执行 bgsave,保存到文件系统之类的。
  4. Redis 加载 RDB 恢复数据远远快于 AOF

AOF

将每条命令作为日志写入 aof 文件中 当开启 AOF 持久化时,常用的同步硬盘的策略是“每秒同步” everysec,用于平衡性能和数据安全性,对于这种方式,redis 使用另一条线程每秒执行 fsync 同步硬盘,当系统资源繁忙时,将造成 Redis 主线程阻塞

单机多实例部署

Redis 单线程架构无法充分利用多核CPU,通常的做法是一台机器上部署多个实例,当多个实例开启 AOF 后,彼此之间就会产生CPU 和 IO 的竞争。

如何解决这个问题呢?

让所有实例的 AOF 串行执行。我们通过 info Persistence 中关于 AOF 的信息写出 Shell 脚本,然后串行执行实例的 AOF 持久化。 通过不断判断 AOF 的状态,手动执行 AOF 重写,保证 AOF 不会存在竞争。