redis的监听实现及遇到的问题(监听失效)

需求:监听redis的新增(set)方法,新增时将数据同步到内存中.
1,添加redis依赖(忽略);
2,创建监听类实现MessageListener,并重写onMessage方法.	
public class MobileRedisMessageListener implements MessageListener {
    @Autowired
    private StringRedisTemplate redisTemplate;
    
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String ops = new String(message.getBody());     //操作
        String channel = new String(message.getChannel());
        String key = channel.split(":")[1];
		//对redis的新增或删除事件进行监听
        if ("set".equals(ops)) {
            String value = redisTemplate.opsForValue().get(key);
            handleSet(key, value);
        } else if ("del".equals(ops)) {
            handleDel(key);
        }
    }

    /**
     * 监听新增 处理逻辑
     */
    private void handleSet(String key, String value) {
			//将数据同步刷新到内存中
            gatewayCache.refreshApiWhitelistsCache(id, JsonUtil.toObject(value, Set.class));
    }

    /**
     * 监听删除 处理逻辑
     * @param key 被删除的key
     */
    private void handleDel(String key) { 
            gatewayCache.deleteApiWhitelists(id);
    }
}

问题: 在开发过程中遇到数据保存redis中是正常的,但是往内存中同步刷新时没有生效(监听失效).
参考博客:https://cloud.tencent.com/developer/article/1602112
问题原因:redis缺少配置,监听失效.
解决办法:修改配置文件redis.conf,

notify-keyspace-events AKEx

,重新启动Redis
参数说明
1)notify-keyspace-events选项的参数为空字符串时,表示功能关闭,当参数不是空字符串时,表示功能开启
2)notify-keyspace-events默功能是关闭的
3)如果要使用此功能,必须字符串包含 K 或者 E,否则收不到任何事件消息

4)如果参数为“AKE”,意味着接收所有事件消息
notify-keyspace-events 的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:
字符 发送的通知 K 键空间通知,所有通知以 keyspace@ 为前缀 E 键事件通知,所有通知以 keyevent@ 为前缀 g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知.

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,你可以使用 Redisson 这个 Redis 客户端库来实现 Redis 键的失效监听Redisson 提供了 `RKeys` 类来操作 Redis 的键,并且可以通过 `addListener` 方法添加键的监听器。以下是一个示例代码: ```java import org.redisson.Redisson; import org.redisson.api.RKeys; import org.redisson.api.RedissonClient; import org.redisson.api.listener.KeyspaceExpiredListener; public class RedisKeyExpirationListenerExample { public static void main(String[] args) { // 创建 Redisson 客户端 RedissonClient redisson = Redisson.create(); // 获取键操作对象 RKeys keys = redisson.getKeys(); // 添加键失效监听器 keys.addListener(new KeyspaceExpiredListener() { @Override public void onExpired(String key) { System.out.println("Key expired: " + key); // 在这里处理键失效事件 } }); // 等待键失效事件发生 try { Thread.sleep(60000); // 60秒 } catch (InterruptedException e) { e.printStackTrace(); } // 关闭 Redisson 客户端 redisson.shutdown(); } } ``` 在上述示例中,我们使用 Redisson 创建了一个 Redis 客户端,并通过 `getKeys()` 方法获取了键操作对象 `RKeys`。然后,我们使用 `addListener` 方法添加了一个键失效监听器 `KeyspaceExpiredListener`,并在回调方法中处理键失效事件。 你可以根据需要在回调方法中编写自己的处理逻辑。在示例中,我们简单地打印出了失效的键。 最后,我们通过 `Thread.sleep` 方法让程序等待一段时间,以便触发键失效事件。在实际应用中,你可以根据自己的需求来决定如何触发键失效事件。 请确保你已经在项目中引入了 Redisson 的依赖。你可以通过 Maven 或 Gradle 在项目的构建文件中添加以下依赖: Maven: ```xml <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.1</version> </dependency> ``` Gradle: ```groovy implementation 'org.redisson:redisson:3.16.1' ``` 请注意,上述示例中假设 Redis 运行在本地主机。你需要根据你自己的实际情况进行适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值