Redis内存管理与持久化策略详解

85 阅读2分钟

过期数据删除策略

Redis采用两种常见的过期数据删除策略:

  1. 惰性删除:仅在获取Key时才检查数据是否过期。虽然对CPU友好,但可能导致大量过期Key未被删除,堆积内存。
  2. 定期删除:每隔一段时间批量删除过期Key。通过限制删除操作执行的时长和频率来减少对CPU时间的影响。

采用定期删除和惰性删除仍可能漏掉很多过期Key,导致内存堆积。为解决此问题,引入Redis内存淘汰机制

Redis内存淘汰机制

Redis内存淘汰机制采用多种策略结合:

  1. volatile-lru(least recently used) :从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
  2. volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  3. volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
  4. allkeys-lru(least recently used) :当内存不足以容纳新写入数据时,移除最近最少使用的Key。
  5. allkeys-random:从数据集中任意选择数据淘汰。
  6. no-eviction:禁止驱逐数据,即当内存不足以容纳新写入数据时,新写入操作报错。
  7. volatile-lfu(least frequently used) :从已设置过期时间的数据集中挑选最不经常使用的数据淘汰。
  8. allkeys-lfu(least frequently used) :当内存不足以容纳新写入数据时,移除最不经常使用的Key。

Redis持久化机制

Redis支持两种持久化操作:

  1. 快照RDB:创建快照获取内存数据副本,可备份、复制,也可在重启时使用。
  2. AOF持久化:每执行修改数据的命令时,将命令写入AOF文件,可通过配置控制同步频率。提供数据恢复。

AOF重写

AOF重写生成新AOF文件,保持与原有数据库状态一致,但体积更小。通过BGREWRITEAOF命令触发。

Redis Bigkey

Bigkey指占用大量内存的Key。可能导致内存消耗和性能问题。

危害:内存占用过大,性能下降。

发现方式

  1. 使用Redis自带的--bigkeys参数扫描所有Key,找出每种数据结构的Top1 Bigkey。
  2. 分析RDB文件,使用工具如redis-rdb-toolsrdb_bigkeys