内存回收机制
网上有很多关于这方面的东西,但是我发现有些文章讲的一点都不清楚,甚至会出现错的嵌套的情况。
简介:
Redis中内存回收有两个机制(重点!~~)
- 淘汰策略
- 内存溢出控制策略
淘汰策略
淘汰策略中又包含两个方法
- 惰性删除
- 主动删除
惰性删除
当数据的TTL时间在redis中过期,不会直接删除数据,等到下一次访问到该缓存的时候会去删除数据
主动删除
redis每隔指定的时间,会从所有数据中获取一批数据,挑选其过期的数据进行删除,如果过期的数据超过了一定的比例,会重新获取数据继续删除,直到比例小于指定的数值
内存溢出控制策略
当redis的内存达到maxmemory上限时会触发相应的溢出控制策略。执行命令时如果设置了maxmemory参数,都会尝试执行回收内存操作。
具体策略受maxmemory-policy参数控制,Redis支持下边几种策略:
- noeviction:不清理(默认)。写会报错,读正常;
- volatile-lru:从设置过期时间的键中,删除最近没用过的键;
- volatile-lfu:从设置过期时间的键中,删除使用频率最低的键;
- volatile-ttl:从设置过期时间的键中,删除最即将过期的键。
- volatile-random:从设置了过期时间的键中,随机删除;
- allkeys-lru:从所有的键中,删除最近没用过的键;
- allkeys-lfu:从所有的键中,删除使用频率最低的键;
- allkeys-random:从所有的键中,随机删除。
名词解释:
lru:最近最少使用算法(least recently used)
lfu:最不经常使用算法(least frequently used)
ttl:剩余存活时间(time to live)
volatile:代表设置了过期时间的键(有expire属性)
allkeys:代表所有键
参考文章: