需求:监听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 等类型无关的通用命令的通知.

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐