Redis进阶之七:Redis失效机制的应用

Redis中的key设置失效时间后,当达到指定时间会失效。Java中的KeyExpirationEventMessageListener监听类提供RedisKeyExpirationListener方法监听过期key。在实际应用场景中,如A系统向B系统发送请求并等待30s响应,可以通过设置Redis缓存标识,若30s内B系统未返回,通过监听器处理过期事件,执行相应业务操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Redis失效机制

Reids中的key设置失效时间后,Redis到一定时间会失效;java中提供了KeyExpirationEventMessageListener 这个监听类,为我们提供了RedisKeyExpirationListener方法来监听过期的Redis Key,当key过期时,会进入该方法。

二. 应用场景

在我们日常工作中,很多流程是需要等待的,比如A系统和B系统进行交互;A系统首先向B系统发送请求,B系统接收到请求,并处理返回处理结果最多需要最多30s,A系统需要判定30s内B系统是否返回正常数据过来,在无法使用长连接的情况下,需要在发送请求之后做30s的定时器。

  1. A向B发送请求,即存标识到redis中,失效时间设置为30s;
  2. 如果30s内,B成功返回所需数据回来,则删除该key;
  3. 如果在RedisKeyExpirationListener方法中触发了该key的失效事件,则代表B一直没有返回正常数据;接下来就可以根据业务做一系列的处理。
package com.crcgas.evc.ds.listener;

import com.crcgas.evc.ds.dao.ShChargeDataDao;
import com.crcgas.evc.ds.dto.EvcShChargeInfoDTO;
import com.crcgas.evc.ds.service.CommonServiceImpl;
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.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * key失效,触发事件
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    private static final Logger logger = LoggerFactory.getLogger(RedisKeyExpirationListener.class);

    @Autowired
    private ShChargeDataDao shChargeDataDao;

    @Autowired
    private CommonServiceImpl commonService;

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 针对redis数据失效事件,进行数据处理
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        String expiredKey = message.toString();
        if(expiredKey.startsWith("EVC_SHSTART_CHARGE184_")){
            //如果是SEND_CHARGE184_开头的key,获取value,更新充电信息表
            updateCharge(expiredKey, 1);
            logger.info("SEND_CHARGE184_开头的key:" + expiredKey);
        } else if (expiredKey.startsWith("EVC_SHSTOP_CHARGE184_")){
            updateCharge(expiredKey, 2);
            logger.info("EVC_SHSTOP_CHARGE184_开头的key:" + expiredKey);
        } else if (expiredKey.startsWith("chargeCard")){
            commonService.sendCardBalance(expiredKey.split(":")[1]);
        }
    }

    /**
     * 更新充电信息表超时
     */
    private void updateCharge(String expiredKey, int flag){
        EvcShChargeInfoDTO shChargeInfo = new EvcShChargeInfoDTO();
        shChargeInfo.setOrderNo(expiredKey.split("4_")[1]);
        if (flag == 1){
            shChargeInfo.setStartupSign("2");
            shChargeInfo.setStartupFailureReason("超时");
            //订单无效
            shChargeInfo.setOrderType("2");
        } else {
            shChargeInfo.setStopSign("2");
            shChargeInfo.setStopFailureReason("超时");
        }
        shChargeDataDao.updateShCharge(shChargeInfo);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值