场景:根据放入回收站文件,默认15天后删除。
目标:使用redis expire进行监听,执行删除操作。
一、新建类MyRedisConfig,消息监听容器
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 MyRedisConfig {
/**
* Redis 消息监听器容器.
*
* @param redisConnectionFactory the redis connection factory
* @return the redis message listener container
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
/**
* Redis Key失效监听器注册为Bean.
*
* @param redisMessageListenerContainer the redis message listener container
* @return the redis event message listener
*/
@Bean
public RedisEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
return new RedisEventMessageListener(redisMessageListenerContainer);
}
}
二、重写doHandleMessage方法
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import java.time.LocalDateTime;
public class RedisEventMessageListener extends KeyExpirationEventMessageListener {
/**
* Creates new {@link MessageListener} for {@code __keyevent@*__:expired} messages.
*
* @param listenerContainer must not be {@literal null}.
*/
public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
protected void doHandleMessage(Message message) {
// 这个就是过期的key ,过期后,也就是事件触发后对应的value是拿不到的。
// 这里实现业务逻辑,如果是服务器集群的话需要使用分布式锁进行抢占执行。
String key = message.toString();
System.out.println("key = " + key);
System.out.println("end = " + LocalDateTime.now());
}
}
三、修改配置文件
找到notify-keyspace-events " "改为notify-keyspace-events “Ex”
我是这两个文件都改了
四、测试
@RestController
@RequestMapping("/redis")
public class RedisController {
@Autowired
public RedisTemplate redisTemplate;
@GetMapping("/add")
public void Redis(){
redisTemplate.opsForValue().set("111","aaa");
boolean result=redisTemplate.expire("111", 1, TimeUnit.MINUTES);
System.out.println(redisTemplate.opsForValue().get("111")+"设置成功====================》"+result);
}
}