redis數據淘汰機制
Redis作为当前最常用的开源内存数据库,性能十分高,据官方数据表示Redis读的速度是110000次/s,写的速度是81000次/s 。而且Redis支持数据持久化,众多数据结构存储,master-slave模式数据备份等多种功能。
但是长期将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。
对此,Redis在生产环境中,采用配置参数maxmemory 的方式来限制内存大小。当实际存储内存超出maxmemory 参数值时,开发者们可以通过这几种方法——Redis内存淘汰策略,来决定如何腾出新空间继续支持读写工作。
那么Redis内存淘汰策略是如何工作的呢?
首先,客户端会发起需要更多内存的申请;
其次,Redis检查内存使用情况,如果实际使用内存已经超出maxmemory,Redis就会根据用户配置的淘汰策略选出无用的key,确认选中数据没有问题,成功执行淘汰任务。
淘汰策略六種
-
volatile-lru
:一部份不重要得到key設置成過期時間數據集expire,刪除時從中找最近最少使用的數據淘汰;(數據一部份訪問頻率高,一部份低時選它)
-
volatile-ttl
:從設置過期時間的數據集中挑選快要過期數數據淘汰,過期時間(ttl值)較短的key越快回收;(開發者需通過設置不同ttl來判斷數據過期的先後順序,選它)
-
volatile-random
:從設置了過期時間的數據集中任意選擇數據淘汰;(一部份數據被長期保存,一部份可以淘汰)
-
allkeys-lru
:從所有數據集中選最近最少使用的數據淘汰;(設置過期時間會消耗額外內存,為避免浪費,選它)
-
allkeys-random
:從所有數據集中選擇任意數據淘汰;(所有數據訪問頻率大致相等,選它)
-
noeviction
(默認策略):禁止驱逐数据,也就是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。
淘汰策略三種
主要分為LRU淘汰、TTL淘汰、隨機淘汰三種機制
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”;
TTL 数据淘汰机制中会先从过期时间的表中随机挑选几个键值对,越早過期的鍵先淘汰;
獲取及修改淘汰策略:
获取当前内存淘汰策略:
127.0.0.1:6379> config get maxmemory-policy
通过命令修改淘汰策略:
127.0.0.1:6379> config set maxmemory-policy allkeys-lru