Maison >base de données >Redis >Comment résoudre la panne de Redis
Répartition : fait référence à une seule clé qui est introuvable dans le cache. Accédez à la base de données pour interroger, donc si la quantité de données n'est pas importante ou. la concurrence n'est pas grande, il n'y aura pas de problème.
Si le volume de données de la base de données est important et que la concurrence est élevée, la base de données peut s'effondrer en raison d'une pression excessive
Remarque : Ceci fait référence à Une simultanéité élevée se produit sur une seule clé !!! (Apprentissage recommandé : Tutoriel vidéo Redis)
Solution :
1) Via synchronisé+double mécanisme de vérification : Une certaine clé ne permet qu'à un seul thread d'interroger, bloquant les autres threads
Dans le bloc de synchronisation, continuez à juger et à vérifier qu'elle n'existe pas avant de vérifier la base de données.
Par exemple :
private static volaite Object lockHelp=new Object(); public String getValue(String key){ String value=redis.get(key,String.class); if(value=="null"||value==null||StringUtils.isBlank(value){ synchronized(lockHelp){ value=redis.get(key,String.class); if(value=="null"||value==null||StringUtils.isBlank(value){ value=db.query(key); redis.set(key,value,1000); } } } return value; }
Inconvénients : bloquera d'autres fils de discussion
2 ) Définir la valeur pour qu'elle n'expire jamais
Cette méthode peut être considérée comme la plus fiable et la plus sûre, mais elle prend de la place, consomme beaucoup de mémoire et ne peut pas conserver les données. à ce jour. Cela doit être basé sur une logique métier spécifique. À faire
Je pense que si vous souhaitez garder les données à jour, essayez ceci, pour référence seulement :
Démarrez une tâche planifiée ou utilisez TimerTask Timing, ces valeurs sont interrogées et mises à jour dans le cache à chaque période de temps. Bien sûr, le principe est que cela ne provoquera pas de pression excessive sur la base de données. (c'est très important)
3) Utiliser le verrouillage d'exclusion mutuelle (clé mutex)
Une approche courante dans l'industrie consiste à utiliser le mutex . Pour faire simple, lorsque le cache échoue (la valeur extraite est jugée vide), au lieu de charger la base de données immédiatement, vous utilisez d'abord certaines opérations de l'outil de mise en cache avec une valeur de retour d'opération réussie (comme SETNX ou Memcache de Redis ADD) pour définir une clé mutex. Lorsque l'opération est renvoyée avec succès, l'opération de chargement de la base de données est effectuée et le cache est restauré, sinon la méthode entière d'obtention du cache est réessayée.
SETNX est l'abréviation de "SET if Not eXists", ce qui signifie qu'il est défini uniquement lorsqu'il n'existe pas. Vous pouvez l'utiliser pour obtenir l'effet de verrouillage. Le délai d'expiration de setnx n'a pas été implémenté dans les versions antérieures à redis2.6.1, voici donc deux références de code de version :
public String get(key) { String value = redis.get(key); if (value == null) { //代表缓存值过期 //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功 value = db.get(key); redis.set(key, value, expire_secs); redis.del(key_mutex); return value; } else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可 sleep(10); get(key); //重试 } } else { return value; } }
Pour plus d'articles techniques liés à Redis, veuillez visiter Tutoriel de démarrage sur l'utilisation de la base de données Redis Chronique pour apprendre !
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!