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中默认提供了三类八种淘汰策略。
在这里插入图片描述
这里我们可以看到两个名称:lrulfu,他俩是什么意思呢?

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

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

redis默认使用noeviction,我们可以通过修改redis.confmaxmemory-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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 生物标志物_简述生物标志物及其分类

    生物标志物_简述生物标志物及其分类NatureReviewCancer——最有前景的Biomarkers什么是生物标志物?生物标志物(Biomarkers)是指可以标记系统、器官、组织、细胞及亚细胞结构或功能变化以及可能发生变

    2022年8月2日
    12
  • 编程是程序设计吗_做软件必须先设计再编程吗

    编程是程序设计吗_做软件必须先设计再编程吗常在电脑前工作,总有那么几天会对未来迷茫,可能是每天静止的坐着,感觉自己在变老,而电脑总想个孩子,每天能冒出无数个想法,让你去琢磨它,跟上它的节奏,真有点TheBigBangTheory的味儿,

    2022年8月6日
    6
  • PyQuery 库

    PyQuery 库强大又灵活的网页解析库。如果你觉得正则写起来太麻烦,BearutifulSoup语法太难记,而又熟悉jQuery的语法,那么PyQuery就是你的绝佳选择1、初始化1.1、字符串初始化html="""<div><ul><liclass="item-0">firstitem</li>

    2022年5月18日
    43
  • python怎样安装whl文件

    python怎样安装whl文件python第三方组件有很多都是whl文件,遇到这样的whl文件应该怎样安装呢,今天来介绍一下whl文件怎样安装。(一)下载whl文件可以从下面;两个网站找到自己需要的whl文件,部分文件在国内网站上没有,pypi网站上是最全的。pypi网站:https://pypi.python.org/pypi/国内whl集合网:https://www.l…

    2022年4月5日
    109
  • [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证

    2021年8月29日
    41
  • process information unavailable

    process information unavailable今天在虚拟机kill进程的时候出现了processinformationunavailable出现这个问题的原因呢?其实很简单,就是你用A用户创建了一个进程,然后你用B用户把他干掉了,虽然是干掉了,但是查看的时候会出现这个该怎么解决呢?首先我们进入到tmp目录下,用ls查看,你会发现有几个以hsperfdata_开头的文件然后你点进去看的时候就知道那个进程是哪个用…

    2022年9月16日
    3

发表回复

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

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