redis淘汰策略
2020-04-06 本文已影响0人
吕艳凯
长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。
Redis在生产环境中,采用配置参数maxmemory 的方式来限制内存大小。当实际存储内存超出maxmemory 参数值时,开发者们可以通过这几种方法——Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。
当前Redis3.0版本支持的淘汰策略有6种:
不淘汰
- no-enviction:禁止驱逐数据 (故名思意,在内存不足,再次存数据时报错,不对已有数据处理)
随机淘汰
- allkeys-random:从数据集(server.db[i].dict)中选择任意数据淘汰。
过期时间淘汰
- volatile-ttl: 从设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,ttl值(剩余生存时间)越小越优先被淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个key。
LRU淘汰
- volatile-lru:从设置过期时间的数据集(server.db[i].expires)中挑选出最近最少使用的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。
- allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。
淘汰策略理解:
LRU淘汰:
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
其数据结构是哈希链表的结构,当访问数据时将被访问节点调整到链表头,淘汰时即可淘汰链表尾部,即是最近最少访问
TTL淘汰:
Redis 数据集数据结构中保存了键值对过期时间的表,即 redisDb.expires。TTL 数据淘汰机制中会先从过期时间的表中随机挑选几个键值对,取出其中 ttl 最大的键值对淘汰。
注意:TTL淘汰策略并不是面向所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对。