0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis的删除策略和内存淘汰机制介绍

麦辣鸡腿堡 来源:程序员库森 作者:程序员库森 2023-10-09 11:06 次阅读

Redis过期键的删除策略?

Redis的过期删除策略就是:惰性删除和定期删除两种策略配合使用。

惰性删除:Redis的惰性删除策略由db.c/expireIfNeeded函数实现,所有键读写命令执行之前都会调用 expireIfNeeded函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。

定期删除:由Redis.c/activeExpireCycle 函数实现,函数以一定的频率运行,每次运行时,都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。

附:删除key常见的三种处理方式。

1、定时删除

在设置某个key 的过期时间同时,我们创建一个定时器,让定时器在该过期时间到来时,立即执行对其进行删除的操作。

优点:定时删除对内存是最友好的,能够保存内存的key一旦过期就能立即从内存中删除。

缺点:对CPU最不友好,在过期键比较多的时候,删除过期键会占用一部分 CPU 时间,对服务器的响应时间和吞吐量造成影响。

2、惰性删除

设置该key 过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。

优点:对 CPU友好,我们只会在使用该键时才会进行过期检查,对于很多用不到的key不用浪费时间进行过期检查。

缺点:对内存不友好,如果一个键已经过期,但是一直没有使用,那么该键就会一直存在内存中,如果数据库中有很多这种使用不到的过期键,这些键便永远不会被删除,内存永远不会释放。从而造成内存泄漏。

3、定期删除

每隔一段时间,我们就对一些key进行检查,删除里面过期的key。

优点:可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除,也能有效释放过期键占用的内存。

缺点:难以确定删除操作执行的时长和频率。如果执行的太频繁,定期删除策略变得和定时删除策略一样,对CPU不友好。如果执行的太少,那又和惰性删除一样了,过期键占用的内存不会及时得到释放。另外最重要的是,在获取某个键时,如果某个键的过期时间已经到了,但是还没执行定期删除,那么就会返回这个键的值,这是业务不能忍受的错误。

Redis内存淘汰机制?

当现有内存大于 maxmemory 时,便会触发Redis主动淘汰内存方式,有如下几种淘汰方式:

Redis 4.0前提供 6种数据淘汰策略:

volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!

Redis 4.0后增加以下两种:

volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰(LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到)

allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72777
  • 函数
    +关注

    关注

    3

    文章

    3903

    浏览量

    61310
  • Redis
    +关注

    关注

    0

    文章

    363

    浏览量

    10496
收藏 人收藏

    评论

    相关推荐

    Redis内存淘汰机制

    redis淘汰策略
    发表于 09-27 07:55

    浅析Redis的过期机制

    Redis数据过期策略详解
    发表于 10-12 15:12

    Redis的发布订阅机制

    Redis之发布订阅机制
    发表于 06-11 13:21

    Redis常见面试题及答案

    redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存
    的头像 发表于 12-16 11:44 1951次阅读
    <b class='flag-5'>Redis</b>常见面试题及答案

    Redis持久化机制的实现原理和使用技巧

    Redis将数据存储在内存中,宕机或重启都会使内存数据全部丢失, Redis的持久化机制用来保证数据不会因为故障而丢失。
    的头像 发表于 09-13 16:42 828次阅读

    redis缓存满了怎么办?

    只有在 Redis 的运行内存达到了某个阀值,才会触发内存淘汰机制,这个阀值就是我们设置的最大运行内存
    发表于 08-21 10:42 171次阅读
    <b class='flag-5'>redis</b>缓存满了怎么办?

    Redis 的数据清理策略

    本文整理 Redis 的数据清理策略所有代码来自 Redis version :5.0, 不同版本的 Redis 策略可能有调整
    发表于 09-19 14:24 159次阅读
    <b class='flag-5'>Redis</b> 的数据清理<b class='flag-5'>策略</b>

    Redis键的生存时间、生存策略和毁灭策略

    先来回顾一下Redis键的生存时间,过期时间的设置;然后会讲到过期键删除策略;然后会聊其他功能对过期键的处理。 2.键的生存时间 键过期时间设置通过Expire命令或者Pexpire命令,客户端可以
    的头像 发表于 10-08 14:55 226次阅读
    <b class='flag-5'>Redis</b>键的生存时间、生存<b class='flag-5'>策略</b>和毁灭<b class='flag-5'>策略</b>

    Redis持久化机制介绍

    Redis持久化机制? 为了能够重用Redis数据,或者防止系统故障,我们需要将Redis中的数据写入到磁盘空间中,即持久化。Redis提供
    的头像 发表于 10-09 11:44 311次阅读
    <b class='flag-5'>Redis</b>持久化<b class='flag-5'>机制</b><b class='flag-5'>介绍</b>

    Redis 如何删除数据

    阎王的处理时间会变得很长,而且处理繁忙,Redis 就会出现卡顿现象。 Redis 有三种策略删除过期 Key 相关命令 expire key seconds # 过期时间为秒数, k
    的头像 发表于 10-09 16:01 272次阅读

    为什么使用top命令时,Redis还是占了很多内存

    实际上,这是因为,当数据删除后,Redis 释放的内存空间会由内存分配器管理,并不会立即返回给操作系统。所以,操作系统仍然会记录着给 Redis
    的头像 发表于 12-01 09:25 293次阅读
    为什么使用top命令时,<b class='flag-5'>Redis</b>还是占了很多<b class='flag-5'>内存</b>?

    redis机制原理

    Redis是一款高性能的开源内存数据库,用于存储和检索数据。在多线程或分布式环境中,需要实现并发控制来保证数据一致性和线程安全。Redis提供了一种简单而高效的锁机制,可以用来实现并发
    的头像 发表于 12-04 11:08 449次阅读

    redis淘汰策略

    Redis是一种基于内存的键值存储系统,为了充分利用内存Redis采用了一些淘汰策略来管理
    的头像 发表于 12-04 16:23 312次阅读

    redis的lru原理

    Redis是一种基于内存的键值数据库,它使用了LRU(Least Recently Used)算法来进行缓存的数据淘汰。LRU算法的核心思想是最近最少使用的数据将会在未来也不常用,因此应该优先
    的头像 发表于 12-05 09:56 315次阅读

    redis持久化机制优缺点

    Redis是一个基于内存的高性能键值存储系统,它提供了多种持久化机制来保证数据的可靠性。本文将详细介绍Redis的持久化
    的头像 发表于 12-05 10:03 269次阅读