Java Spring Redis实现过期键监听回调

1 篇文章 0 订阅

1、开启redis键过期监听

redis默认是没有开启键过期监听功能的,需要手动在配置文件中修改。

  • Linux操作系统
    • 修改redis安装目录下的redis.conf配置文件,然后找到notify-keyspace-events Ex这行代码,默认是注释掉的,取消注释即可(即删除掉前面的#)。
    • 也有一种情况是没有这一行的,这种情况下直接把这一行添加上去即可。
    • 然后重启redis。
  • windows操作系统
    • 在安装目录下找到redis.windows.confredis.windows-service.conf两个文件,然后分别修改这两个文件中的notify-keyspace-events Ex字段,取消注释即可。
    • 然后重启redis,Windows重启命令为redis-server.exe --service-start

2、Java代码实现监听回调

2.1、添加redis键过期监听配置

 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

2.2、建立监听类

@Component
public class KeyExpiredListener extends KeyExpirationEventMessageListener {

    @Autowired
    private ClientLogCacheProcessor clientLogCacheProcessor;
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private ISettingService settingService;

    public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        try {
            //过期的key
            String key = new String(message.getBody(), StandardCharsets.UTF_8);
			// 对key进行判断,当redis中的key过期时会在这里调用
    }
}

3、获取过期key的value

刚开始监听key过期的时候,以为是可以拿到这个可以对应的value的。但是在操作过程中发现获取到的value是null。

这里提供一种解决思路是:在存入这个key的时候紧接着存入一个备份键,相当于给这个key命一个别名,然后把这个value存入到这两个key中,需要监听的这个key设置过期时间,备份键则不设置过期时间。

当key过期后触发回调方法,则工具这个过期的key来获取这个key的备份键,这样就可以实现拿到过期键的value了。拿到value后手动删除掉这个备份键。

以上就是实现获取过期键的value的思路,当然这只是针对数据较小,且不频繁变化的value实现的一种思路,如果更好的解决办法,欢迎在评论区留言赐教。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以使用RedisKeyspace Notifications机制来监听Key过期事件。 首先需要在Redis配置文件中开启Keyspace Notifications,找到redis.conf文件,将如下行取消注释: ``` notify-keyspace-events Ex ``` 其中`Ex`表示监听Key过期事件。 接着,在Java中使用Jedis客户端连接Redis,并且订阅`__keyevent@0__:expired`频道,代码如下: ```java import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPubSub; public class RedisKeyExpiredListener { public static void main(String[] args) { Jedis jedis = new Jedis("localhost", 6379); RedisKeyExpiredListener listener = new RedisKeyExpiredListener(); jedis.psubscribe(listener.new KeyExpiredListener(), "__keyevent@0__:expired"); } private class KeyExpiredListener extends JedisPubSub { @Override public void onPSubscribe(String pattern, int subscribedChannels) { System.out.println("Subscribed to " + pattern); } @Override public void onPMessage(String pattern, String channel, String message) { System.out.println("Received expired event for key: " + message); } } } ``` 以上代码中,创建了一个`KeyExpiredListener`类,继承自`JedisPubSub`,并且实现了`onPSubscribe`和`onPMessage`方法分别用于处理订阅成功和接收到Key过期事件的处理。 在`main`方法中,首先创建了一个Jedis对象,然后创建了一个`KeyExpiredListener`对象,使用`jedis.psubscribe`方法订阅`__keyevent@0__:expired`频道,即监听Redis中所有数据库的Key过期事件。 运行程序后,当Redis中的Key过期时,程序会打印出相应的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值