今天小编给大家分享的是关于复述,数据淘汰策略详解,很多人都不太了解,今天小编为了让大家更加了解复述,数据淘汰策略,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
本文讲的是当复述,设定了最大内存之后,缓存中的数据集大小超过了一定比例,实施的淘汰策略,不是删除过期键的策略,虽然两者非常相似。
在复述中,允许用户设置最大使用内存大小通过配置复述。设计中的maxmemory这个值来开启内存淘汰功能,在内存限定的情况下是很有用的。
设置最大内存大小可以保证复述对外提供稳健服务。
推荐:复述,教程
复述,内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略.redis提供6种数据淘汰策略通过maxmemory-policy设置策略:
volatile-lru:从已设置过期时间的数据集(server.db[我].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[我].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[我].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[我].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[我]。dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
复述,确定驱逐某个键值对后,会删除这个数据并将这个数据变更消息发布到本地(AOF持久化)和从机(主从连接)
<强> LRU数据淘汰机制强>
在服务器配置中保存了LRU计数器服务器。lrulock,会定时(复述,定时程序serverCorn())更新,服务器。lrulock的值是根据服务器。unixtime计算出来的。
另外,从结构redisObject中可以发现,每一个复述对象都会设置相应的lru。可以想象的是,每一次访问数据的时候,会更新redisObject。lru .
lru数据淘汰机制是这样的:在数据集中随机挑选几个键值对,取出其中lru最大的键值对淘汰,所以,你会发现,复述,并不是保证取得所有数据集中最近最少使用(lru)的键值对,而只是随机挑选的几个键值对中的。
//redisServer保存了lru计数器 struct redisServer { … 无符号lruclock: 22;/*时钟每分钟递增,LRU */? };//每一个复述对象都保存了lru #定义REDIS_LRU_CLOCK_MAX ((1 & lt; & lt; 21) 1)/*最大的价值obj→lru */#定义REDIS_LRU_CLOCK_RESOLUTION 10 *//* LRU时钟分辨率在秒 typedef struct redisObject {//刚刚好32位//对象的类型,字符串/列表/集合/哈希表 无符号类型:4;//未使用的两个位 无符号notused: 2;/* *///编码的方式,复述,为了节省空间,提供多种方式来保存一个数据//譬如:“123456789”会被存储为整数123456789 无符号编码:4; 无符号lru: 22;/* lru时间(相对于server.lruclock) *///引用数 int refcount;//数据指针 void * ptr; }robj;//复述,定时执行程序。联想:linux cron int serverCron (struct aeEventLoop * eventLoop,长长的id, void * clientData) { ……/*我们刚刚22位/对象LRU的信息。 *我们使用一个(最终包装)LRU与10秒分辨率时钟。 * 2 ^ 10秒分辨率的22位或多或少是1.5年。 * *请注意,即使这将包装后1.5年变# 39;不是一个问题, *一切仍将工作,但仅仅是一些对象会显得更年轻 *复述。但要实现这一目标给定对象不应该碰它们 *为1.5年。 * *请注意,您可以更改分辨率改变 * REDIS_LRU_CLOCK_RESOLUTION定义。 */updateLRUClock (); …… }//更新服务器的lru计数器 空白updateLRUClock (void) { 服务器。lruclock=(server.unixtime/REDIS_LRU_CLOCK_RESOLUTION), REDIS_LRU_CLOCK_MAX; }
<>强TTL数据淘汰机制强>
复述,数据集数据结构中保存了键值对过期时间的表,即redisDb。到期。和LRU数据淘汰机制类似,TTL数据淘汰机制是这样的:从过期时间的表中随机挑选几个键值对,取出其中TTL最大的键值对淘汰。同样你会发现,复述,并不是保证取得所有过期时间的表中最快过期的键值对,而只是随机挑选的几个键值对中的。
总结
复述,每服务客户端执行一个命令的时候,会检测使用的内存是否超额。如果超额,即进行数据淘汰。