Maison  >  Article  >  développement back-end  >  Créez un serveur de cache hautement disponible en utilisant le langage Go

Créez un serveur de cache hautement disponible en utilisant le langage Go

WBOY
WBOYoriginal
2023-06-19 09:40:37932parcourir

Dans les systèmes distribués modernes, la mise en cache est un composant indispensable qui peut améliorer considérablement les performances et l'évolutivité du système. Cependant, à mesure que la taille du système augmente, la disponibilité du serveur de cache devient un problème de plus en plus sérieux. Par conséquent, nous devons créer un serveur de cache hautement disponible pour garantir la stabilité du système. Dans cet article, nous présenterons comment créer un serveur de cache hautement disponible à l'aide du langage Go.

1. Comment choisir un serveur de cache

Lors du choix d'un serveur de cache, nous devons prendre en compte les facteurs suivants :

  1. Cohérence des données Sexe

Dans les systèmes distribués, la cohérence des données est un problème central. Nous devons nous assurer que les données dans le cache sont toujours à jour et non obsolètes ou incohérentes.

  1. Performance

Les hautes performances sont une caractéristique essentielle d'un bon serveur de cache. Nous devons nous assurer que le serveur de cache peut répondre aux demandes rapidement et avec le moins de latence possible.

  1. Évolutivité

Les serveurs de cache doivent avoir une bonne évolutivité afin que nous puissions augmenter le nombre de serveurs à mesure que la charge augmente. La haute disponibilité est une autre caractéristique importante des serveurs de cache. Nous devons garantir que même en cas de panne d’un serveur, le système fonctionnera toujours correctement.

    Sur la base des considérations ci-dessus, nous pouvons choisir les serveurs de cache suivants :
Memcached

Memcached Serveur de mise en cache basé sur la mémoire extrêmement rapide, évolutif et stable. Cependant, Memcached ne prend pas en charge la persistance des données, ce qui signifie que si le serveur tombe en panne, toutes les données seront perdues.

  1. Redis

Redis est une base de données en mémoire qui prend en charge les structures de données clé-valeur. Il prend non seulement en charge la persistance des données, mais fournit également des fonctionnalités avancées telles que la publication/abonnement, les transactions et les scripts Lua. En raison de la nature monothread de Redis, il fonctionne très bien lors du traitement de requêtes simultanées élevées.

  1. Couchbase

Couchbase est un serveur de cache distribué basé sur la mémoire qui prend en charge les données de clé-valeur et de type de document. L'un des avantages de Couchbase est sa capacité à rééquilibrer automatiquement les données pour garantir performances et évolutivité.

    Sur la base des facteurs ci-dessus, j'ai choisi Redis comme solution d'implémentation du serveur de cache haute disponibilité présenté dans cet article.
  1. 2. Utilisez le langage Go pour créer un serveur de cache hautement disponible

Dans cette section, nous présenterons comment utiliser le langage Go pour créer un serveur de cache hautement disponible.

Installer Redis

Tout d'abord, nous devons installer Redis. La méthode d'installation spécifique dépasse le cadre de cet article. Les lecteurs peuvent se référer à la documentation officielle de Redis ou à d'autres didacticiels.

  1. Connexion de Redis

En langage Go, nous pouvons utiliser des bibliothèques tierces github.com/go-redis/redis pour vous connecter au serveur Redis. Le code spécifique est le suivant :

import "github.com/go-redis/redis"

func main() {
    // 创建Redis客户端
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    // 测试连接
    pong, err := client.Ping().Result()
    fmt.Println(pong, err)
}
  1. Implémentation de la logique de mise en cache

Ensuite, nous devons implémenter une logique de mise en cache spécifique en fonction des besoins de l'entreprise. Dans cet article, nous implémentons une logique de cache de base, comprenant le cache de lecture, le cache d'écriture et le cache de suppression. Le code spécifique est le suivant : github.com/go-redis/redis 来连接 Redis 服务器。具体的代码如下:

// 读取缓存
func get(key string) (string, error) {
    val, err := client.Get(key).Result()
    if err == redis.Nil {
        return "", nil
    } else if err != nil {
        return "", err
    } else {
        return val, nil
    }
}

// 写入缓存
func set(key string, val string) error {
    err := client.Set(key, val, 0).Err()
    if err != nil {
        return err
    } else {
        return nil
    }
}

// 删除缓存
func del(key string) error {
    err := client.Del(key).Err()
    if err != nil {
        return err
    } else {
        return nil
    }
}
  1. 实现缓存逻辑

接下来,我们需要根据业务需求实现具体的缓存逻辑。在本文中,我们实现一个基本的缓存逻辑,包括读取缓存、写入缓存和删除缓存。具体的代码如下:

// 创建Redis客户端
client := redis.NewFailoverClient(&redis.FailoverOptions{
    MasterName:    "mymaster",
    SentinelAddrs: []string{"localhost:26379"},
    Password:      "password",
})
  1. 实现高可用性

为了实现高可用性,我们需要使用 Redis 的主从复制功能。具体的步骤如下:

  • 在 Redis 主服务器上设置密码,并将 Redis 配置文件中的 requirepass 配置项设置为该密码。
  • 在 Redis 从服务器上,编辑 Redis 配置文件,将 slaveof 配置项设置为主服务器的地址和端口,如: slaveof localhost 6379
  • 在Go程序中,使用 github.com/go-redis/redis 库的 NewFailoverClient
    import (
        "fmt"
        "github.com/go-redis/redis"
    )
    
    var client *redis.Client
    
    func main() {
        // 创建Redis客户端
        client = redis.NewClient(&redis.Options{
            Addr:     "localhost:6379",
            Password: "password",
            DB:       0,
        })
    
        // 测试连接
        pong, err := client.Ping().Result()
        if err != nil {
            fmt.Println("Failed to connect to Redis!")
            return
        }
        fmt.Println("Connected to Redis:", pong)
    
        // 缓存操作示例
        key := "foo"
        val := "bar"
        set(key, val)
        res, err := get(key)
        if err != nil {
            fmt.Println("Failed to get value from cache!")
        } else {
            fmt.Println("Value from cache:", res)
        }
        del(key)
    }
    
    // 读取缓存
    func get(key string) (string, error) {
        val, err := client.Get(key).Result()
        if err == redis.Nil {
            return "", nil
        } else if err != nil {
            return "", err
        } else {
            return val, nil
        }
    }
    
    // 写入缓存
    func set(key string, val string) error {
        err := client.Set(key, val, 0).Err()
        if err != nil {
            return err
        } else {
            return nil
        }
    }
    
    // 删除缓存
    func del(key string) error {
        err := client.Del(key).Err()
        if err != nil {
            return err
        } else {
            return nil
        }
    }
Atteindre la haute disponibilité

Afin d'atteindre la haute disponibilité, nous devons utiliser le maître-esclave fonction de réplication de Redis. Les étapes spécifiques sont les suivantes :

      Définissez un mot de passe sur le serveur principal Redis et définissez l'élément de configuration requirepass dans le fichier de configuration Redis sur le mot de passe.
    1. Sur le serveur esclave Redis, modifiez le fichier de configuration Redis et définissez l'élément de configuration slaveof sur l'adresse et le port du serveur maître, tel que : slaveof localhost 6379.

    Dans le programme Go, utilisez la méthode NewFailoverClient de la bibliothèque github.com/go-redis/redis pour vous connecter au serveur Redis. Cette méthode détecte automatiquement l'état du serveur maître Redis et des serveurs esclaves et achemine automatiquement les demandes de lecture et d'écriture.

    Le code spécifique est le suivant : #🎜🎜#rrreee#🎜🎜#Dans cet exemple, nous utilisons Redis Sentinel pour implémenter la commutation maître-esclave. Sentinel est un composant de Redis qui peut surveiller automatiquement l'état des nœuds maître et esclave Redis et basculer vers le serveur de sauvegarde lorsque le serveur maître n'est pas disponible. #🎜🎜##🎜🎜##🎜🎜#Exemple de code complet#🎜🎜##🎜🎜#rrreee#🎜🎜#3 Résumé#🎜🎜##🎜🎜#Cet article présente comment utiliser le langage Go pour construire haut. disponibilité du serveur de cache, y compris la connexion à Redis, la mise en œuvre de la logique de mise en cache et l'obtention d'une haute disponibilité. L'utilisation de Redis comme serveur de cache peut améliorer les performances et l'évolutivité du système, tout en garantissant la haute disponibilité du système via le mécanisme de réplication maître-esclave. J'espère que cet article pourra aider les lecteurs à mieux comprendre comment le cache distribué est implémenté. #🎜🎜#

    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