redis 过期删除策略(redis过期机制)

过期删除策略redis可以对key的通用设置中,可以设置key的过期时间及ttl如果单纯的再client中进行命令测试的话,会发现了当时间到时间后再去获取该key会显示nil那么一个key过期了,那么它实际是在什么时候删除的呢?当然这个删除也不是简单的到期了就直接被删除了redis中对于过期键的过期删除策略定时删除惰性删除定期删除定时删除它会在设置键的过期时间的同时,创建一个定时器,当键到了过期时间,定时器会立即对键进行删除。这个策略能够保证过期键的尽快删除,快速释放内存空间

大家好,又见面了,我是你们的朋友全栈君。

过期删除策略

redis可以对key的通用设置中,可以设置key的过期时间及ttl

如果单纯的再client中进行命令测试的话,会发现了当时间到时间后

再去获取该key会显示nil

那么一个key过期了,那么它实际是在什么时候删除的呢?

当然这个删除也不是简单的到期了就直接被删除了

redis中对于过期键的过期删除策略

  • 定时删除
  • 惰性删除
  • 定期删除
定时删除

它会在设置键的过期时间的同时,创建一个定时器, 当键到了过期时间,定时器会立即对键进行删除。 这个策略能够保证过期键的尽快删除,快速释放内存空间。
在这里插入图片描述
但是有得必有失,redis的操作频率是非常高的。绝大多数的键都是携带过期时间的,这样就会造成出现大量的定时器执行,严重降低系统性能

总的来说:该策略对内存来说十分的友好,但对cpu来说非常不友好,会拉低系统的性能,因此不建议使用

惰性删除

为了解决定时删除会占用大量CPU资源的问题, 因此产生了惰性删除。

​ 它不持续关注key的过期时间, 而是在获取key时,才会检查key是否过期,如果过期则删除该key。简单来说就是:平时我不关注你,我用到你了,我才关注你在不在。
在这里插入图片描述
总的来说:惰性删除对CPU足够友好,但是对内存空间非常不友好,会造成大量内存空间的浪费。

定期删除

定期删除,顾名思义,就是每隔一段时间进行一次删除

  • 如果删除操作执行次数过多、执行时间太长,就会导致和定时删除同样的问题:占用大量cpu资源去进行删除操作
  • 如果删除操作次数太少、执行时间短,就会导致和惰性删除同样的问题:内存资源被持续占用,得不到释放。

所以定时删除最关键的就在于执行时长和频率的设置
在这里插入图片描述

  • 默认每秒运行10次会对具有过期时间的key进行一次扫描,但是并不会扫描全部的key,因为这样会大大延长扫描时间。
  • 每次默认只会随机扫描20个key,同时删除这20个key中已经过期的key。
  • 如果这20个key中过期key的比例达超过25%,则继续扫描。

参数配置

默认每秒扫描10次,我们可以在redis的配置文件中进行更改
在这里插入图片描述
对于hz参数,官方不建议超过100,否则会把cpu造成比较大的压力

内存淘汰策略

为什么需要内存淘汰策略

可以思考两个问题

  • 通过惰性+定期删除,能不能百分百避免过期key没有被删除的情况?
  • 当大量插入插入到redis,但内存空间不足时,redis会如何处理呢?

有一些已经过期的key,定期扫描一直都没有扫描到它,而且这些key也一直没有被使用。 那么它们就会一直在内存中存在。同时继续向Redis不断插入新数据,最终造成内存空间不足的问题。

​ 对于这种问题的解决,就用到了内存淘汰策略。

策略详解

当客户端执行命令,添加数据时,Redis会检查内存空间大小,如超过最大内存,则触发内存淘汰策略。
在这里插入图片描述
在Redis中默认提供了三类八种淘汰策略。
在这里插入图片描述
这里我们可以看到两个名称:lru、lfu,他俩是什么意思呢?

他们的学名叫做:数据驱逐策略。 其实所谓的驱逐就是将数据从内存中删除掉。

  • lru:Least Recently Used,它是以时间为基准,删除最近最久未被使用的key。
  • lfu:Least Frequently Used,它是以频次为基准,删除最近最少未被使用的key。

redis默认使用noeviction,我们可以通过修改redis.conf中maxmemory-policy属性值设置不同的内存淘汰策略。

不同策略的使用场景

1、Redis只做缓存,不做DB持久化,使用allkeys。如状态性信息,经常被访问,但数据库不会修改。

2、同时用于缓存和DB持久化,使用volatile。如商品详情页。

3、存在冷热数据区分,则选择LRU或LFU。如热点新闻,热搜话题等。

4、每个key被访问概率基本相同,选择使用random。如企业内部系统,访问量不大,删除谁对数据库也造成太大压力。

5、根据超时时间长久淘汰数据,选择选用ttl。如微信过期好友请求。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/127819.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RPC和REST的区别(转)

    RPC和REST的区别(转)

    2021年5月9日
  • T-SQL基础–TOP

    T-SQL基础–TOP

    2021年11月26日
  • 计算机专业选Java和Python哪个前景好点?[通俗易懂]

    计算机专业选Java和Python哪个前景好点?[通俗易懂]对于学习计算机专业的小伙伴,面对大二选课,开始陷入Java和python的纠结中,从以后的发展来看,这两个编程语言肯定是要通吃的,但前期的学习,可以有一个侧重点,说一下我自己的观点。应很多小伙伴的要求,我们从就业应用前景和学习难易度来分析一下:一、Java1、就业应用前景从目前的招聘量上来看,Java在编程语言中可以说是常胜将军,经常有各种新出的编程语言向它发起挑战,但是Jav…

    2022年7月8日
  • java 反编译器_JAVA编译器

    java 反编译器_JAVA编译器xjad反编译工具下载使用反编译时把class文件直接拖拽至工具内即可,如果反编译结果不对时把class文件重新去拿原始的不要编辑打开,或者放在一个文件夹内在试。反编译后的代码没有注释、注解等,反正能用得细心看看调整。点击下载工具http://a.xzfile.com/down2/XJadfanbinayi_downcc.zip…

    2022年8月19日
  • nfs之端口设置

    nfs之端口设置1,修改/etc/sysconfig/nfs文件  MOUNTD_PORT="4002"STATD_PORT="4003"LOCKD_TCPPORT="4004"LOCKD_UDPPORT="4004"查看rpcinfo-p能看到mouted_port=4002,其余三项未显示2,tcp 1112049端口udp111 4046端口 把…

    2022年6月27日
  • idea常用快捷键分享|IntelliJ IDEA快捷键分享

    idea常用快捷键分享|IntelliJ IDEA快捷键分享前言idea工具确实好用,从eclipse到idea,永无回头路,从破解到开源license,无法逃脱真想定律。现在列举出如下快捷键,让你在idea中如鱼得水。一、Ctrl快捷键Ctrl+F在当前文件进行文本查找(必备)Ctrl+R在当前文件进行文本替换(必备)Ctrl+Z撤销(必备) Ctrl+Y删除光标所在行或删除选中的行(必备)Ctrl+X剪切光标所在行或剪切选择内容Ctrl+C复制光标所在行

    2022年5月14日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号