Redis
Redis
数据结构
string 使用 SDS 记录了 len, free, buf三个字段 特性:空间预分配,惰性释放 优点:常数时间获得长度,防止缓冲区溢出
dict 使用散列表 Rehash 动态均摊扩容,同时维护两个哈希表
zset 有序链表 底层结构是跳跃表
ziplist 压缩列表 是列表键和字典键的底层实现 元素较少,优先存储在 ziplist ,超过某值再转化为标准存储结构
过期
expire 定时删除,通过定时遍历过期的键 每秒扫描十次,从过期字典中随机选取20个键进行删除,过期的键占所有的键的四分之一以上,则重复此过程
持久化机制
RDB 周期性持久化
每隔一段时间生成 redis 内存的数据的一份完整快照 RDB 缺点
- 无法秒级持久化
- 老版本 Redis 无法兼容新版本 RDB RDB 优点
- 文件紧凑,适合备份,全量复制场景。例如每 6 小时执行 bgsave,保存到文件系统之类的。
- Redis 加载 RDB 恢复数据远远快于 AOF
AOF
将每条命令作为日志写入 aof 文件中 当开启 AOF 持久化时,常用的同步硬盘的策略是“每秒同步” everysec,用于平衡性能和数据安全性,对于这种方式,redis 使用另一条线程每秒执行 fsync 同步硬盘,当系统资源繁忙时,将造成 Redis 主线程阻塞
单机多实例部署
Redis 单线程架构无法充分利用多核CPU,通常的做法是一台机器上部署多个实例,当多个实例开启 AOF 后,彼此之间就会产生CPU 和 IO 的竞争。
如何解决这个问题呢?
让所有实例的 AOF 串行执行。我们通过 info Persistence 中关于 AOF 的信息写出 Shell 脚本,然后串行执行实例的 AOF 持久化。 通过不断判断 AOF 的状态,手动执行 AOF 重写,保证 AOF 不会存在竞争。