redis缓存过期策略与内存淘汰机制

redis缓存过期策略与内存淘汰机制

    • redis缓存过期策略
    • redis内存淘汰机制
    • 开启内存淘汰机制
    • 如何选择淘汰策略

redis缓存过期策略

在设置了expire的key缓存过期了,但是服务器的内存还是被占用,不会被立即被释放,这是因为redis所基于的两种删除策略。

  1. (主动)定时删除
    定时随机的检查过期的KEY,如果过期则清理删除,释放被占用的内存。(每秒检查的次数在redis.cof中的hz配置)
  2. (被动)惰性删除
    当客户端请求一个已经过期的key的时候,那么reids会检查这个key是否过期,如果过期了,则删除,然后返回一个null。这种策略对CPU比较友好,不会有太多的损耗,但是内存占用会比较高。虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用。

redis内存淘汰机制

结合定期删除+惰性删除 Redis 实现了key的过期时间机制,但还是会有一些key会没有被定期删除掉,也没有被查询,就遗留在了内存中,当数据量大到一定程度后,会导致内存的堆积。这就涉及到了内存淘汰机制。

  • volatile-lru -> 在设置了expire过期的缓存中,清除最少使用的旧缓存,然后保存新的缓存
  • allkeys-lru -> 清除最近最少使用的数据,基于访问时间(推荐使用)
  • volatile-lfu -> 在设置了expire过期的缓存中,清除最近最少使用的数据,基于访问时间
  • allkeys-lfu ->清除最不经常使用的数据,基于访问次数
  • volatile-random -> 在设置了expire过期的缓存中,清除最不经常使用的数据,基于访问次数
  • allkeys-random ->随机删除一些缓存
  • volatile-ttl -> 在那些设置了expire过期时间的缓存中,根据过期时间的先后顺序进行删除
  • noeviction -> 旧缓存永不过期,新缓存设置不了,返回错误

备注:
LRU(Least Recently Used) : 淘汰最近最少使用的数据,基于访问时间;
LFU(Least Frequently Used): 淘汰最不经常使用的数据,基于访问次数;

开启内存淘汰机制

在redis.conf中

  • 配置 maxmemory ,设置Redis的最大内存空间,当内存已使用率到达,则开始清理缓存;
  • 配置maxmemory-policy noeviction,设置淘汰策略,默认为 noeviction;

如何选择淘汰策略

  1. allkeys-lru 和 allkeys-lfu 适用于存在热点数据的情况。明确有一部分数据访问频率较高,其余数据访问频率较低或者无法预测使用频率。
  2. allkeys-random 适用于所有数据访问概率大致相等。
  3. volatile-ttl 根据过期时间的先后顺序进行删除。
  4. volatile-lru ,volatile-lru 和volatile-random 适用于希望一些数据能被保存,则可以从设置了过期时间的数据中进行删除。
  5. 至于LRU与LFU的选择,则需要根据业务权衡到底是选择 淘汰最近最少使用(LRU) 还是选择最不经常使用(LFU)。

总的来说,无论是 LRU LFU TTL 还是Random 都是几近算法来实现的,在可靠性和性能上做了一定的平衡。还是应该在业务中主动删除没有价值的数据,或者更新某些key的过期时间等来提高Redis的性能和空间,不能过分依赖于淘汰策略。

你可能感兴趣的:(reids)