>데이터 베이스 >Redis >Redis에서 자동 만료 메커니즘을 사용하는 방법

Redis에서 자동 만료 메커니즘을 사용하는 방법

PHPz
PHPz앞으로
2023-05-28 21:40:041295검색

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

Redis에서 자동 만료 메커니즘을 사용하는 방법

2을 엽니다. 구성 파일에서 notify-keyspace-eventsnotify-keyspace-events

/notify-keyspace-events

Redis에서 자동 만료 메커니즘을 사용하는 방법

3. 修改为notify-keyspace-events Ex

@Configuration
public class RedisListenerConfig {
    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}

Redis에서 자동 만료 메커니즘을 사용하는 방법

Redis에서 자동 만료 메커니즘을 사용하는 방법3. 알림으로 수정- keyspace -events Ex

Redis에서 자동 만료 메커니즘을 사용하는 방법4. redis를 다시 시작하세요

2. SpringBoot는 키 오류 모니터링을 통합합니다

@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);
}
rrreeeRedis에서 자동 만료 메커니즘을 사용하는 방법1. 데이터베이스 데이터 보기

Redis에서 자동 만료 메커니즘을 사용하는 방법3. 10초가 지나면 redis가 만료되고 콜백 메커니즘이 실행됩니다.

Redis에서 자동 만료 메커니즘을 사용하는 방법4. 데이터베이스를 다시 확인하면 상태가 수정됩니다

위 내용은 Redis에서 자동 만료 메커니즘을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제