Maison  >  Article  >  développement back-end  >  Comment créer un système de mise en cache simple dans Golang

Comment créer un système de mise en cache simple dans Golang

PHPz
PHPzoriginal
2023-04-03 11:50:00645parcourir

La mise en cache est une technique courante d'optimisation des performances. Dans les systèmes informatiques modernes, nous stockons souvent les données fréquemment utilisées en mémoire pour un accès plus rapide. Dans les applications Web, le mécanisme de mise en cache peut réduire la pression sur la base de données et améliorer la vitesse de réponse de l'application.

Golang fournit un excellent mécanisme de concurrence et un excellent modèle de gestion de la mémoire, il est donc très approprié pour la mise en œuvre d'un système de mise en cache hautes performances. Dans cet article, nous apprendrons comment créer un système de mise en cache simple à l'aide de Golang.

  1. Concept de base

Le système de mise en cache le plus simple consiste à stocker les données dans une carte. Map est l'une des structures de données intégrées les plus importantes de Golang, qui permet des opérations de requête rapides. Nous pouvons considérer une carte comme un ensemble de paires clé-valeur, où la clé est unique et correspond à chaque valeur.

Nous pouvons utiliser le code suivant pour créer une carte :

cache := make(map[string]string)

Ensuite, nous pouvons ajouter des données à la carte :

cache["key"] = "value"

Ensuite, nous pouvons interroger la valeur en fonction de la clé :

val, ok := cache["key"]
if ok {
    fmt.Println(val)
}

Nous pouvons utiliser map pour implémenter une Système de mise en cache simple pour stocker les données extraites de la base de données. Étant donné que l’interrogation de la base de données prend un certain temps, nous pouvons éviter d’interroger la base de données à plusieurs reprises en stockant les données dans une carte. De cette façon, nous pouvons utiliser la mise en cache pour améliorer les performances de notre application.

  1. Méthode de base

Nous pouvons utiliser map et mutex pour implémenter un système de mise en cache de base. L'utilisation de mutex pour implémenter le contrôle de concurrence peut éviter le problème de plusieurs goroutines accédant à la carte en même temps. L'implémentation spécifique est la suivante :

type Cache struct {
    items map[string]string
    sync.Mutex
}

func (c *Cache) Set(key, val string) {
    c.Lock()
    defer c.Unlock()
    c.items[key] = val
}

func (c *Cache) Get(key string) (string, bool) {
    c.Lock()
    defer c.Unlock()
    val, ok := c.items[key]
    return val, ok
}

Dans ce système de cache, nous définissons une structure Cache pour sauvegarder tous les éléments du cache. items est une carte utilisée pour stocker des éléments de données. Nous définissons également deux méthodes, Set et Get, pour définir et obtenir respectivement les éléments du cache. Les deux méthodes utilisent un mutex pour garantir la sécurité des threads.

  1. Politique d'expiration

Dans les applications pratiques, nous devons généralement définir une politique d'expiration. Sans utiliser de politique d'expiration, nous ne pouvons pas supprimer périodiquement les éléments de données expirés dans le cache. Par conséquent, les performances du système de mise en cache sont affectées négativement. Dans Golang, nous pouvons utiliser le type Time dans le package time pour calculer le délai d'expiration des éléments du cache.

Tout d'abord, dans la structure Cache, nous devons ajouter un champ expires pour spécifier le délai d'expiration de chaque élément du cache :

type cacheItem struct {
    value    string
    expireAt time.Time
}

type Cache struct {
    items map[string]cacheItem
    sync.Mutex
}

Ensuite, dans la méthode Get, nous devons vérifier si l'élément du cache a expiré. S'il expire, nous devons le supprimer et renvoyer false :

func (c *Cache) Get(key string) (string, bool) {
    c.Lock()
    defer c.Unlock()
    item, ok := c.items[key]
    if !ok {
        return "", false
    }
    if item.expireAt.Before(time.Now()) {
        delete(c.items, key)
        return "", false
    }
    return item.value, true
}

En même temps, nous devons également ajouter une méthode pour nettoyer régulièrement les éléments du cache expirés :

func (c *Cache) cleanUp() {
    for {
        time.Sleep(time.Minute)
        c.Lock()
        for key, item := range c.items {
            if item.expireAt.Before(time.Now()) {
                delete(c.items, key)
            }
        }
        c.Unlock()
    }
}

Cette méthode utilise Sleep pour vérifier régulièrement si l'élément du cache a expiré et supprimez-le Éléments du cache expirés.

  1. Résumé

Dans cet article, nous avons appris comment créer un système de mise en cache simple à l'aide de Golang. Nous utilisons map et mutex pour implémenter le stockage des données et le contrôle de concurrence, et utilisons le type Time dans le package time pour spécifier l'heure d'expiration. En implémentant un nettoyage régulier des éléments de cache expirés dans la méthode Get, nous évitons le problème de dégradation des performances du système de cache. Ce système de mise en cache simple peut être étendu pour améliorer les performances et l’évolutivité des applications.

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:
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