Redis 提供了几种内存淘汰策略来处理当可用内存不足时如何自动删除键以释放空间的问题。以下是 Redis 中常见的几种内存淘汰策略:
1. noeviction默认的
这是默认的策略。当内存使用达到上限并且客户端尝试执行会导致更多内存使用的命令(比如添加新数据)时,Redis 会返回错误。
实现方式:Redis 直接拒绝执行可能导致内存增加的命令。
例子:假设 Redis 已经达到内存上限,此时执行SET命令添加新的键值对,Redis 会返回错误并拒绝该操作。
2. volatile-lru
从设置了过期时间的键值对中,移除最近最少使用的键值对。
实现方式:Redis 会维护一个记录设置了过期时间的键的访问时间的队列,当需要淘汰数据时,从队列尾部移除元素。
例子:有多个设置了过期时间的键key1、key2和key3,其中key1最近访问最少,当内存不足时,key1会被淘汰。
3. volatile-ttl
移除即将过期的键值对,也就是剩余生存时间(TTL)最短的键值对。
实现方式:Redis 会遍历设置了过期时间的键,比较它们的 TTL,选择 TTL 最小的进行淘汰。
例子:键keyA的 TTL 为 10 秒,键keyB的 TTL 为 5 秒,当内存不足时,keyB会被优先淘汰。
4. volatile-random
在设置了过期时间的键值对中,随机移除某个键值对。
实现方式:通过随机算法从设置了过期时间的键集合中选择一个进行淘汰。
例子:在一组设置了过期时间的键中,随机选取一个如keyX进行淘汰。
5. allkeys-lru
从所有键值对中,移除最近最少使用的键值对。
实现方式:Redis 维护一个所有键的访问时间队列,淘汰时从队列尾部移除。
例子:包括设置了过期时间和未设置过期时间的多个键,如keyC最近访问最少,当内存不足时,keyC被淘汰。
6. allkeys-random
从所有键值对中,随机移除某个键值对。
实现方式:通过随机算法从所有键集合中选择一个进行淘汰。
例子:在所有键中,随机选择如keyY进行淘汰。
7:其他lua脚本等实现,非Redis内置的
领取专属 10元无门槛券
私享最新 技术干货