Redis的内存淘汰策略

Posted 刘Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis的内存淘汰策略相关的知识,希望对你有一定的参考价值。

简单介绍了Redis的内存淘汰策略。

Redis的maxmemory参数用于指定 Redis 能使用的最大内存,既可以在 redis.conf 配置文件中设置(单位Byte),也可以在运行过程中通过 CONFIG SET 命令动态修改。

maxmemory 设置为0,或者没有设置该参数,则表示不进行内存限制。但对32位系统来说有一个隐性的限制条件是最多使用 3GB 内存,64位系统则无限制。

当达到内存限制时(maxmemory),Redis 将尝试根据选择的淘汰策略删除一部分key。淘汰可以在redis.conf中配置maxmemory-policy属性,或者通过config set maxmemory-policy命令动态的配置。

Redis的默认策略为noeviction,支持的策略有8种

策略描述
volatile-lru只对设置了expire过期时间的key生效,优先删除最近最少使用(least recently used ,LRU) 的 key,直到有可用的内存,如果没有可删除的key并且内存还是不够,则报错。
allkeys-lru所有key通用;优先删除最近最少使用(least recently used ,LRU)的key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
volatile-lfuRedis4.0新增的策略。只对设置了expire过期时间的key生效,优先删除最不常用(least frequently used ,LFU) 的 key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
allkeys-lfuRedis4.0新增的策略。所有key通用;优先删除最不常用(least frequently used , LFU)的key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
volatile-random只对设置了expire过期时间的key生效,随机删除一部分key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
allkeys-random所有key通用,随机删除一部分key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
volatile-ttl只对设置了expire过期时间的key生效,优先删除剩余时间(time to live,TTL) 最短的key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。
noeviction默认策略,不删除任何key,在进行写操作时返回错误信息

LRU (Least recently used) ,最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高,也就不会被淘汰。也就是优先淘汰最长时间未被使用的数据,这个主要针对的是访问时间,可能存在某些key值在前一段时间访问很频繁,但是最近没被访问,从而被 LRU 算法删除。Java中可以通过继承LinkedHashMap并重写removeEldestEntry方法可以快速实现一个LUR Cache,此前我们学习过了:LinkedHashMap源码深度解析与LRU缓存实现

很多的书籍和博客都将LRU翻译为“最近最少使用”,但这样的翻译就有迷惑性,因为实际上LRU算法和使用频率没有任何关系,而是和最近访问时间有关系,它仅仅是淘汰最久未被访问的缓存而已,因此LRU应该翻译为“最久使用”更为贴切。

LFU (Least frequently used) ,最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小,就会被淘汰。也就是优先淘汰一定时期内被访问次数最少的数据,这个主要针对的是访问频率,可能存在某些 key 值在前一段时间访问很频繁,但是最近以及以后的时间访问比较少,但是因为属于同一个时间段而被 LFU算法保留。

相关文章:

  1. https://redis.io/topics/data-types
  2. https://redis.io/topics/data-types-intro

如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

以上是关于Redis的内存淘汰策略的主要内容,如果未能解决你的问题,请参考以下文章

Redis过期键删除策略和内存淘汰策略

聊聊 Redis 内存淘汰策略

4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

redis 的过期策略都有哪些?内存淘汰机制都有哪些?

redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?

Redis淘汰策略