Redis内存机制!

内存回收策略

Redis的内存回收机制主要体现在以下两个方面:

删除到达过期时间的键对象。

内存使用达到Maxmemory上限时触发内存溢出控制策略。

删除过期键对象:

Redis所有的键都可以设置过期属性,内部保存在过期字典中。

惰性删除:

  • 当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回空。

定时任务删除:

  • Redis内部维护一个定时任务,默认每秒运行10次。

内存溢出策略

Redis所用内存达到Maxmemory上限时会触发相应的溢出策略:

noeviction

  • 默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时Redis只响应读操作。

volatile-lru

  • 根据LRU算法删除设置了超时属性的键。
  • 如果没有可删除的键对象,回退到noeviction策略。

allkeys-lru

  • 根据LRU算法删除键,不管数据有没有设置超时属性。

allkeys-random

  • 随机删除所有键。

volatile-random

  • 随机删除过期键。

volatile-ttl

  • 根据键值对象的ttl属性,删除最近将要过期数据,如果没有 回退 到noeviction策略。

allkeys-lfu

  • 从所有键中淘汰使用频率最少的键,从所有键中驱逐使用频率最少的键。

volatile-lfu

  • 从设置了过期时间的键中,通过LFU算法淘汰使用频率最少的键。

优先使用 allkeys-lru 策略。

  • 业务数据中有明显的冷热数据区分,建议使用 allkeys-lru 策略。

业务应用中的数据访问频率相差不大,没有明显的冷热数据区分,建议使用 allkeys-random 策略。

业务中有置顶的需求,比如置顶新闻、置顶视频,可以使用 volatile-lru 策略。

Redis内存满了

Redis 内存数据满了,以下是可能发生的情况。

写入操作失败:

如果 Redis 没有配置开启持久化(如 RDBAOF),并且达到了最大内存限制。

  • 默认行为是不接受写操作并返回错误。

这是为了保护数据的一致性,防止数据丢失。

内存淘汰策略:

Redis 提供了多种内存淘汰策略来处理内存数据满的情况。

当数据满时,根据配置的淘汰策略,Redis 可能会自动删除一些数据来腾出空间。

持久化策略:

如果 Redis 配置了持久化(如 RDBAOF)。

当内存数据满时,Redis 可以将数据持久化到磁盘,从而腾出内存空间。

这样可以保证数据的持久性,并继续接受写入操作。