当前位置: 首页 > 科技观察

一文带你了解Redis的删除策略_0

时间:2023-03-19 13:11:07 科技观察

Redis的删除策略过期数据在Redis中,所有设置了TTL的数据可能不会立即删除,Redis会把带有过期时间的key保存在内存中的一个Expires字典中。TTL命令执行时会返回其状态redis127.0.0.1:6379>TTLkey-2:Keyhasexpired,hasbeendeleted,andisundefined-1:permanentlyvalidXX:XX是key的剩余生命周期,在几秒钟内,过期数据真的被删除了吗?前面提到的数据删除策略,在存储key时,将key连同有效期一起存储到Expires字典中。什么时候删除?通常删除一个key,我们有以下三种处理方式:定时删除延迟删除周期删除1.定时删除创建一个定时器。当key设置了过期时间,过期时间到了,定时器任务会立即对key执行删除操作。优点:节省内存,该删掉可以快速释放不需要的内存空间缺点:CPU压力大,此时无论CPU负载多高,都会占用CPU,影响响应时间和吞吐量Redis服务器的总结:用处理器性能换内存空间(Timeforspace)2.懒删数据到达过期时间后,将不再处理。等待下次访问,如果还没有过期,如果返回的数据已经过期,则删除并返回不存在。优点:节省CPU性能,发现必须删除才删除缺点:内存压力大,数据长期占用内存空间总结:用内存空间换取CPU处理性能(空间换时间)3.定期删除定时删除和惰性删除太极端了。定期删除是更好的折衷方案。周期性轮询Redis库中的时间敏感数据,采用随机抽取策略,利用过期数据的比例来控制删除频率。特点:CPU占用率有峰值,检测频率可自定义。内存压力不是很大,长期占用内存的冷数据会不断清理。总结:定期抽查存储空间(随机抽查、重点抽查)定期删除。Redis服务器启动初始化时,会读取配置server.hz的值,默认为10。每秒执行server.hz次serverCorn()->databaseCorn()->activeExpireCycle()其中activeExpireCycle()逐个检测每个Expires[*],每次执行时间为250ms/server.hz检测一个Expires[*]时,随机选择几个key进行检测:如果key超时,删除key删除的个数keys>W*25%,然后重复该过程(重点抽查)。若一轮删除key的个数,则W的值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP的属性值四、删除策略比较驱逐算法1、当新数据进入检测数据进入Redis内存不足怎么办?Redis使用内存来存储数据,在执行每个命令之前,它会调用freeMemoryIfNeeded()检查内存是否足够。如果内存不满足新增数据的最低存储要求,Redis会临时删除部分数据,为当前指令清空存储空间。清洗数据的策略就变成了逐出算法(内存淘汰策略)。注意:逐出数据的过程并不是100%能够清理足够的可用内存空间,不成功会重复执行。当前所有数据尝试执行完后,如果不能满足内存清理要求,会出现错误信息。(错误)OOM命令在使用内存>'最大内存'2时不允许。驱逐算法配置最大可用内存maxmermory说明:占用物理内存的比例。默认值为0,表示无限制识别。生产中根据需要设定,一般在50%以上。每次选择要删除的maxmermroy-samples的数量。描述:在选择要删除的数据时,如果扫描整个数据库,会严重消耗性能,降低读写性能。因为采用随机获取数据的方式作为数据删除策略进行检测和删除。maxmermory-policy说明:达到最大内存后,删除选中的数据。3、淘汰算法如果Redis配置了maxmemory和maxmemory-policy策略,那么当Redis内存数据达到maxmemory时,会根据maxmemory-policy配置淘汰内存数据,避免OOM。根据maxmemory-policy的配置项,执行删除策略时分为两类:易失性数据(设置过期时间的数据)和永久性数据。Redis的默认值是volatile-lru。Detectvolatiledata(datasetserver.db[i].expriesthatwillexpire)volatile-lru:选择最近最少使用的数据进行淘汰volatile-lfu:选择最近最少使用的数据进行淘汰volatile-random:随机选择数据进行淘汰volatile-ttl:选择即将过期的数据,淘汰所有数据库数据(所有数据集server.db[i].dict)allkeys-lru:选择最近最少使用的数据,淘汰allkeys-lfu:选择具有最近使用次数最少并淘汰allkeys-random:随机选择淘汰数据,丢弃淘汰数据no-enviction:禁用数据淘汰,会导致OOM(OutOfMemroy)。Redis4.0默认策略LRU和LFU算法示例4.数据逐出策略配置根据数据监控信息使用info命令,查询缓存命中和未命中次数,根据业务需要配置逐出算法。本文转载自微信公众号“Java养殖场”,可通过以下二维码关注。转载本文请联系爪哇养殖场公众号。