Maison >Java >javaDidacticiel >Comment implémenter le cache multi-niveaux Redis basé sur Java
Une fois que la requête atteint Tomcat, elle va d'abord à Redis pour obtenir le cache. Si elle échoue, elle va à MySQL pour l'obtenir
tomcat
Le nombre de requêtes simultanées est beaucoup plus petit que celui de Redis, donc Tomcat deviendra un goulot d'étranglement
Utilisez chaque lien de traitement des requêtes pour ajouter du cache respectivement afin de réduire la pression sur Tomcat et améliorer les performances du service
Le cache est stocké dans la mémoire et la vitesse de lecture des données est rapide, ce qui peut réduire considérablement l'accès à la base de données et réduire la pression sur la base de données
Cache distribué, tel que redis
- Avantages : Grande capacité de stockage, bonne fiabilité, peut être utilisé en partage dans le cluster
- Inconvénients : Il y a une surcharge réseau pour accéder au cache
- Scénario : Grande quantité de données mises en cache, élevée fiabilité, données qui doivent être partagées dans le cluster
Traitement du cache local, tel que HashMap, GuavaCache
- Avantages : Lecture de la mémoire locale, pas de surcharge réseau, plus rapide
- Inconvénients : capacité de stockage limitée, faible fiabilité (comme perdu après redémarrage), ne peut pas être partagé dans le cluster
- Scénario : exigences de performances élevées, petite quantité de données en cache
Caffeine est une bibliothèque de cache local hautes performances développée sur base java8 qui fournit. taux de réussite presque optimal
Ceci est actuellement utilisé pour le cache interne du printemps
<dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>3.0.5</version> </dependency>
package com.erick.cache; import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import java.time.Duration; public final class CacheUtil { private static int expireSeconds = 2; public static Cache<String, String> cacheWithExpireSeconds; private static int maxPairs = 1; public static Cache<String, String> cacheWithMaxPairs; static { /*过期策略,写完60s后过期*/ cacheWithExpireSeconds = Caffeine.newBuilder() .expireAfterWrite(Duration.ofSeconds(expireSeconds)) .build(); /*过期策略,达到最大值后删除 * 1. 并不会立即删除,等一会儿才会删除 * 2. 会将之前存储的数据删除掉*/ cacheWithMaxPairs = Caffeine.newBuilder() .maximumSize(maxPairs) .build(); } /*从缓存中获取数据 * 1. 如果缓存中有,则直接从缓存中返回 * 2. 如果缓存中没有,则去数据查询并返回结果*/ public static String getKeyWithExpire(String key) { return cacheWithExpireSeconds.get(key, value -> { return getResultFromDB(); }); } public static String getKeyWithMaxPair(String key) { return cacheWithMaxPairs.get(key, value -> { return getResultFromDB(); }); } private static String getResultFromDB() { System.out.println("数据库查询"); return "db result"; } }
package com.erick.cache; import java.util.concurrent.TimeUnit; public class Test { @org.junit.Test public void test01() throws InterruptedException { CacheUtil.cacheWithExpireSeconds.put("name", "erick"); System.out.println(CacheUtil.getKeyWithExpire("name")); TimeUnit.SECONDS.sleep(3); System.out.println(CacheUtil.getKeyWithExpire("name")); } @org.junit.Test public void test02() throws InterruptedException { CacheUtil.cacheWithMaxPairs.put("name", "erick"); CacheUtil.cacheWithMaxPairs.put("age", "12"); System.out.println(CacheUtil.getKeyWithMaxPair("name")); System.out.println(CacheUtil.getKeyWithMaxPair("age")); TimeUnit.SECONDS.sleep(2); System.out.println(CacheUtil.getKeyWithMaxPair("name")); // 查询不到了 System.out.println(CacheUtil.getKeyWithMaxPair("age")); } }
2. Basé sur Canal La notification asynchrone
Principe de fonctionnement du canal 2.2
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!