Redis的删除策略

过期策略

 数据删除策略的目标
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露 。

定时删除
    创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
    优点:节约内存,到时就删除,快速释放掉不必要的内存占用
    缺点: CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
    总结:用处理器性能换取存储空间(拿时间换空间)

Redis 默认会每秒进行十次过期扫描,过期扫描不会遍历过期字典中所有的 key,而是
采用了一种简单的贪心策略。
1、从过期字典中随机 20 个 key;
2、删除这 20 个 key 中已经过期的 key;
3、如果过期的 key 比率超过 1/4,那就重复步骤 1;
同时,为了保证过期扫描不会出现循环过度,导致线程卡死现象,算法还增加了扫描时间的上限,默认不会超过 25ms。
设想一个大型的 Redis 实例中所有的 key 在同一时间过期了,会出现怎样的结果?
毫无疑问,Redis 会持续扫描过期字典 (循环多次),直到过期字典中过期的 key 变得稀
疏,才会停止 (循环次数明显下降)。这就会导致线上读写请求出现明显的卡顿现象。导致这
种卡顿的另外一种原因是内存管理器需要频繁回收内存页,这也会产生一定的 CPU 消耗。
也许你会争辩说“扫描不是有 25ms 的时间上限了么,怎么会导致卡顿呢”?这里打个
比方,假如有 101 个客户端同时将请求发过来了,然后前 100 个请求的执行时间都是
25ms,那么第 101 个指令需要等待多久才能执行?2500ms,这个就是客户端的卡顿时间,
是由服务器不间断的小卡顿积少成多导致的。
所以业务开发人员一定要注意过期时间,如果有大批量的 key 过期,要给过期时间设置
一个随机范围,而不能全部在同一时间过期。
# 在目标过期时间上增加一天的随机时间
redis.expire_at(key, random.randint(86400) + expire_ts)
在一些活动系统中,因为活动是一期一会,下一期活动举办时,前面几期的很多数据都
可以丢弃了,所以需要给相关的活动数据设置一个过期时间,以减少不必要的 Redis 内存占
用。如果不加注意,你可能会将过期时间设置为活动结束时间再增加一个常量的冗余时间,
如果参与活动的人数太多,就会导致大量的 key 同时过期。
掌阅服务端在开发过程中就曾出现过多次因为大量 key 同时过期导致的卡顿报警现象,
通过将过期时间随机化总是能很好地解决了这个问题。

惰性删除
    数据到达过期时间,不做处理。等下次访问该数据时
    如果未过期,返回数据
    发现已过期,删除,返回不存在
    优点:节约CPU性能,发现必须删除的时候才删除
    缺点:内存压力很大,出现长期占用内存的数据
    总结:用存储空间换取处理器性能(拿时间换空间)

定期删除 

周期性轮询redis库中的时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度
    特点1: CPU性能占用设置有峰值,检测频度可自定义设置
    特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理
    总结:周期性抽查存储空间(随机抽查,重点抽查)

Redis启动服务器初始化时,读取配置server.hz的值,默认为10

每秒钟执行server.hz次serverCron()

activeExpireCycle()对每个expires[*]逐一进行检测,每次执行250ms/server.hz
对某个expires[*]检测时,随机挑选W个key检测
     如果key超时,删除key
     如果一轮中删除的key的数量>W*25%,循环该过程
     如果一轮中删除的key的数量≤W*25%,检查下一个expires[*], 0-15循环
     W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行
如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行

等看书老钱的Redis深度历险,在回来补充一下。

原文地址:https://www.cnblogs.com/dalianpai/p/12616952.html

时间: 2024-10-09 10:28:20

Redis的删除策略的相关文章

redis的超时删除策略

这个问题有三种可能的答案,它们分别代表了三种不同的删除策略: ·定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作. ·惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键:如果没有过期,就返回该键. ·定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键.至于要删除多少过期键,以及要检查多少个数据库,则由算法决定. 在这三种策略中,第一种和第三种为主动删除策略,

redis中关于过期键的删除策略

我们已经了解到了Redis是一种内存数据库,Redis中数据都是以key-value的形式存储在内存中,由Redis服务器来维护和管理这部分内存,内存是何足珍贵,不需要的数据或者是已经使用过的没用的数据是不会让它长久的存在于内存中的,毕竟我们还是要建设节约型社会的.所以我们可以通过给键设置生存时间或者过期时间来权衡有限的内存和不断增长的数据,设置过期时间的命令为:[expire key 时间长度(秒)]或者是[pexpire key 时间长度(毫秒)] 同时也可以通过[expireat key

Redis过期键删除策略

三种删除策略: 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键:如果没有过期,就返回该键. 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键.至于要删除多少过期键,以及要检查多少个数据库,则由算法决定. 在这三种策略中,第一种和第三种为主动删除策略,而第二种则为被动删除策略. 定时删除策略是对内存最友

redis学习笔记——Redis过期键的删除策略

Redis过期键的删除策略 对于过期键一般有三种删除策略 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作: 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键:如果没有过期,那就返回该键: 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键.至于删除多少过期键,以及要检查多少个数据库,则由算法决定. 下面我们来看看三种策略的优缺比较: 定时删除策略对内存是

redis 过期键删除策略

redis 的过期键的过期时间都保存在过期字典中,过期键的删除策略有3种 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即删除对键的删除操作. 惰性删除:放任键过期不管,但每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键.如果没有过期,就返回该键. 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键.至于删除多少过期键,以及检查多少数据库,有算法决定. 1 定时删除特点 优点:对内存友好,通过定时器可以保证过期键过期键

Redis过期键删除策略及回收策略

一.前言 Redis的所有键都可以设置过期策略,Redis的每个设置了过期时间的key都会被放在一个独立的字典中,用于遍历删除. 二.过期策略 1.先区分两个概念,被动删除与主动删除 1)被动删除:key再被操作时,Redis主动检查key是否过期,过期则删除:   优劣:对CPU友好,只有CPU在被操作时删除,不浪费CPU时间:对内存不友好,如果同时大量key过期,这些key在被使用前不会被删除造成资源浪费: 2)主动删除:Redis会定期随机扫描一批设置了过期时间的key并进行删除处理:当已

【redis】关于Redis数据过期策略

1.Redis中key的的过期时间 通过EXPIRE key seconds命令来设置数据的过期时间.返回1表明设置成功,返回0表明key不存在或者不能成功设置过期时间.在key上设置了过期时间后key将在指定的秒数后被自动删除.被指定了过期时间的key在Redis中被称为是不稳定的. 当key被DEL命令删除或者被SET.GETSET命令重置后与之关联的过期时间会被清除 127.0.0.1:6379> setex s 20 1 OK 127.0.0.1:6379> ttl s (intege

如履薄冰 —— Redis懒惰删除的巨大牺牲

前言 之前我们介绍了Redis懒惰删除的特性,它是使用异步线程对已经删除的节点进行延后内存回收.但是还不够深入,所以本节我们要对异步线程逻辑处理的细节进行分析,看看Antirez是如何实现异步线程处理的.异步线程在Redis内部有一个特别的名称,它就是BIO,全称是Background IO,意思是在背后默默干活的IO线程.不过内存回收本身并不是什么IO操作,只是CPU的计算消耗可能会比较大而已. 懒惰删除的最初实现不是异步线程 Antirez实现懒惰删除时,它并不是一开始就想到了异步线程.最初

Redis的删除机制、持久化 主从

Redis的使用分两点: 性能如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存.这样,后面的请求就去缓存中读取,使得请求能够迅速响应. 并发在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常.这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库 使用redis有什么缺点 分析:大家用redis这么久,这个问题是必须要了解的,基本上使用redis都会碰到一些问题,常见的也就几个.回答:主要是四个问