Redis缓存淘汰机制
长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。此时如何淘汰无用数据释放空间,存储新数据就变得尤为重要了。
对此,Redis在生产环境中,采用配置参数maxmemory
的方式来限制内存大小。当实际存储内存超出maxmemory
参数值时,开发者们可以通过这几种方法——Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。
那么Redis内存淘汰策略是如何工作的呢?
-
首先,客户端会发起需要更多内存的申请;
-
其次,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key;
-
最后,确认选中数据没有问题,成功执行淘汰任务。
支持的淘汰策略有6种
-
volatile-lru
:从设置过期时间的数据集(server.db[i].expires)中挑选出最近最少使用的数据淘汰。没有设置过期时间的key不会被淘汰,这样就可以在增加内存空间的同时保证需要持久化的数据不会丢失。 -
volatile-ttl
:除了淘汰机制采用LRU,策略基本上与volatile-lru相似,从设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰,ttl(剩余生存时间)值越大越优先被淘汰。 -
volatile-random
:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。当内存达到限制无法写入非过期时间的数据集时,可以通过该淘汰策略在主键空间中随机移除某个key。 -
allkeys-lru
:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰,该策略要淘汰的key面向的是全体key集合,而非过期的key集合。 -
allkeys-random
:从数据集(server.db[i].dict)中选择任意数据淘汰。 -
no-enviction
:禁止驱逐数据,也就是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失,这也是系统默认的一种淘汰策略。
Redis过期时间
- 定期删除
Redis默认每个100ms随机抽取一些设置过期时间的Key
- 惰性删除
与Memcached一样,查Key的时候判断是否过期