ホームページ  >  記事  >  データベース  >  Redis で自動有効期限メカニズムを使用する方法

Redis で自動有効期限メカニズムを使用する方法

PHPz
PHPz転載
2023-05-28 21:40:041259ブラウズ

Redis の自動有効期限メカニズム

実装要件: 期限切れの注文の自動キャンセルの処理 (たとえば、注文が 30 分間支払われなかった場合に注文ステータスを自動的に変更するなど)

1. 使用します。イベントを自動的に期限切れにする Redis キー 通知
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;
##1. Redis キーの自動有効期限切れメカニズムを使用する

キーの有効期限が切れたら、クライアント コールバック リスニング メソッドを実行できます。

Redis での構成が必要です:

1. redis.conf 構成ファイルを開きます

vi redis.conf

2. 構成ファイル内で Redis で自動有効期限メカニズムを使用する方法notify を見つけます-keyspace-events

/notify-keyspace-events

#3. Redis で自動有効期限メカニズムを使用する方法notify-keyspace-events Ex

# に変更します。

#4. redis を再起動しますRedis で自動有効期限メカニズムを使用する方法

##2. SpringBoot はキー障害監視を統合します

@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);
}
Redis で自動有効期限メカニズムを使用する方法1. addOrder インターフェイスにアクセスします

2. データベース データの表示

Redis で自動有効期限メカニズムを使用する方法

##3. Redis は 10 秒後に期限切れになり、コールバック メカニズムを実行します

Redis で自動有効期限メカニズムを使用する方法

4. データベースを再度確認すると、ステータスが変更されました。

Redis で自動有効期限メカニズムを使用する方法

以上がRedis で自動有効期限メカニズムを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。