Maison >base de données >Redis >Comment utiliser le mécanisme d'expiration automatique dans Redis

Comment utiliser le mécanisme d'expiration automatique dans Redis

PHPz
PHPzavant
2023-05-28 21:40:041295parcourir

Mécanisme d'expiration automatique dans Redis

Exigences de mise en œuvre : gérer l'annulation automatique des commandes expirées, comme le changement automatique du statut de la commande si elle n'est pas payée pendant 30 minutes après avoir passé une commande

1 Utilisez Redis Key pour expirer automatiquement les notifications d'événements
2. Utilisez les tâches planifiées après 30 minutes Vérifiez
3. Vérifiez selon chaque minute de rotation d'entraînement

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. Utilisez le mécanisme d'expiration automatique de Redis Key

Lorsque notre clé expire, nous pouvons exécuter notre méthode de surveillance de rappel client.
Nécessite une configuration dans Redis :

1. Ouvrez le fichier de configuration redis.conf

vi redis.conf

Comment utiliser le mécanisme dexpiration automatique dans Redis

2 Recherchez notify-keyspace-eventsnotify-keyspace-events

/notify-keyspace-events

Comment utiliser le mécanisme dexpiration automatique dans Redis

3. 修改为notify-keyspace-events Ex

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

Comment utiliser le mécanisme d'expiration automatique dans Redis

Comment utiliser le mécanisme dexpiration automatique dans Redis3. Remplacez par notify- keyspace -events Ex

Comment utiliser le mécanisme dexpiration automatique dans Redis4. Redémarrez redis

2 SpringBoot intègre la surveillance des pannes de clé

@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);
}
rrreeeComment utiliser le mécanisme dexpiration automatique dans Redis1.

2. Afficher les données de la base de données

Comment utiliser le mécanisme dexpiration automatique dans Redis

3. Après 10 secondes, redis expire et le mécanisme de rappel est exécuté

Comment utiliser le mécanisme dexpiration automatique dans Redis

4. Vérifiez à nouveau la base de données et le statut a été modifié

Comment utiliser le mécanisme dexpiration automatique dans Redis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer