首頁 > 軟體

淺談Redis中的自動過期機制

2022-05-17 19:01:56

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_numbern" +
            "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.再次檢視資料庫,狀態已被修改

 到此這篇關於淺談Redis中的自動過期機制的文章就介紹到這了,更多相關Redis 自動過期內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com