1、配置redis.conf文件中的notify-keyspace-events Ex

2、配置完之后重启redis服务,运行以下代码,开新的窗口设置时效性的键值对,等待它过期发现监听窗口出现信息提式,注意返回的是这个键值对的key不是value,这个后续使用设备号来做key的话过期就可以提取出这个设备Key去关掉它的电源灯来做给用户的一个提示。

3、springboot里需要做的配置类

/**redis缓存配置类*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }

}

 过期触发的业务逻辑(注意里面关闭电源的方式与前面的文章都是连在一块的业务逻辑)

@Component
public class RedisListener extends KeyExpirationEventMessageListener {

    @Autowired
    private UserDeviceService userDeviceService;
    @Autowired
    private DeviceService deviceService;
    @Autowired
    private PubMessage pubMessage;

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

    /**
     * 针对redis数据失效事件,进行数据处理
     *
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        /**当名为expiredKey的键值对过期了,会把key返回,而不会将value返回*/
        String expiredKey = message.toString();
        try {
            /**首先修改订单使用时间为0*/
            boolean updateExOrder = userDeviceService.updateExOrder(expiredKey);
            /**其次将设备的锁装置与设备状态释放掉*/
            deviceService.freeDeviceByDeviceId(expiredKey);
            /**最后向设备查询设备电源状态,如果状态为开则发送关闭指令*/
            boolean power = deviceService.findDevicePowerByDeviceId(expiredKey);
            if (power) {
                /**订单过期,现在关闭端口电源通断*/
                pubMessage.sendDownMessage(expiredKey);
                /**数据库里记录的电源还开着,所以我们需要将数据库表中的电源关掉**/
                boolean downDevicePowerByDeviceId = deviceService.downDevicePowerByDeviceId(expiredKey);
                if (!downDevicePowerByDeviceId)
                    throw new Exception("数据库power更改异常");
            }
            if (!updateExOrder) {
                throw new Exception("订单过期处理失败");
            }
        } catch (Exception e) {
            System.out.println("---------处理过期订单业务失效---------");
        }
        System.out.println(expiredKey + "订单过期--------------------");
    }
}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐