Redis的数据过期策略
![e6d012a66c369fd79dc42bfba31eba45.png](https://i-blog.csdnimg.cn/blog_migrate/ab26c1ff249dc4cd52836dfb9876f9d4.png)
Redis中的key按照其有效性可以分为如下三种:永久有效的数据,具有时效性的数据,已经过期的数据。我们可以通过ttl指令来查看key的时效性。示例如下:
127.0.0.1:6379> set name linxiaoliOK127.0.0.1:6379> setex age 60 20OK127.0.0.1:6379> ttl name(integer) -1127.0.0.1:6379> ttl age(integer) 33127.0.0.1:6379> ttl age(integer) 18127.0.0.1:6379> ttl age(integer) 3127.0.0.1:6379> ttl age(integer) -2127.0.0.1:6379> get age(nil)
ttl key:
返回正数:表明具有时效性的数据,返回的数值代表剩余有效时长。
返回-1:代表永久有效
返回-2:代表已经过期的数据
我们今天说的数据过期主要指的是这些已经过期的策略,在这里需要区分一个概念,数据过期不等于数据已经被redis干掉了,下面研究的主题就是对于这些过期的数据,redis是如何把他们“收割”(删除)的。redis的数据过期策略主要分为三种,定时删除,惰性删除,过期删除。下面分别进行描述。
![e6d012a66c369fd79dc42bfba31eba45.png](https://i-blog.csdnimg.cn/blog_migrate/ab26c1ff249dc4cd52836dfb9876f9d4.png)
01
定时删除
一、含义
在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,执行定时器任务对key进行删除。
二、优点
节约内存,到时间了就删除,快速释放掉不必要的内存占用。
三、缺点
CPU压力很大时,redis仍执行删除操作,会影响redis服务器的响应时间和指令吞吐。
四、总结
用处理器性能换取内存空间
![e59f39030507eb9203c52fa7c9e05250.gif](https://i-blog.csdnimg.cn/blog_migrate/011b75fa2472e5dfb7a484948d6e7948.gif)
02
惰性删除
一、含义
数据到达过期时间时,不做处理,当下次访问该数据时,如果未过期,返回数据,过期则删除。
二、优点
节约CPU性能,发现必须删除的数据时才做删除。
三、缺点
内存压力很大,出现长期占用内存的数据。
四、总结
用内存空间换取处理器性能。
![e59f39030507eb9203c52fa7c9e05250.gif](https://i-blog.csdnimg.cn/blog_migrate/011b75fa2472e5dfb7a484948d6e7948.gif)
03
定期删除
一、Redis的存储空间
redis有标号为0到15个数据库,每个数据库中有一个字典,存储了键地址编号的过期时间,比如expires[0]中通过key-value的形式(o2000 158383)存储了地址(key)的过期时间。
二、定期删除的过程
1、redis启动服务器初始化时,读取配置文件中server.hz的值,默认为10。server.hz的含义为每秒执行serverCron()函数的次数。
2、serverCron()调用databasesCron()函数,databasesCron()函数遍历16个数据库。之后调用activeExpireCycle()函数
3、activeExpireCycle()函数对每个0到15号数据库中过期字段中的键进行检测,检测时,随机挑选W个key,如果挑选的key过期了,则删除,如果删除的key数量大于W的1/4,则循环该过程,否则检查下一号数据库。
三、特点
定期删除相当于在定时删除和惰性删除做了折中处理,内存定期随机清理,即保证了Redis服务器处理数据的性能,又在CPU占用上有所优化。
![e59f39030507eb9203c52fa7c9e05250.gif](https://i-blog.csdnimg.cn/blog_migrate/011b75fa2472e5dfb7a484948d6e7948.gif)
Redis的数据淘汰策略
![e6d012a66c369fd79dc42bfba31eba45.png](https://i-blog.csdnimg.cn/blog_migrate/ab26c1ff249dc4cd52836dfb9876f9d4.png)
上面我们提到的数据删除策略指的是当redis中的key过期之后,Redis对过期数据的删除。而Redis的数据淘汰策略要解决的问题是当新的数据要进入Redis,而此时Redis的可用内存不足,Redis会执行数据淘汰策略,把内存中的一些数据清除,以便使新的数据能够进入。
![e6d012a66c369fd79dc42bfba31eba45.png](https://i-blog.csdnimg.cn/blog_migrate/ab26c1ff249dc4cd52836dfb9876f9d4.png)
影响数据淘汰策略的相关配置:引言中提到,当Redis使用的内存不足时会执行数据淘汰策略,那么配置文件肯定有一个表示内存的阈值,maxmemory,当实际内存超过maxmemory的值时,会触发数据淘汰策略;其次,还有一个参数maxmemory-samples用来表示每次需要淘汰数据的个数。接下来我们看具体的淘汰策略。
![5dccf1d2404334cb4b1442bd8e4059dd.gif](https://i-blog.csdnimg.cn/blog_migrate/a88045db718f8b17e513c13b9abc4421.gif)
检测易失数据
当某个key被设置了过期时间之后,就会把key以及它的过期时间存储到一个独立的字典中(server.db[i].expires),检测易失数据主要是在这个字典中寻找要淘汰的数据。有以下4种策略
lru:least recently used 最久没有使用
lfu:least frequently used 使用频率最小
1、volatile-lru:挑选最久没有使用的数据进行淘汰
2、volatile-lfu:挑选使用频率最少的数据进行淘汰
3、volatile-ttl:挑选马上要过期的数据进行淘汰
4、volatile-random:随机挑选数据进行淘汰
检测全库数据
检测全库数据就是在整个Redis的数据库中寻找要淘汰的数据,有如下3种策略:
1、allkeys-lru:挑选最久没有使用的数据进行淘汰
2、allkeys-lfu:挑选使用频率最少的数据进行淘汰
3、all-keys-random:随机挑选数据进行淘汰
(助记:全库数据可能存在永久有效的数据,所以没有ttl)
放弃数据淘汰策略
noeviction:禁止进行数据淘汰策略,此时会引发OOM
END