前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手带你了解redis回调机制及代码实现

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

原创
作者头像
Java king
发布2023-03-09 17:56:02
1.8K4
发布2023-03-09 17:56:02
举报
文章被收录于专栏:后端Java后端Java

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

1.redis回调

1.概念

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

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

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

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

2.脚本配置文件

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

代码语言:javascript
复制
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
复制
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
复制
    @ApiOperation(value = "测试redis回调")
    @SaCheckLogin
    @PostMapping("/test")
    public ApiResponse testTask(){
        redisUtil.set("FILE:userInfo","我是一条消息,来测试是否进入回调",60);
        return ApiResponse.ok();
    }

添加RedisListenerConfig回调配置类

代码语言:javascript
复制
@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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.redis回调
    • 1.概念
      • 2.脚本配置文件
        • 3.概念总结
        • 2.场景需求
          • 1.需求
          • 3.实现方案
          • 4.redis配置
            • 5.代码实现
              • 6.测试结果
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档