Table des matières
1. Mise en cache à plusieurs niveaux
1. Schéma de mise en cache traditionnel
2. Schéma de mise en cache à plusieurs niveaux
2. Cache local JVM
1 Cas pratique
3. Propriétés de cohérence du cache
1.1.1 Définir la période de validité
Maison Java javaDidacticiel Comment implémenter le cache multi-niveaux Redis basé sur Java

Comment implémenter le cache multi-niveaux Redis basé sur Java

May 13, 2023 pm 07:52 PM
java redis

1. Mise en cache à plusieurs niveaux

1. Schéma de mise en cache traditionnel

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

Comment implémenter le cache multi-niveaux Redis basé sur Java

2. Schéma de mise en cache à plusieurs niveaux

  • 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

Comment implémenter le cache multi-niveaux Redis basé sur Java

2. Cache local JVM

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

1 Cas pratique

  • 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>
Copier après la connexion
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";
    }
}
Copier après la connexion
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"));
    }
}
Copier après la connexion

3. Propriétés de cohérence du cache

1.1.1 Définir la période de validité

    Définir la période de validité de. le cache et le supprime automatiquement après expiration. Il peut être mis à jour lors d'une nouvelle requête
  • Avantages : Simple et pratique
  • Inconvénients : Mauvaise rapidité, le cache peut être incohérent avant son expiration
  • Scénario : Entreprise avec une faible fréquence de mise à jour et de faibles exigences de rapidité
  • 1.2 Double écriture synchrone
    Modifier directement le cache en modifiant la base de données
  • Avantages : intrusion de code, forte cohérence entre cache et base de données
  • Inconvénients : saisie de code, couplage élevé
  • Scénario : Mettre en cache des données avec des exigences élevées de cohérence et d'invalidité
  • 1.3 Notification asynchrone
    Envoyer des notifications d'événements lorsque la base de données est modifiée et que les services associés modifient les données mises en cache après l'avoir écoutée
  • Avantages : faible couplage, peut être notifié en même temps Plusieurs services de cache
  • Inconvénients : Rapidité, il peut y avoir des problèmes d'incohérence du cache
  • Scénario : La rapidité est moyenne, plusieurs services doivent être synchronisés

Comment implémenter le cache multi-niveaux Redis basé sur Java

Comment implémenter le cache multi-niveaux Redis basé sur Java2. Basé sur Canal La notification asynchrone

    est un projet open source sous Alibaba, développé sur la base de Java
  • Basé sur l'analyse incrémentielle des journaux de base de données, fournissant un abonnement et une consommation de données incrémentielles
  • basé sur l'idée de sauvegarde maître-esclave de mysql
  • Réplication maître-esclave mysql 2.1

Comment implémenter le cache multi-niveaux Redis basé sur JavaPrincipe de fonctionnement du canal 2.2

    canal simule le protocole d'interaction de l'esclave MySQL, se déguise en esclave MySQL, envoie le protocole de vidage vers le maître MySQL
  • Le maître MySQL reçoit une demande de vidage, commencez à pousser le journal binaire vers l'esclave (c'est-à-dire le canal)
  • canal analyse l'objet du journal binaire (à l'origine un flux d'octets)

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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Pourquoi une erreur se produit-elle lors de l'installation d'une extension à l'aide de PECL dans un environnement Docker? Comment le résoudre? Pourquoi une erreur se produit-elle lors de l'installation d'une extension à l'aide de PECL dans un environnement Docker? Comment le résoudre? Apr 01, 2025 pm 03:06 PM

Causes et solutions pour les erreurs Lors de l'utilisation de PECL pour installer des extensions dans un environnement Docker Lorsque nous utilisons un environnement Docker, nous rencontrons souvent des maux de tête ...

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Java Made Simple : un guide du débutant sur la puissance de programmation Java Made Simple : un guide du débutant sur la puissance de programmation Oct 11, 2024 pm 06:30 PM

Java Made Simple : Guide du débutant sur la puissance de programmation Introduction Java est un langage de programmation puissant utilisé dans tout, des applications mobiles aux systèmes d'entreprise. Pour les débutants, la syntaxe de Java est simple et facile à comprendre, ce qui en fait un choix idéal pour apprendre la programmation. Syntaxe de base Java utilise un paradigme de programmation orienté objet basé sur les classes. Les classes sont des modèles qui organisent ensemble les données et les comportements associés. Voici un exemple simple de classe Java : publicclassPerson{privateStringname;privateintage;

La compilation et l'installation de redis sur le mac de puce Apple M1 ont échoué. Comment dépanner les erreurs de compilation PHP7.3? La compilation et l'installation de redis sur le mac de puce Apple M1 ont échoué. Comment dépanner les erreurs de compilation PHP7.3? Mar 31, 2025 pm 11:39 PM

Problèmes et solutions rencontrés lors de la compilation et de l'installation de Redis sur Apple M1 Chip Mac, de nombreux utilisateurs peuvent ...

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

Comment déclencher l'arrière-plan Asynchronous Batch Envoi de SMS au premier plan sans affecter l'expérience utilisateur? Comment déclencher l'arrière-plan Asynchronous Batch Envoi de SMS au premier plan sans affecter l'expérience utilisateur? Mar 31, 2025 pm 11:45 PM

Comment implémenter la fonction de déclenchement de l'arrière-plan Asynchrone Lot Envoi de SMS au premier plan? Dans certains scénarios d'application, les utilisateurs doivent déclencher un lot court en arrière-plan grâce aux opérations de premier plan ...

See all articles