过期数据删除策略
Redis采用两种常见的过期数据删除策略:
- 惰性删除:仅在获取Key时才检查数据是否过期。虽然对CPU友好,但可能导致大量过期Key未被删除,堆积内存。
- 定期删除:每隔一段时间批量删除过期Key。通过限制删除操作执行的时长和频率来减少对CPU时间的影响。
采用定期删除和惰性删除仍可能漏掉很多过期Key,导致内存堆积。为解决此问题,引入Redis内存淘汰机制。
Redis内存淘汰机制
Redis内存淘汰机制采用多种策略结合:
- volatile-lru(least recently used) :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
- allkeys-lru(least recently used) :当内存不足以容纳新写入数据时,移除最近最少使用的Key。
- allkeys-random:从数据集中任意选择数据淘汰。
- no-eviction:禁止驱逐数据,即当内存不足以容纳新写入数据时,新写入操作报错。
- volatile-lfu(least frequently used) :从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。
- allkeys-lfu(least frequently used) :当内存不足以容纳新写入数据时,移除最不经常使用的Key。
Redis持久化机制
Redis支持两种持久化操作:
- 快照RDB:创建快照获取内存数据副本,可备份、复制,也可在重启时使用。
- AOF持久化:每执行修改数据的命令时,将命令写入AOF文件,可通过配置控制同步频率。提供数据恢复。
AOF重写
AOF重写生成新AOF文件,保持与原有数据库状态一致,但体积更小。通过BGREWRITEAOF命令触发。
Redis Bigkey
Bigkey指占用大量内存的Key。可能导致内存消耗和性能问题。
危害:内存占用过大,性能下降。
发现方式:
- 使用Redis自带的
--bigkeys参数扫描所有Key,找出每种数据结构的Top1 Bigkey。 - 分析RDB文件,使用工具如
redis-rdb-tools或rdb_bigkeys。