redis 内存淘汰策略
将 Redis 用作缓存时, 如果内存空间用满, 就会根据配置的最大内存策略返回错误或者自动驱逐老的数据。
maxmemory 配置指令
maxmemory 用于指定 Redis 能使用的最大内存。既可以在 redis.conf
文件中设置, 也可以在运行过程中通过 CONFIG SET 命令动态修改。
例如, 要设置 100MB 的内存限制, 可以在 redis.conf
文件中这样配置
1 | maxmemory 100mb |
将 maxmemory
设置为 0, 则表示不进行内存限制。当然, 对32位系统来说有一个隐性的限制条件: 最多 3GB 内存.
内存淘汰策略(maxmemory-policy)
- noeviction
不删除,达到最大内存,如果继续写(新增)数据,直接返回错误信息。DEL还是可以正常执行。
- allkeys-lru
所有key范围,优先删除最近最少使用(LRU)
- volatile-lru
只限于设置了expire的部分,优先删除最近最少使用(LRU)的key
- allkeys-random
所有key范围,随机删除一部分key
- volatile-random
只限于设置了expire的部分key,随机删除
- volatile-ttl
只限于设置了expire的部门;优先删除剩余时间短的key
如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。
内存淘汰的实现
淘汰过程:
- 客户端执行命令,导致redis中的数据增加,内存增加
- Redis检查内存使用量,超过maxmemory限制,根据策略清除key
近似LRU算法
为了节约内存,采用了抽取少量的key样本,然后删除其中访问时间最久的key。
在 Redis 的 LRU 算法中, 可以通过设置样本(sample)的数量来调优算法精度。
1 | maxmemory-samples <count> |