redis过期事件监听、可以做延时任务 第二篇(简单)

在使用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提供依赖

        
            org.springframework.boot
            spring-boot-starter-data-redis
        

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.测试结果

redis过期事件监听、可以做延时任务 第二篇(简单)_第1张图片

你可能感兴趣的:(redis)