redis内存回收——过期、淘汰

这篇具有很好参考价值的文章主要介绍了redis内存回收——过期、淘汰。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

redis内存设置过大时会增加同步等操作的复杂度

DB结构

/* Redis database representation. There are multiple databases identified
 * by integers from 0 (the default database) up to the max configured
 * database. The database number is the 'id' field in the structure. */
typedef struct redisDb {
    dict *dict;                 /* keyspace,存储所有key,value */
    dict *expires;              /* 存储设置过期时间的key,ttl */
    dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP)*/
    dict *blocking_keys_unblock_on_nokey;   /* Keys with clients waiting for
                                             * data, and should be unblocked if key is deleted (XREADEDGROUP).
                                             * This is a subset of blocking_keys*/
    dict *ready_keys;           /* Blocked keys that received a PUSH */
    dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */
    int id;                     /* Database ID */
    long long avg_ttl;          /* Average TTL, just for stats */
    unsigned long expires_cursor; /* Cursor of the active expire cycle. */
    list *defrag_later;         /* List of key names to attempt to defrag one by one, gradually. */
    clusterSlotToKeyMapping *slots_to_keys; /* Array of slots to keys. Only used in cluster mode (db 0). */
} redisDb;

redis内存回收——过期、淘汰

删除策略

惰性删除

访问时,检查过期时间,删除
已过期但不访问的数据,永远存在,占据内存

周期删除

定期抽样部分key检查过期时间,删除

SLOW

redis初始化时设置定期任务

  • 默认每秒执行10次,每个周期100ms
  • 执行清理耗时不超过一次执行周期的25%
  • 遍历所有db(每个db类似于一个数组)的所有bucket(数组下标index),抽取20个key检查(记录本次遍历位置,下次定时任务从该位置继续)
  • 如果没有达到时间上限(25ms)&过期key比例大于10%,再进行一次抽样,否则结束
FAST

redis每个事件执行之前

  • 两次fast间隔大于2ms,执行清理不超过1ms
  • 遍历所有db(每个db类似于一个数组)的所有bucket(数组下标index),抽取20个key检查(记录本次遍历位置,下次定时任务从该位置继续)
  • 如果没有达到时间上限(1ms)&过期key比例大于10%,再进行一次抽样,否则结束

淘汰策略

redis主动删除key,释放内存

  • noeviction:只返回错误,不会删除任何key。该策略是Redis的默认淘汰策略,一般不会选用。

  • volatile-ttl:将设置了过期时间的key中即将过期(剩余存活时间最短)的key删除掉。

  • volatile-random:在设置了过期时间的key中,随机删除某个key。

  • allkeys-random:从所有key中随机删除某个key。

  • volatile-lru:基于LRU算法,从设置了过期时间的key中,删除掉最近最少使用的key。

  • allkeys-lru:基于LRU算法,从所有key中,删除掉最近最少使用的key。该策略是最常使用的策略。

  • volatile-lfu:基于LFU算法,从设置了过期时间的key中,删除掉最不经常使用(使用次数最少)的key。

  • allkeys-lfu:基于LFU算法,从所有key中,删除掉最不经常使用(使用次数最少)的key。

struct redisObject {
    unsigned type:4;//对象类型
    unsigned encoding:4;//编码方式
    unsigned lru:LRU_BITS; /* LRU time 最近一次访问时间 秒为单位
                            * LFU data 低八位记录逻辑访问次数
                            			高16位记录最近一次访问时间 分钟为单位). */
    int refcount;//对象引用计数器
    void *ptr;//指针,指向不同数据类型的数据,真实数据
};

redis内存回收——过期、淘汰

淘汰过程redis内存回收——过期、淘汰文章来源地址https://www.toymoban.com/news/detail-410249.html

  • 将设置ttl的key抽取部分存入pool
  • 将pool中所有key按照值升序排列
  • 从pool中按序删除
  • 避免排序,效率更高

到了这里,关于redis内存回收——过期、淘汰的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (高阶) Redis 7 第19讲 缓存过期淘汰策略 大厂篇

    1. 生产上,redis内存设置的多少 2. 如何配置、修改Redis 内存大小 3. 如果内存满了,如何处理 4. Redis 清理内存的方式有哪些?定期删除和惰性删除了解吗 5. Redis 缓存淘汰策略有哪些?分别是什么?你用哪个 6. Redis 的LRU了解过吗?请手写LRU 7. LRU和LFU 算法的区别是什么  Redis 默

    2024年02月07日
    浏览(33)
  • Redis 从入门到精通【进阶篇】之过期和淘汰策略详解

    当涉及Redis中的过期和淘汰策略时,有很多值得探讨的内容。以下是一个关于Redis过期和淘汰策略的详细解释,希望对你有所帮助。 Redis中的过期策略是指在Redis中设置的键值对的生存时间过期后,系统如何处理这些过期的键值对。Redis采用了两种主要的过期策略:定期删除和

    2024年02月16日
    浏览(36)
  • Redis通信协议、过期回收策略

    Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): 客户端(client)向服务端(server)发送一条命令 服务端解析并执行命令,返回响应结果给客户端 因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。 而在Redis中采

    2024年02月08日
    浏览(27)
  • Redis追本溯源(三)内核:线程模型、网络IO模型、过期策略与淘汰机制、持久化

    Redis在处理客户端请求时,通常使用单线程来进行读取、解析、执行和响应返回,因此被称为单线程应用。在4.0版本之前,这一描述是准确的。 单线程: 读取、解析、执行和响应返回。 从4.0版本开始,Redis开始使用后台线程来处理一些耗时的操作,如清理脏数据、释放超时连

    2024年02月15日
    浏览(36)
  • redis内存淘汰机制

    给redis设置过期时间有啥用? 防止out of memory 有些业务场景只需要数据在一定时间内存在 验证码 用户token之类的 redis如何判断数据是否过期的? 通过一个过期字典,可以看作hash表,字典的键指向redis数据库中的key,值是long类型的整数(时间戳) redis删除策略? 惰性删除 定期删除 定期对

    2024年01月17日
    浏览(33)
  • Redis的内存淘汰策略

    Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。 noeviction :当内存不足以容纳新写入数据时,新写入操作会报错。 allkeys-lru :当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用

    2024年02月10日
    浏览(27)
  • Redis 内存淘汰策略详解

    Redis 是一款高性能的非关系型数据库,它支持多种数据结构,如字符串、哈希、列表、集合、有序集合和 HyperLogLog。Redis 可以用于缓存、消息队列、应用程序中的数据结构存储等场景,它的优点是响应速度快、支持丰富的数据结构和扩展性好。 Redis 将所有数据都存储在内存中

    2024年02月10日
    浏览(41)
  • Redis-内存淘汰算法

    32位的操作系统默认3G 谁现在用32位啊?我们说64位的 一般来讲是不设上限的 但是我们也可以主动配置maxmemory, maxmemory支持各单位: maxmemory 1024 (默认字节) maxmemory 1024KB maxmemory 1024MB maxmemory 1204GB 当Redis存储超过这个配置值,则触发Redis内存淘汰。 实际上,每次进行读写的时候,都

    2024年02月12日
    浏览(27)
  • 【Redis】Redis 内存回收

    Redis 中数据过期策略采用定期删除+惰性删除策略结合起来,以及采用淘汰策略来兜底。 定期删除策略 :Redis 启用一个定时器定时监视所有的 key,判断key是否过期,过期的话就删除。这种策略可以保证过期的 key 最终都会被删除,但是也存在严重的缺点:每次都遍历内存中所

    2024年02月07日
    浏览(30)
  • Redis的内存淘汰策略有哪些?Redis的发布订阅功能是如何实现的?如何监控Redis的性能?Redis的并发竞争问题如何解决?

    Redis的内存淘汰策略有以下几种: noeviction :不进行任何内存淘汰,当内存用完时,新的写操作将会返回错误。 volatile-lru :在所有已设置过期时间的键中,使用近似LRU算法删除最长时间未使用的键,直到腾出足够的内存空间为止。 volatile-ttl :在所有已设置过期时间的键中,

    2024年02月12日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包