• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

redis高级进阶7—-删除策略

互联网 diligentman 1周前 (11-22) 5次浏览

##1.什么是过期数据?
Redis是一种内存级数据库,所有的数据均被存放于内存中,内存中的数据可以通过TTL指令来获取其状态
1>大于0的某个值:表示该数据还剩余多少秒过期。
2>-1:表示该数据永久有效。
3>-2:表示已经过期的数据或被删除的数据
Redis中过期数据:是指设置了TTL时效的数据,到达了被删除的条件,但是又没有马上被删除的数据。
理解:通常redis中的数据TTL到了之后,都没有马上被删除,而是根据redis设置的策略去删除的。
##2.数据删除策略
1>定时删除
创建一个定时器,当key设置了过期时间,且到达过期时间时,由定时器任务去执行对key的删除操作
优点:到达过期时间就可以删除key,即释放了内存。
缺点:由于是定时操作,时不时去检测一下key的TTL,这样就增加了CPU的负载,影响redis服务器响应时间与吞吐量
总结:牺牲处理器性能换取存储空间,即拿时间换空间。
2>惰性删除
数据到达了过期时间,先不做删除处理;等下次访问该数据时,先判断下该数据是否过期,未过期,则返回数据;已过期,则返回不存在,同时去删除该数据。即每次访问数据时都要先判断下该数据是否过期。
优点:节约了CPU性能,只有发现某个KEY到了删除的时候才删除
缺点:很明显,可能会存在大量的没有被访问的过期数据,这些数据一直在内存中。
总结:拿存储空间换取处CPU理器性能。
3>定期删除
很明显,如上两种方案都有弊端,定期删除是如上两种方案的一个折中方案。
如下描述下定期删除的思想及流程
1>Redis启动服务器初始化时,会读取配置文件中.hz这个值,默认是10。
2>.hz这个值表示:redis服务器每秒钟执行.hz次serverCron(),即服务器每秒钟执行10次定时器。
3>serverCron()会对redis的库定时器databasesCron()进行轮询操作。
4>databasesCron()定时器执行具体的方法activeExpireCycle()。
5>activeExpireCycle()会对每个expires[n]进行扫描,每次执行250ms/server.hz次。该方法就是具体的扫描库expires[n],删除该库中过期的数据,注意:不是对该库中每个key进行轮询操作,否则与定时删除策略没区别。
6>activeExpireCycle()扫描expires[n]的规则:扫描expires[n]时,随机挑选该库中W个key进行检测,W中的key如果超时,则删除该key。扫描完毕后,统计已删除的key的个数,如果大于w/4,则继续扫描该库,依然从该库中随机挑选W个key,继续删除过期的,继续判断已删除的key的个数,直到小于w/4,则扫描下一个库expires[n+1]。
w的取值是配置文件中的active_expire_cycle_lookups_per_loop的属性值。
4>逐出删除
当新数据进入redis时,内存不足怎么办?
redis使用内存存储数据,在执行每一个命令前,都会调用freeMemorylfNeeded()检测内存是否充足,如果内存不满足新加入数据的最低存储要求,则redis会临时删除一些数据清理存储空间,清理数据的策略称之为逐出算法
注意:逐出数据的过程不能100%的清理出足够可使用的内存,如果不成功,则会多次执行逐出,当尝试对所有可能删除的数据清理后,依然达不到内存清理的要求时,则会爆出 内存越界 错误。
影响数据逐出的相关配置
1>最大可使用内存
maxmemory:占用物理内存比例,默认值是0,表示不受限制。生产环境通常设置50%以上。
2>每次挑选待删除数据的个数
maxmemory-samples:默认值是5。
3>删除策略
maxmemory-policy:删除数据时采用的策略。
删除策略包含如下几种:
1.检查易丢失数据,即可能会失效的数据,方法有如下几种
1.1 LRU:淘汰最近最少使用的数据,即淘汰最长时间没有被使用的数据。
举例:按照数据的添加或者访问时间倒序将数据加入一个链表中,发生淘汰策略时,淘汰列表中尾部的数据。
1.2 LFU:淘汰不经常使用的数据,即按照使用频率来淘汰。
举例:数据存放于链表中,按照访问次数排序,发生淘汰策略时,淘汰列表中访问评率较低的数据。
1.3 TTL:淘汰即将过期的数据。
1.4 random:随机淘汰数据。
总结:Redis调优时,主要是针对这一节的删除策略进行!


喜欢 (0)