Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >手把手带你了解redis回调机制及代码实现

手把手带你了解redis回调机制及代码实现

原创
作者头像
Java king
发布于 2023-03-09 09:56:02
发布于 2023-03-09 09:56:02
2.6K40
代码可运行
举报
文章被收录于专栏:后端Java后端Java
运行总次数:0
代码可运行

无德之人常嫉他人之有德。——培根

1.redis回调

1.概念

Redis是一种高性能的内存数据存储系统,它支持多种数据结构和灵活的操作。除了提供常规的键值存储功能外,Redis还支持订阅/发布、事务、Lua脚本等高级功能,其中回调函数是Redis的一个重要特性之一。

回调函数是一种在特定事件发生时自动执行的函数。在Redis中,回调函数通常用于在特定事件发生时自动执行一些操作。这些事件包括:

  • 客户端连接/断开连接
  • 数据库键过期
  • 发布/订阅消息

通过使用回调函数,我们可以在这些事件发生时执行一些自定义的逻辑,从而实现更加灵活和复杂的应用程序。

2.脚本配置文件

在Redis中,回调函数通常是通过在配置文件中定义来注册的。下面是一个示例配置文件,其中包含了一些回调函数的定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bashCopy code
# Sample Redis configuration file
​
# Register a callback function to execute when a client connects
client-connect-callback /path/to/client-connect-script.sh
​
# Register a callback function to execute when a client disconnects
client-disconnect-callback /path/to/client-disconnect-script.sh
​
# Register a callback function to execute when a key expires
keyspace-event-notification expired /path/to/key-expire-script.sh
​
# Register a callback function to execute when a message is published to a channel
notify-keyspace-events KEA /path/to/pubsub-script.sh

在上面的示例中,我们注册了四个回调函数。第一个回调函数在客户端连接时执行,第二个在客户端断开连接时执行,第三个在键过期时执行,第四个在消息发布时执行。

要使用回调函数,我们需要编写相应的脚本。脚本可以是任何可执行文件,如Bash脚本、Python脚本等等。下面是一个示例Bash脚本,用于在客户端连接时打印一条消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bashCopy code
#!/bin/bash
​
echo "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@<db>__ 为前缀

E

键事件通知,所有通知以 __keyevent@<db>__ 为前缀

g

DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知

$

字符串命令的通知

l

列表命令的通知

s

集合命令的通知

h

哈希命令的通知

z

有序集合命令的通知

x

过期事件,每当有过期键被删除时发送

e

驱逐事件,每当有键因为maxmemory政策而被删除时发送

A

参数 g$lshzxe 的别名

5.代码实现

首先发送一条普通消息,设置过期时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @ApiOperation(value = "测试redis回调")
    @SaCheckLogin
    @PostMapping("/test")
    public ApiResponse testTask(){
        redisUtil.set("FILE:userInfo","我是一条消息,来测试是否进入回调",60);
        return ApiResponse.ok();
    }

添加RedisListenerConfig回调配置类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Configuration
public 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.测试结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
4 条评论
热度
最新
牛,大佬😀
牛,大佬😀
11点赞举报
😎
😎
回复回复点赞举报
11点赞举报
😂
😂
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
一口气说出 6种 延时队列的实现方案
五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看出和大佬之间的差距,人家没白没夜的更文,比你优秀的人比你更努力,难以望其项背,真是让我自愧不如。
程序员小富
2020/05/08
2.6K0
一口气说出 6种 延时队列的实现方案
Redis 键空间通知 Keyspace Notification 事件订阅
本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本。这种都已经烂大街了,随便一个 Crontab 就能搞定了。
Tinywan
2024/07/05
5970
Redis 键空间通知 Keyspace Notification 事件订阅
Spring Boot 监听 Redis Key 失效事件实现定时任务,超时订单自动关闭绝佳实现
生成订单后一段时间不支付订单会自动关闭。最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率。
架构师修炼
2020/07/20
2.8K0
领导:谁再用定时任务实现关闭订单,立马滚蛋!
在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;那他们是怎么实现的呢?
做个快乐的码农
2021/12/10
7990
领导:谁再用定时任务实现关闭订单,立马滚蛋!
Spring Boot 监听 Redis Key 失效事件实现定时任务
来源:antoniopeng.com/Redis 业务场景 实现思路 开启 Redis key 过期提醒 引入依赖 相关配置 ---- 业务场景 我们以订单功能为例说明下: 生成订单后一段时间不支付订单会自动关闭。最简单的想法是设置定时任务轮询,但是每个订单的创建时间不一样,定时任务的规则无法设定,如果将定时任务执行的间隔设置的过短,太影响效率。 还有一种想法,在用户进入订单界面的时候,判断时间执行相关操作。方式可能有很多,在这里介绍一种监听 Redis 键值对过期时间来实现订单自动关闭。 实现思路 在生成
程序猿DD
2023/04/04
1K0
Spring Boot 监听 Redis Key 失效事件实现定时任务
reids过期key并不是随随便便就让他过期,监听事件搞起来一个也不放过
啵啵肠
2023/11/28
1.2K0
探索SpringSession与Redis的完美结合:解决分布式会话管理难题
Redis 2.8版本开始加入了Keyspace notifications功能,它可以监听指定的key,当该key被修改、过期或被删除时,可以发送通知给订阅者。
烟雨平生
2023/10/25
1.9K0
探索SpringSession与Redis的完美结合:解决分布式会话管理难题
基于Redis的定时任务
基于Redis的定时任务 最近遇到一个业务场景,某次活动开始后要在250秒后自动关闭,然后修改活动的状态。考虑一下可以用传统的定时任务去处理 会出现250秒时间的延时问题,比如某次任务刚刚结束,但是定时任务在前一秒就结束了,那么活动虽然结束了,那么还要再等一个定时任务才能执行,时效性不行。 针对这个业务需求,我们采用 Redis (2.8.0+版本)的订阅发布模式 ,当key过期时触发相关事件。 redis配置 Redis 配置文件的具体配置: # # Example 2: to get the str
冷冷
2018/02/08
2.2K0
Redis的三种延迟队列 - Java技术债务
在现代分布式系统设计中,延迟队列作为一种重要的数据结构,广泛应用于消息延迟处理、任务调度、缓存失效、订单超时处理等场景。Redis,作为一个高性能的键值对存储系统,凭借其丰富的数据结构、原子操作、发布/订阅模式以及Lua脚本支持,成为了实现延迟队列的理想选择。
Java技术债务
2024/07/10
1.1K0
【redis】04-redis 根据监听key的失效事件实现订单超时关闭
1. 一个交易系统里面有一个价格提醒的功能,用户可以设置一组价格并设置一个周期,后台需要在交易的时间内进行价格扫描一旦触发用户设置的价格的周期就需要下发消息提醒给用户,提醒用户交易做单;
envoke
2020/09/17
2.6K1
【redis】04-redis 根据监听key的失效事件实现订单超时关闭
redis【redis入门到精通】
Redisredis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的数据库 Redis、Memcache、Tair(淘宝自研发)
高大北
2022/06/27
6330
redis【redis入门到精通】
订单出现超时未关闭场景解决方案
在电商平台或者其他的平台上,经常会出现超时订单自动取消的场景,例如订单超过15分钟会自动取消订单,在用户注册成功 15 分钟后,发短信息通知用户等等,这些业务场景都是延时任务的场景,在电商,支付等系统中,一设都是先创建订单(支付单),再给用户一定的时间进行支付,如果没有按时支付的话,就需要把之前的订单(支付单)取消掉。这种类 以的场景有很多,还有比如到期自动收货,超时自动退款,下单后自动发送短信等 等都是类似的业务问题。
ma布
2024/10/21
3130
订单出现超时未关闭场景解决方案
springboot整合redis过期key监听实现订单过期操作
对于以上情况可以自定义工厂然后注入即可(上面的JedisConfig.java文件)
一只牛博
2025/05/31
3850
springboot整合redis过期key监听实现订单过期操作
redis中key过期事件
刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息。
用户1558882
2018/08/01
3.4K0
redis.conf翻译与配置(五)【redis6.0.6】
普通的Redis实例不能成为Redis集群的一部分,只有作为集群节点启动的节点可以。为了启动一个有集群支持的Redis实例,可以把下面这行取消注释:
看、未来
2022/05/06
3450
redis事件监听的应用场景与案例实战
在使用Redis的过程中,我们对Redis做的每一个操作,下发的每一个命令, 都可以认为是事件的存在。所谓事件监听,就是Redis Server会对客户端下发命令进行一个监控, 一但有人对Redis Server做操作, Redis Server都能知道,并通过某种方式将监听到的事件转发到对应的订阅者。
蒋老湿
2020/03/20
6K1
redis事件监听的应用场景与案例实战
redis过期监听
今天写拼团功能,如果24小时后还没有人满,则此次拼团就失败了,那么这里我用redis过期监听来实现,键过期去处理订单状态等业务
adu
2022/10/30
2.5K0
redis过期监听
SpringBoot整合 Redis Key过期反馈 notify-keyspace-event
至于乱码,很简单,RedisTemplate字符编码与序列化的时候有问题,自己重新弄一个RedisConfig并追加本文的内容即可RedisConfig的Bean即可!!!
收心
2022/01/19
2K0
SpringBoot整合 Redis Key过期反馈 notify-keyspace-event
SpringBoot实现订单超时取消的几种方案
在电商和其他涉及到在线支付的应用中,通常需要实现一个功能:如果用户在生成订单后的一定时间内未完成支付,系统将自动取消该订单。本文将详细介绍基于Spring Boot框架实现订单30分钟内未支付自动取消的几种方案,并提供实例代码。
Jensen_97
2023/10/19
1.7K0
异步结果通知实现——基于Redis实现,我这操作很可以
前段时间,我在内存中实现了一个简单异步通知框架。但由于没有持久化功能,应用重启就会导致数据丢失,且不支持分布式和集群。今天这篇笔记,引入了 Redis 来解决这些问题,以下是几点理由:
烂猪皮
2021/04/02
1.3K0
推荐阅读
相关推荐
一口气说出 6种 延时队列的实现方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验