手把手带你了解redis回调机制及代码实现
无德之人常嫉他人之有德。——培根
(资料图片仅供参考)
1.redis回调
1.概念
Redis是一种高性能的内存数据存储系统,它支持多种数据结构和灵活的操作。除了提供常规的键值存储功能外,Redis还支持订阅/发布、事务、Lua脚本等高级功能,其中回调函数是Redis的一个重要特性之一。
回调函数是一种在特定事件发生时自动执行的函数。在Redis中,回调函数通常用于在特定事件发生时自动执行一些操作。这些事件包括:
客户端连接/断开连接数据库键过期发布/订阅消息通过使用回调函数,我们可以在这些事件发生时执行一些自定义的逻辑,从而实现更加灵活和复杂的应用程序。
2.脚本配置文件
在Redis中,回调函数通常是通过在配置文件中定义来注册的。下面是一个示例配置文件,其中包含了一些回调函数的定义:
bashCopy code# Sample Redis configuration file# Register a callback function to execute when a client connectsclient-connect-callback /path/to/client-connect-script.sh# Register a callback function to execute when a client disconnectsclient-disconnect-callback /path/to/client-disconnect-script.sh# Register a callback function to execute when a key expireskeyspace-event-notification expired /path/to/key-expire-script.sh# Register a callback function to execute when a message is published to a channelnotify-keyspace-events KEA /path/to/pubsub-script.sh
在上面的示例中,我们注册了四个回调函数。第一个回调函数在客户端连接时执行,第二个在客户端断开连接时执行,第三个在键过期时执行,第四个在消息发布时执行。
要使用回调函数,我们需要编写相应的脚本。脚本可以是任何可执行文件,如Bash脚本、Python脚本等等。下面是一个示例Bash脚本,用于在客户端连接时打印一条消息:
bashCopy code#!/bin/bashecho "A client has connected"
在上面的脚本中,我们使用了echo命令来输出一条消息。当客户端连接时,Redis会自动执行这个脚本,并将消息输出到控制台。
3.概念总结
在编写回调函数时,我们还需要考虑一些安全问题。由于回调函数通常是在Redis进程的上下文中执行的,因此我们需要确保脚本不会执行任何危险操作,如删除文件或执行系统命令等等。为了确保安全性,我们可以使用一些技术,如沙盒化或限制脚本执行权限等等。
总之,回调函数是Redis的一个非常有用的特性,它可以让我们在特定事件发生时自动执行一些操作,从而实现更加灵活和复杂的应用程序。如果您正在使用Redis,并且想要了解更多关于回调函数的内容,可以看Redis官方文档。
2.场景需求
1.需求
例如:京东购物车结算,在用户进行结算的时候,支付时间为30分钟,用户未在30分钟之内支付,则需要进入待支付状态。
3.实现方案
咱们可以采用redis ,key有效期回调事件实现,为每笔支付的订单设置有限期为30分钟,在当前key失效的时候,redis进行回调。
4.redis配置
首先找到redis.conf配置文件,如果你跟我一样使用mac包管理工具brew安装的。
找到homebrew.mxcl.redis.plist
文件
打开之后就可以看到redis.conf的文件地址了。
打开配置文件之后找到notify-keyspace-events ""
,然后设置成notify-keyspace-events "Ex"
notify-keyspace-events 的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
字符 | 发送的通知 |
---|---|
K | 键空间通知,所有通知以__keyspace@ |
E | 键事件通知,所有通知以 __keyevent@ |
g | DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合命令的通知 |
x | 过期事件,每当有过期键被删除时发送 |
e | 驱逐事件,每当有键因为maxmemory政策而被删除时发送 |
A | 参数 g$lshzxe 的别名 |
5.代码实现
首先发送一条普通消息,设置过期时间。
@ApiOperation(value = "测试redis回调") @SaCheckLogin @PostMapping("/test") public ApiResponse testTask(){ redisUtil.set("FILE:userInfo","我是一条消息,来测试是否进入回调",60); return ApiResponse.ok(); }
添加RedisListenerConfig
回调配置类
@Slf4j@Configurationpublic class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } @Component public static class RedisKeyExpirationListener extends KeyExpirationEventMessageListener { public RedisKeyExpirationListener(RedisMessageListenerContainer container) { super(container); } @Override public void onMessage(Message message, byte[] pattern) { final String keyInfo = "FILE:userInfo"; String key = message.toString(); log.info("redis失效进入回调函数携带key:{}", key); if (key != null && key.startsWith(keyInfo)) { log.info("需要特殊处理的key,进行业务处理"); } } }}
6.测试结果

手把手带你了解redis回调机制及代码实现
Redis是一种高性能的内存数据存储系统,它支持多种数据结构和灵活的操作。除了提供常规的键值存储功能外,Redis还支持订阅 发布、事务、Lua脚
2023-03-13
全球动态:伟明环保(603568.SH)实控人项光明、朱善银、朱善玉合计增持572.29万股股份
智通财经APP讯,伟明环保(603568)(603568 SH)发布公告,截至2023年3月12日,公司实际控制人项光明先生、朱善银先生和朱善玉先生通过上海证券
2023-03-12
英雄谁属歌曲原唱_英雄谁属
1、英雄谁属天已暮月如初千里江山任我飞渡歌声住人环顾邀月同住青山深处英雄谁属非我莫属历经千辛万苦只为换
2023-03-12
世界快播:小孩咳嗽有痰吃什么好得快小妙招_小孩咳嗽有痰吃什么好的快
1、宝宝咳嗽有痰,不仅宝宝难受,当爸妈的看到也觉得难受。2、不想让宝宝难受,让宝宝的咳嗽快点痊愈是首要的事情。3、小孩咳
2023-03-12
宽甸县气象局发布大风蓝色预警【Ⅳ级/一般】
宽甸县气象局发布大风蓝色预警【Ⅳ级 一般】
2023-03-12
【播资讯】深海利剑剧情介绍_深海利剑大概剧情
解答:1、剧情介绍:潜艇是国家的战略武器,是国家安全的重要保障。面对X国潜艇“黑鲨”的屡次入侵,海军迅速制定了“T计划”
2023-03-12
pp背胶纸_pp背胶
1、它的别名是:不干胶。2、是一种广告喷绘里常用的材料之一,就像贴纸的模样,正面可印刷,背后撕下透明膜后可以粘贴。3
2023-03-11
环球热文:腾讯人工客服在线电话号码_腾讯人工客服真人电话
1、腾讯人工服务电话是0755-83765566,这个电话里就有好多种真人说话服务,打通电话后只要你仔仔细细听语音介绍说明按语音提示去打就一定能打
2023-03-11
二手车能跑婚庆吗_二手车能跑滴滴吗 每日播报
1、二手车可以跑滴滴。一般二手车只要符合同新车要求,裸车价格7万元以上,车龄6年以下,就可以跑。同时需要有C以上驾照,有
2023-03-11
三连胜!推特热搜前六中五个与湖人相关&包揽前三名
湖人主场122-112逆转猛龙,取得3连胜。本场比赛结束后,推特热搜前六名中有五个与湖人相关,其中前三是“lakeshow”、“vandy(范德彪)”、“里夫斯
2023-03-11X 关闭




X 关闭
- 最新全国疫情中高风险地区名单:全国现有高中风险地区15+64个(统计时间:5月19日6时)
- 北京疫情最新消息|5月18日北京新增50例本土确诊病例和5例无症状感染者
- 上海疫情最新消息|5月18日上海新增本土确诊病例82例和本土无症状感染者637例
- 郑州限号|今天是2022年5月19日,郑州限行尾号是4和9
- 发码总数超68万!郑州市“场所码”覆盖精度再提升
- 郑州发布100号通告:调整封控管控区域
- 【“郑”在抗疫】郑州互联网企业开展爱心购瓜网络公益活动
- 10岁顽童因“想妈妈”爬楼顶,暖心民警化身“心理医生”解心结
- 洛阳馨悦社工:以微薄之力让社区更安全
- 平顶山新华区对4名违反疫情防控有关规定人员依法处理