redistemplate hash 过期时间_Redis开发 —— 过期消息通知实现(Springboot)

实际在我们开发过程中,有一些业务场景需要能够在一段时间之后能自动变更数据状态,如优惠券,特价商品,购物车等,这个时候如果实现基于redis,就可以使用下面的方案。

一,在系统添加配置类

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 RedisExpirationConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

二,添加对应的业务实现监听器

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;
 
import java.io.File;
 
/**
 * redis 消息过期异步通知监听器
 *
 * */
@Component
public class RedisMessageListener extends KeyExpirationEventMessageListener {
 
    private static Logger logger = LoggerFactory.getLogger(RedisMessageListener.class);
 
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
 
    public RedisMessageListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        logger.info("收到 redis 过期异步通知:{}", message.toString());
 
        String redisKey = (String) redisTemplate.getValueSerializer().deserialize(message.getBody());
        logger.info("redisKey : {}", redisKey);
        //针对特定的key进行处理
        if (redisKey.startsWith("rediskey")){
            try {              
             //TODO
 
            }catch (Exception exp){
                logger.info("业务处理失败:" + exp.getMessage());
            }
        }
    }
}

三,针对业务实现对应过期消息的处理

在TODO的标识上面,针对不同业务设置的redis key,分成多个业务处理。建议key的设置使用 XXX:XXX:XXX 这种模式 eg:saas:file:key:业务参数,效果如图所示:

8e919b6b627f2924cd6f10be7aecefa8.png
采用上述构建key的工具效果图

上述方法若有错误问题,请给我留言一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值