大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说redis 过期删除策略和内存淘汰机制是什么_redis缓存过期策略,希望您对编程的造诣更进一步.
Redis 设置过期时间
- EXPIRE <key> <ttl> ——将键 key 的生存时间设置为 ttl 秒。
- PEXPIRE <key> <ttl>——将键 key 的生存时间设置为 ttl 毫秒。
- EXPIREAT <key> <timestamp>——将键 key 的过期时间设置为 timestamp 所指定的秒数时间戳。
- PEXPIREAT <key> <timestamp>——将键 key 的过期时间设置为 timestamp 所指定的毫秒数时间戳。
Redis 计算并返回剩余时间
Redis 过期字典
- 过期字典的键是一个指针,这个指针指向键空间的某个键对象(也即是某个数据库键)。
- 过期字典的值是一个 long long 类型的整数,这个整数保存了键所指向的数据库键的过期时间——一个毫秒精度的 UNIX 时间戳。
Redis 过期键的判定
- 检查给定键是否存在于过期字典,如果存在,那么取得键的过期时间。
- 检查当前 UNIX 时间戳是否大于键的过期时间,如果是的话,那么键已经过期,否则的话,键未过期。
三种过期键删除策略
定时删除
优点:
- 对内存是最友好的。通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用地内存。
缺点:
- 对 CPU 时间是最不友好的。在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分 CPU 时间,在内存不紧张但是 CPU 时间非常紧张的情况下,将 CPU 时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。
- 创建一个定时器需要用到 Redis 服务器中的时间事件,而当前时间事件的实现方式是无序链表,查找一个事件的时间复杂度为 O(N),这并不能高效地处理大量时间事件。
惰性删除
优点:
- 对 CPU 时间来说是最友好的。程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何 CPU 时间。
缺点:
- 对内存是最不友好的。如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行 FLUSHDB),我们甚至可以将这种情况看作是一种内存泄露,无用的垃圾数据占用了大量内存,而服务器却不会自己去释放它们。
定期删除
优点:
- 之前讨论的两种删除策略都有明显的缺陷,定期删除策略是前两种策略的一种整合和折中。
- 定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
- 除此以外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。
缺点:
- 定期删除的难点是确定删除操作执行的时长和频率。
- 如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将 CPU 时间过多地消耗在删除过期键上面。
- 如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。
Redis 的过期删除策略
Redis 服务器实际使用的是惰性删除和定期删除两种策略。通过配合使用这两种策略,服务器可以很好地在合理使用 CPU 时间和避免浪费内存空间之间取得平衡。
惰性删除策略的实现
- 如果输入键已经过期,那么 expireIfNeeded 函数将输入键从数据库中删除。
- 如果输入键未过期,那么 expireIfNeeded 函数不做动作。
定期删除策略的实现
- 从过期字典中随机选出 20 个 key。
- 删除这 20 个 key 中已经过期的 key。
- 如果过期的 key 的比例超过 1/4,那就重复步骤(1)。
Redis 的内存淘汰机制
maxmemory 来限制内存超出期望大小。
maxmemory-policy)来让用户自己决定该如何腾出新的空间以继续提供读写服务。
- noeviction:不会继续服务写请求(del 请求可以继续服务),读请求可以继续进行。这样可以保证不会丢失数据,但是会让线上的业务不能持续进行。这是默认的淘汰策略。
- volatile-lru:尝试淘汰设置了过期时间的 key,最少使用的 key 优先被淘汰。没有设置过期时间的 key 不会被淘汰,这样可以保证需要持久化的数据不会突然丢失。
- volatile-ttl:跟上面几乎一样,不过淘汰的策略不是 LRU,而是比较 key 的剩余寿命 ttl 的值,ttl 越小越优先被淘汰。
- volatile-random:跟上面几乎一样,不过淘汰的 key 是过期 key 集合中随机的 key。
- alllkeys-lru:区别于 volatille-lru,这个策略要淘汰的 key 对象是全体的 key 集合,而不只是过期的 key 集合,这意味着一些没有设置过期时间的 key 也会被淘汰。
- alllkeys-random:跟上面几乎一样,不过淘汰的 key 是随机的 key。
Redis 的 LRU 算法
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5808.html