当前位置: 首页 > news >正文

redis 过期监听:高效管理数据生命周期

引言

在现代的分布式系统中,缓存机制是提升应用性能的关键。Redis,作为一个高性能的键值存储系统,提供了丰富的数据结构和原子操作,被广泛应用于缓存实现中。然而,缓存数据的生命周期管理是一个复杂的问题。
本文将深入探讨 Redis 的过期监听机制,以及如何在实际应用中利用这一特性来优化系统设计。

Redis 过期策略

Redis 提供了灵活的键过期策略,允许开发者设置键的生存时间(TTL)。过期策略主要有以下几种:

  • 定时过期:每个键都有一个关联的过期时间,一旦达到这个时间,键就会被自动删除。
  • 惰性过期:键在访问时才会检查是否过期,如果过期则删除,否则返回值。
  • 定期过期:Redis 会定期扫描一部分键,删除其中的过期键。

启用过期监听

为了监听键的过期事件,我们需要在 Redis 配置文件 redis.conf 中启用 notify-keyspace-events 选项,并设置为 Ex,其中 E 表示启用过期事件通知,x 表示跨数据库通知。

notify-keyspace-events Ex

实现过期监听

以下是一个简单的案例

public class RedisKeyExpirationListener extends JedisPubSub {@Overridepublic void onMessage(String channel, String message) {String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(time + ":订单号:" + message + "已到期");}
}public void testPubSub() {RedisKeyExpirationListener jedisPubSub = new RedisKeyExpirationListener();new Thread(() -> {redisUtil.subscribe(jedisPubSub, "__keyevent@*__:expired");}).start();// 添加几个带过期时间的keynew Thread(() -> {try {for (int i = 0; i < 5; i++) {String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));redisUtil.setex("orderNo" + i, i + 1, "orderNo" + i);System.out.println(time + ":生成订单,订单号:orderNo" + i + ",有效期:" + (i + 1) + "秒");Thread.sleep(1000);}} catch (Exception e) {e.printStackTrace();}}).start();
}

应用场景

Redis 过期监听可以应用于多种场景,例如:

  • 订单超时自动关闭:在电商平台中,未支付的订单可以在一定时间后自动关闭。
  • 价格自动更新:商家设置的价格在指定时间后自动更新。

结论

Redis 过期监听是一个强大的特性,可以帮助开发者有效地管理缓存数据的生命周期。通过合理配置和实现,可以显著提升应用的性能和用户体验。然而,也应考虑到其局限性,并结合具体业务场景做出合理的设计选择。

另外,由于 redis 的 key 过期策略原因,当一个 key 过期时,redis 无法保证立刻将其删除,自然我们的监听事件也无法第一时间消费到这个key,所以会存在一定的延迟。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 回归预测|基于北方苍鹰优化极端梯度提升树的数据回归预测Matlab程序NGO-XGBoost多特征输入单输出
  • 光伏电站设备设施巡视卡之转变二维码登记卡
  • 计算机毕业设计 毕业季旅游一站式定制服务平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 使用kubeadm快速部署一套K8S集群
  • 设置虚拟机使用主机以太网而不是WiF连接
  • 普元EOS-低开页面下拉选择控件加载列表数据
  • 修改wls2上的默认用户为root
  • mariadb centos 7 安装
  • 百数功能插件技术解析:审批流程设置与数据填写便捷性探讨
  • 《Programming from the Ground Up》阅读笔记:p95-p102
  • Redis使用详解
  • LLM之基于llama-index部署本地embedding与GLM-4模型并初步搭建RAG(其他大模型也可,附上ollma方式运行)
  • 【设计模式】模板方法模式和迭代器模式
  • 【Docker】Linux系统以及威联通QNAP部署思源笔记的通用教程
  • css实现闪烁渐变背景,@property自定义属性
  • 深入了解以太坊
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 11111111
  • Android开源项目规范总结
  • es6要点
  • hadoop集群管理系统搭建规划说明
  • Map集合、散列表、红黑树介绍
  • 回流、重绘及其优化
  • 力扣(LeetCode)22
  • 前端面试之CSS3新特性
  • 突破自己的技术思维
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 阿里云ACE认证学习知识点梳理
  • ​【已解决】npm install​卡主不动的情况
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (152)时序收敛--->(02)时序收敛二
  • (23)Linux的软硬连接
  • (7)svelte 教程: Props(属性)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (LeetCode C++)盛最多水的容器
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (rabbitmq的高级特性)消息可靠性
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (已解决)什么是vue导航守卫
  • . Flume面试题
  • ... 是什么 ?... 有什么用处?
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .env.development、.env.production、.env.staging
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET开源快速、强大、免费的电子表格组件
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @staticmethod和@classmethod的作用与区别
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [30期] 我的学习方法
  • [ACTF2020 新生赛]Include
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [android] 看博客学习hashCode()和equals()