当前位置:首页 > 缓存 > 正文内容

redis中过期数据的删除以及对性能的影响

phpmianshi4年前 (2017-05-25)缓存157

过期数据的删除对Redis性能影响

当我们对某些 key 设置了 expire 时,数据到了时间会自动删除。如果一个键过期了,它会在什么时候删除呢?

下面介绍三种删除策略:

定时删除

    在这是键的过期时间的同时,创建一个定时器 Timer,让定时器在键过期时间来临时立即执行对过期键的删除。

惰性删除

    键过期后不管,每次读取该键时,判断该键是否过期,如果过期删除该键返回空。

定期删除

    每隔一段时间对数据库中的过期键进行一次检查。

分析总结

定时删除对内存友好,对 CPU 不友好。如果过期删除的键比较多的时候,删除键这一行为会占用相当一部分 CPU 性能,会对 Redis 的吞吐量造成一定影响。

惰性删除对 CPU 友好,内存不友好。如果很多键过期了,但在将来很长一段时间内没有很多客户端访问该键导致过期键不会被删除,占用大量内存空间。

定期删除是定时删除和惰性删除的一种折中。每隔一段时间执行一次删除过期键的操作,并且限制删除操作执行的时长和频率。具体的操作如下:

  • Redis 会将每一个设置了 expire 的键存储在一个独立的字典中,以后会定时遍历这个字典来删除过期的 key。

  • Redis 默认每秒进行十次(每隔100ms)过期扫描,过期扫描不会扫描所有过期字典中的 key,而是采用了一种简单的贪心策略。从过期字典中随机选择 20 个 key;删除这 20 个 key 中已过期的 key;如果过期 key 比例超过 1/4,那就重复步骤 1。

  • 同时,为了保证在过期扫描期间不会出现过度循环,导致线程卡死,算法还增加了扫描时间上限,默认不会超过 25ms。


问题是:定期删除可能会导致很多过期的key到了时间没有被删除掉,所以除了定时遍历外,它还会使用惰性删除策略来删除过期的 key。


实际上还是有问题的,如果定期删除漏掉了很多key,然后也没有及时去查,也就没有走惰性删除,此时还是会有大量的过期key存在内存里,导致redis内存耗尽,这时候如何处理呢?


答案是:走内存淘汰机制


五种淘汰策略

参数maxmemory_policy控制:

noeviction: 如果缓存数据超过了maxmemory限定值,并且客户端正在执行的命令会导致内存分配,则向客户端返回错误响应.

allkeys-lru: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与LRU算法淘汰.

volatile-lru: 只有超时属性的缓存数据才参与LRU算法淘汰.

allkeys-random: 所有的缓存数据(包括没有超时属性的和具有超时属性的)都参与淘汰, 但是采用随机淘汰,而不是用LRU算法进行淘汰.

volatile-random: 只有超时属性的缓存数据才参与淘汰,但是采用随机淘汰,而不是用LRU算法进行淘汰.

volatile-ttl: 只有超时属性的缓存数据才参与淘汰. 根据缓存数据的超时TTL进行淘汰,而不是用LRU算法进行淘汰.


因为volatile-lru, volatile-random和volatile-ttl这三个淘汰策略使用的不是全量的缓存数据,有可能无法淘汰出足够的内存空间.

因为将缓存数据设置超时属性占用更多的内存, 因此,当内存压力比较大的时候,需要慎重考虑设置超时属性.




版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

Redis中主从复制的原理详解

主从复制的方式命令slaveof。优点:无需重启。缺点:不便于管理 // 命令行使用 slaveof ip port // 使用命令后自身...

Redis Hyperloglog实现UV数据统计

Redis  自2.8.9起可用时间复杂度: O(1)添加每个元素。HyperLogLog 是一种概率数据结构,用来估算数据的基数。数据集可以是网站访客的 IP 地址,E-mail 邮箱或者...

redis中持久化机制对比

RDB filesnapshotting1.按特定的时间间隔来为数据集做快照2.每次持久化都是将全量数据写入,而不是增量3.每次写入时先将数据写入临时文件再替换掉原来的rdb文件优点:1.RDB是一个...

Redis和memache缓存的区别

1.数据类型Redis数据类型丰富,支持set list hash等类型memcache支持简单数据类型,需要客户端自己处理复杂对象2.持久性redis支持数据落地持久化存储,并不是所有的数据都一直存...

redis的bigkey问题如何解决

寻找big key有如下几种方法redis-cli自带--bigkeys,例如:redis-cli -h -a --bigkeys获取生产Redis的rdb文件,通过rdbtools分析rdb生成cs...

redis中压缩列表ziplist的使用

redis中压缩列表ziplist的使用

压缩列表压缩列表 ziplist 是为 Redis 节约内存而开发的,是列表键和字典键的底层实现之一。当元素个数较少时,Redis 用 zi...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。