redis 设置expire=0和直接调用delete删除key的区别

这篇具有很好参考价值的文章主要介绍了redis 设置expire=0和直接调用delete删除key的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

问题起源于生产上应用redis做的一个临时缓存的场景,调用方首先调用某个容器的生成接口,该接口会生成临时缓存的数据放到redis中,然后调用方在调用获取数据内容的接口从任何一台容器中获取放置在redis中的临时数据。

还原问题场景

由于临时数据仅仅只是为了在第二步获取数据内容时从任一个容器都可以访问到,所以临时数据需要删除,因此应用设计了一个单独线程来清理临时redis数据的内容,一开始清理逻辑时判断临时数据放到redis的时间是否已经超过了3S,如果是,那么直接删除,后来,有同事反馈说,我们不能这么删除,因为我们没法保证临时数据在3s内肯定调用方已经调用完获取数据的接口获取到数据,所以保险起见,我们用expire设置过期时间为1s,这样相当于临时数据至少存活4S,更充分的保证调用方已经调用获取数据接口获取到了数据,于是我们的应用这样上线了,但是刚上线没多久,Redis就告警内存不足,于是就有了这次关于expire设置过期时间的工作原理的记录

redis.expire工作原理

expire设置一个很短的过期时间 和 直接delete相比有什么不一样呢? delete能及时回收redis的内存,那么expire为什么不能及时回收内存呢?这里就要讲到了redis是如何清理过期数据的,首先redis会使用惰性删除和定时清理的策略删除过期的key

惰性删除
所谓的惰性删除策略是指当访问redis的某个过期的redis的key时,redis会直接删除过期的key,并回收过期key所占据的内存

定时删除策略
Redis服务器默认每隔100ms过期检查一次数据库,检查的间隔可以通过Redis.conf进行配置,每次过期检查都会执行以下操作
1.首先从所有设置了过期时间的的key集合中随机抽取20个候选的key,判断key是否过期,如果过期,那么就进行删除并且回收内存,并记录下20个候选key中总共有多少个key过期了
2.如果步骤一中过期的key的数量/20个候选key的数量的占比大于25%,那么继续循环删除,否则等待下一轮的循环检查
不过为了防止有大量的key要删除导致的redis卡死,每一轮循环Redis设置了最长的删除流程的上限不超过25ms,超过则等待下一轮检查

总结

从上述Redis对过期时间的key的清理策略可知,当短时间内有大量的key过期,并且很多是大key时,redis服务器是来不及删除这么多的过期key的,如果此时新的key不断的生成,而过期的key来不及及时删除,此时就可能导致redis内存不足. 那回到一开始的问题,为什么你使用delete直接删除不会导致redis内存问题呢?首先一方面是delete删除可以直接回收内存,而且由于是客户端来进行删除,只有在删除之后才会再次申请新的redis的key,所以相当于也变相的把新key的生成速度降低了,这两者综合导致redis内存并没有被打爆文章来源地址https://www.toymoban.com/news/detail-567704.html

到了这里,关于redis 设置expire=0和直接调用delete删除key的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • git密钥过期更新Your SSH key has expired

    gitlab官方:https://gitlabbj.uniontech.com/help/user/ssh.md 本地用的rsa 1、创建一个新的ssh key: ssh-keygen -t rsa -b 2048 -C \\\"comment\\\" 2、会出现: 确认密钥文件,如果正确回车即可。 3、然后出现: 密钥密码;密钥口令,回车即可。 3、生成成功,查看密钥: cd ~/.ssh cat id_rsa.pub id_rsa.pub替换为自

    2024年02月19日
    浏览(56)
  • git秘钥过期 ERROR: Your SSH key has expired

    使用git命令时遇到Github 的 SSH Key秘钥过期,提示错误 ERROR: Your SSH key has expired 首先登录Github查看,头像-设置-SSH秘钥,发现确实过期了,接下来就是重新生成秘钥 直接在项目目录下执行命令 ssh-keygen -t rsa -C \\\"你的邮箱\\\" 生成即可 然后进入刚刚生成的目录,把秘钥粘贴出来,放

    2024年02月20日
    浏览(52)
  • Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

    在 Spring 中,@Async 注解用于将方法标记为异步执行的方法。当使用 @Async 注解时,该方法将在单独的线程中执行,而不会阻塞当前线程。这使得方法可以在后台执行,而不会影响主线程的执行。 在您提供的代码示例中,a1() 和 a2() 方法都被标记为 @Async,意味着它们将以异步方

    2024年01月19日
    浏览(39)
  • openssl3.2/test/certs - 002 - root cert variants: CA:false, key2, DN2, expired

    索引贴 openssl3.2 - 官方demo学习 - test - certs –官方原始脚本 openssl3.2/test/certs - 002 - root cert variants: CA:false, key2, DN2, expired root cert variants: CA:false, key2, DN2, expired ./mkcert.sh genss “Root CA” root-key root-nonca –得到的原始命令行 openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -out root-key.

    2024年01月23日
    浏览(35)
  • 关于直接删除软件的文件夹内容,而没有通过系统-》设置-》应用与功能-》卸载操作的残留注册表信息,导致应用与功能卸载应用显示灰色

    关于直接删除软件的文件夹内容,而没有通过系统-》设置-》应用与功能-》卸载操作的残留注册表信息,导致应用与功能卸载应用显示灰色 计算机HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionUninstall木子李QQ9.0.6(24040) 应用与功能卸载显示灰色,之前是win10升级后也

    2024年02月12日
    浏览(58)
  • MySQL binlog超过binlog_expire_logs_seconds阈值没有删除案例

    生产环境有一套3个节点的MySQL InnoDB Cluster,MySQL的版本为Server version: 8.0.35 MySQL Community Server - GPL,早上突然收到Zabbix的告警,其中一个节点出现空间告警:\\\"/data: Disk space is low (used 80%)\\\" 检查分析后发现是因为MySQL的binlog没有清理导致空间报警,如下所示(binlog太多,省略了部分内

    2024年04月11日
    浏览(33)
  • php开发实战分析(2):cookie的动态使用(设置、获取、删除、猜你喜欢原理、购物车调用)

    在 PHP 中,cookie 是一种用于在客户端(浏览器)和服务器之间存储数据的一种机制。 它们通常用于跟踪和识别用户,并存储用户的偏好设置。下面是一些常见的用法和函数来操作 cookie。 可以使用 setcookie() 函数来设置 cookie。该函数有多个参数,其中最重要的是名称和值。下

    2024年02月15日
    浏览(56)
  • Doris(9):删除数据(Delete)

    Delete不同于其他导入方式,它是一个同步过程。和Insert into相似,所有的Delete操作在Doris中是一个独立的导入作业,一般Delete语句需要指定表和分区以及删除的条件来筛选要删除的数据。 Doris 目前可以通过两种方式删除数据: DELETE FROM 语句 ALTER TABLE DROP PARTITION 语句 语法:

    2023年04月24日
    浏览(50)
  • 大数据Doris(三十):删除数据(Delete)

    文章目录 删除数据(Delete) 一、​​​​​​​DELETE FROM Statement(条件删除)

    2024年01月25日
    浏览(51)
  • hive数据库delete删除部分数据/删除分区内的数据

    在Hive中,删除部分数据是一个常见的操作,特别是当我们需要清除不再需要的数据或者进行数据更新时。Hive提供了多种方式来删除部分数据,本文将介绍其中几种常用的方法。 最简单的方法是删除整个表,这将删除表中的所有数据。可以使用DROP TABLE语句来完成这个操作。下

    2024年02月04日
    浏览(57)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包