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-lfu | Redis4.0新增的策略。只对设置了expire过期时间的key生效,优先删除最不常用(least frequently used ,LFU) 的 key,直到有可用的内存,如果没有可删除的key并且内尺还是不够,则报错。 |
allkeys-lfu | Redis4.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算法保留。
相关文章:
- https://redis.io/topics/data-types
- https://redis.io/topics/data-types-intro
如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!
以上是关于Redis的内存淘汰策略的主要内容,如果未能解决你的问题,请参考以下文章
4.redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?