在使用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 {
@Autowired
public UserRedisCallBackConfig(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Autowired
private HealthyFeignClient healthyFeignClient;
@Autowired
private UsersV2Service usersV2Service;
/**
* 处理数据过期的数据
* @time 2021/12/27 14:32
*/
@Override
public 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);
// 设置过期时长为10s
redisTemplate.opsForValue().set(RedisKeysConstant.USER_INFO_UPDATE + info.getUserId(), info.getUserId(), 5, TimeUnit.SECONDS);
return StateCode.SUCCESS;
}
5.测试结果