Maison > Article > base de données > Comment résoudre le problème du délai d'expiration de Redis
Pour modifier String, redis a : set, setex, append, incr, decr , etc., parmi lesquels , l'utilisation de set et setex pour modifier la chaîne existante d'origine réinitialisera le délai d'expiration initialement défini. À strictement parler, set et setex ne sont pas des "modifications" mais un écrasement, donc la valeur-clé initialement définie doit être set/. setexed à nouveau. Cette clé écrasera celle d'origine. Les résultats des tests utilisant try redis sont les suivants :
Si vous utilisez append, incr, decr et d'autres commandes pour modifier, le délai d'expiration d'origine ne sera pas réinitialisé :
Donc, pour la structure de chaîne, il suffit d'exécuter la commande set /setex pour réinitialiser le délai d'expiration, et la commande set modifiera directement le délai d'expiration pour qu'il n'expire jamais.
Par exemple, si je définis une {key1:value} à 7h00, le délai d'expiration est de 30 minutes, et si je définis/setex la valeur de cette clé plusieurs fois entre 7h00 et 7h30, le délai d'expiration de key1 sera réinitialisé. Il ne finira pas par expirer à 7h30. Comment s'assurer que le délai d'expiration n'est pas actualisé à chaque fois après avoir défini cette clé d'expiration et que l'expiration est stable à 7h30 ?
Méthode 1 :
Utilisez Timer, créez une minuterie lors de son premier réglage et supprimez la clé lorsqu'elle expire. Cette méthode occupera plus de ressources CPU lorsque la quantité de données est importante et n'est pas recommandée.
Méthode 2 :
À chaque fois avant de définir la valeur de la clé, renvoyez le temps d'expiration restant de la clé à ce moment et attribuez le temps d'expiration restant à la clé comme nouveau délai d'expiration pendant setex, qui peut être résolu .
En prenant le projet Spring comme exemple, il peut être résolu en utilisant l'horodatage d'expiration restant (niveau milliseconde) renvoyé par la méthode redisTemplate.getExpire(String key). Essentiellement, il envoie une commande PTTL à redis pour renvoyer le reste. expiration de la clé en millisecondes.
Exemple de code :
Laissez key1 conserver l'heure d'expiration lorsqu'elle a été définie pour la première fois à chaque fois qu'elle est modifiée
//获取key1的剩余时间的时间戳 Long expire = redisTemplate.getExpire("key1"); //最后一个参数可以选秒、毫秒(TimeUnit.MILLISECONDS),Redis最多只能返回毫秒级别的key的剩余过期时间 redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
La période de validité du K-V de type String sera réinitialisée au fur et à mesure de la modification de la valeur :
S'il y a un K-V, le délai d'expiration est de 30 secondes. Si la valeur est modifiée, le délai d'expiration sera réinitialisé à. 30 secondes , au lieu de soustraire le temps perdu du temps initialement réglé.
À l'exception de la structure de données de chaîne, les modifications apportées à d'autres structures de données ne réinitialiseront pas le délai d'expiration
Par exemple, hash, set, Zset, list, etc. :
Prenons le hachage comme exemple :
La période de validité du hachage ne sera pas réinitialisée. Le timing redémarre à mesure que la valeur du champ de hachage est modifiée.
Si vous devez resynchroniser, vous devez re-spécifier la période de validité lors de la modification de la valeur du champ.
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!