구현 요구 사항: 주문이 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;
키가 만료되면 클라이언트 콜백 모니터링 방법을 실행할 수 있습니다.
Redis 구성 필요:
1. redis.conf 구성 파일
vi redis.conf
2을 엽니다. 구성 파일에서 notify-keyspace-events
notify-keyspace-events
/notify-keyspace-events
3. 修改为notify-keyspace-events Ex
@Configuration public class RedisListenerConfig { @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); return container; } }
3. 알림으로 수정- keyspace -events Ex
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); }rrreee1. 데이터베이스 데이터 보기
3. 10초가 지나면 redis가 만료되고 콜백 메커니즘이 실행됩니다.
4. 데이터베이스를 다시 확인하면 상태가 수정됩니다
위 내용은 Redis에서 자동 만료 메커니즘을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!