需求

  在写项目时有一个需求,当 Redis 中某缓存过期时,进行相应的业务逻辑。

配置 Redis 的监听器

@Configuration
public class RedisListenerConfig {

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

自定义监听器

@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

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

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 此值就是过期的 key 值
        String key = message.toString();
        System.out.println("过期的 key:" + key);
        // 如果 key 为指定的 key 则进行操作
        if (RedisEnum.EXAMINATION_PAPER.getValue().equals(key)) {
            System.out.println("指定缓存过期");
        }
    }
}

测试

@RestController
public class ExaminationController {

    @Resource
    private RedisUtil redisUtil;

    /**
     * 设置一个有过期时间的 key
     */
    @GetMapping("examinationPaper")
    public boolean examinationPaper(Integer time) {
        // 先添加 key,再设置过期时间
        redisUtil.set(RedisEnum.EXAMINATION_PAPER.getValue(), "666");
        return redisUtil.expire(RedisEnum.EXAMINATION_PAPER.getValue(), time);
    }

    /**
     * 查看 key 的过期时间
     */
    @GetMapping("time")
    public long time() {
        return redisUtil.getExpire(RedisEnum.EXAMINATION_PAPER.getValue());
    }
}

标题:Redis 实现过期 key 事件监听
作者:Yi-Xing
地址:http://47.94.239.232:10014/articles/2021/03/09/1615298071495.html
博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!