- 配置类 ```java package org.springblade.modules.test;
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.PatternTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer;
/**
- @author clown
- @description
- @date 2021年06月24日 16:17
*/
@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory factory) {
} }RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(factory);container.addMessageListener(new RedisKeyExpirationListener(container), new PatternTopic("__keyevent@0__:expired"));return container;
2. 监听器```javapackage org.springblade.modules.test;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.connection.Message;import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;import org.springframework.data.redis.listener.RedisMessageListenerContainer;import org.springframework.stereotype.Component;/*** @author clown* @description* @date 2021年06月24日 16:18*/@Component@Slf4jpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}/*** 针对 redis 数据失效事件,进行数据处理** @param message* @param pattern*/@Overridepublic void onMessage(Message message, byte[] pattern) {// redis 客户端监听 Redis 16库 每个库对应不同的业务逻辑 前缀 order_timeOut_支付idString key = message.toString();log.info(">key:{}已经过期!<", key);// Long payId = Long.parseLong(key);// 过期,修改订单状态// payOrderTimeoutService.orderTimeout(payId);}}
- 测试接口 ```java package org.springblade.modules.test;
import lombok.AllArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
/**
- @author clown
- @description
- @date 2021年06月24日 16:24 */ @RestController @AllArgsConstructor @RequestMapping(“/test”) public class TestController { private final StringRedisTemplate template;
@PostMapping("/test")public Long test() {// 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。return template.getExpire("test");}
}
```
