在使用redis时,所有的key都要设置过期时间,过期之后,redis就会把对应的key清除掉。
此方法可以监听redis的key失效,在失效时做一些逻辑处理
redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务
现象:
redis 过期事件监听
通过KeyExpirationEventMessageListener类实现redis失效监听事件
方法
1.打开redis 监听事件开关
需要修改redis.conf配置文件,找到 EVENT NOTIFICATION (事件通知)这个配置
将 notify-keyspace-events “” 修改为 notify-keyspace-events “Ex”
2. pom.xml提供依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
3.编写自己的接口 提供给业务实现
@Slf4j
@Configuration
public class UserRedisCallBackConfig extends KeyExpirationEventMessageListener {@Autowiredpublic UserRedisCallBackConfig(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}@Autowiredprivate HealthyFeignClient healthyFeignClient;@Autowiredprivate UsersV2Service usersV2Service;/*** 处理数据过期的数据* @time 2021/12/27 14:32*/@Overridepublic void onMessage(Message message, byte[] pattern) {String s = message.toString();if (s.startsWith(RedisKeysConstant.USER_INFO_UPDATE)) {this.userInfoUpdate(s);}super.onMessage(message, pattern);}public void userInfoUpdate(String key) {// 获取更改个人信息String userId = key.split(":")[3];HealthyUserInfoDTO healthyUserInfoDTO=new HealthyUserInfoDTO();healthyUserInfoDTO.setUserId(Integer.valueOf(userId));Users users=usersV2Service.info(healthyUserInfoDTO.getUserId());healthyUserInfoDTO.setBirthday(users.getBirthday());healthyUserInfoDTO.setSex(users.getSex());healthyFeignClient.updateUserInfo(healthyUserInfoDTO);}
4.触发点
private StateCode updateOther(Users info, UpdateUsersInfo updateUsersInfo) {// 修改用户信息Users.update(info, updateUsersInfo);log.info("修改了年龄");// 更新用户信息this.usersService.update(info);// 设置过期时长为10sredisTemplate.opsForValue().set(RedisKeysConstant.USER_INFO_UPDATE + info.getUserId(), info.getUserId(), 5, TimeUnit.SECONDS);return StateCode.SUCCESS;}
5.测试结果