日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

淺談Redis中的自動過期機制_Redis

作者:超級碼里喵 ? 更新時間: 2022-07-13 編程語言

Redis中的自動過期機制

實現需求:處理訂單過期自動取消,比如下單30分鐘未支付自動更改訂單狀態

1.使用Redis Key自動過期出發事件通知
2.使用定時任務30分鐘后檢查
3.按照每分鐘輪訓檢查

CREATE TABLE `order_number` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_name` varchar(255) DEFAULT NULL,
  `order_status` int(11) DEFAULT NULL,
  `order_token` varchar(255) DEFAULT NULL,
  `order_id` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

一、使用Redis Key自動過期機制

當我們的key失效時,可以執行我們的客戶端回調監聽的方法。
需要在Redis中配置:

1.打開redis.conf配置文件

vi redis.conf

2. 在配置文件中查找notify-keyspace-events

/notify-keyspace-events

3. 修改為notify-keyspace-events Ex

4.重啟redis

在

二、SpringBoot整合key失效監聽

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {
    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    @Resource
    private OrderMapper orderMapper;

    /**
     * 待支付
     */
    private static final Integer ORDER_STAYPAY = 0;

    /**
     * 失效
     */
    private static final Integer ORDER_INVALID = 2;

    /**
     * 使用該方法監聽 當我們的key失效的時候執行該方法
     *
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String expiraKey = message.toString();
        System.out.println("該key:expiraKey:" + expiraKey + "失效啦~");
        // 前綴判斷 orderToken
        OrderEntity orderNumber = orderMapper.getOrderNumber(expiraKey);
        if (orderNumber == null) {
            return;
        }
        // 獲取訂單狀態
        Integer orderStatus = orderNumber.getOrderStatus();
        // 如果該訂單狀態為待支付的情況下,直接將該訂單修改為已經超時
        if (orderStatus.equals(ORDER_STAYPAY)) {
            orderMapper.updateOrderStatus(expiraKey, ORDER_INVALID);
            // 庫存加上1
        }
    }
}
@RestController
public class MemberController {
    @Autowired
    private UserMapper userMapper;

    /**
     *
     * @return
     */
    @RequestMapping("/getListMember")
    @Cacheable(cacheNames = "member", key = "'getListMember'")
    public List<MemberEntity> getListMember() {
        return userMapper.findMemberAll();
    }
}
@Data
public class OrderEntity {
    private Long id;
    private String orderName;
    /**
     * 0 待支付 1 已經支付
     */
    private Integer orderStatus;

    private String orderToken;
    private String orderId;

    public OrderEntity(Long id, String orderName, String orderId, String orderToken) {
        this.id = id;
        this.orderName = orderName;
        this.orderId = orderId;
        this.orderToken = orderToken;
    }
}
public interface OrderMapper {

    @Insert("insert into order_number values (null,#{orderName},0,#{orderToken},#{orderId})")
    int insertOrder(OrderEntity OrderEntity);


    @Select("SELECT ID AS ID ,order_name AS ORDERNAME ,order_status AS orderstatus,order_token as ordertoken,order_id as  orderid FROM order_number\n" +
            "where order_token=#{orderToken};")
    OrderEntity getOrderNumber(String orderToken);

    @Update("\n" +
            "\n" +
            "update order_number set order_status=#{orderStatus} where order_token=#{orderToken};")
    int updateOrderStatus(String orderToken, Integer orderStatus);
}

1.訪問addOrder接口

2.查看數據庫數據

3. 10s后redis過期,執行回調機制

4.再次查看數據庫,狀態已被修改

原文鏈接:https://blog.csdn.net/qq_30999361/article/details/124486136

欄目分類
最近更新