Maison base de données Redis Comment Redis implémente la fonction d'extension du partage de données

Comment Redis implémente la fonction d'extension du partage de données

Nov 07, 2023 am 10:34 AM
partage de données Redis Extension de partage de données évolutivité de Redis

Comment Redis implémente la fonction dextension du partage de données

Redis est une base de données de valeurs-clés open source largement utilisée. Elle est privilégiée par les développeurs pour ses hautes performances, sa faible latence, sa concurrence élevée et d'autres avantages. Cependant, à mesure que la quantité de données continue d’augmenter, Redis à nœud unique ne peut plus répondre aux besoins de l’entreprise. Afin de résoudre ce problème, Redis a introduit la fonction de partage de données pour réaliser une expansion horizontale des données et améliorer les performances globales de Redis.

Cet article présentera comment Redis implémente la fonction d'expansion du partage de données et fournira des exemples de code spécifiques.

1. Principe du partage de données Redis

Le partage de données Redis fait référence au stockage d'un ensemble de données (tel qu'une valeur-clé) dans plusieurs instances Redis, ce qui signifie diviser un cluster Redis en plusieurs nœuds responsables de différentes données. La méthode de mise en œuvre spécifique est la suivante :

  1. Utilisez un algorithme de hachage cohérent

L'algorithme de hachage cohérent peut répartir uniformément les données sur plusieurs nœuds, et chaque nœud ne sera pas responsable de trop ou pas assez de données. Pour l’ajout de nouveaux nœuds, seule une petite quantité de migration de données est requise pour compléter l’équilibre des données.

  1. Ajouter des nœuds virtuels

Afin d'éviter un déséquilibre de charge des nœuds et un point de défaillance unique, vous pouvez ajouter plusieurs nœuds virtuels à chaque nœud physique et mapper ces nœuds virtuels à la collecte de données, afin que les données soient dispersées plus uniformément. sur chaque nœud physique.

2. Implémentation du partage de données Redis

Voici les étapes spécifiques à suivre par Redis pour implémenter la fonction de partage de données :

  1. Créer un cluster Redis

À l'aide de l'outil de cluster Redis, vous pouvez facilement et rapidement créer un cluster Redis cluster, qui ne sera pas décrit ici.

  1. Utiliser un algorithme de hachage cohérent

Redis fournit un allocateur d'emplacement de hachage, qui peut allouer des données à différents nœuds selon l'algorithme de hachage cohérent. L'exemple est le suivant :

hash_slot_cnt = 16384  # hash槽数量

def get_slot(s):
    return crc16(s) % hash_slot_cnt  # 根据字符串s计算其hash槽

class RedisCluster:
    def __init__(self, nodes):
        self.nodes = nodes  # 节点列表
        self.slot2node = {}

        for node in self.nodes:
            for slot in node['slots']:
                self.slot2node[slot] = node

    def get_node(self, key):
        slot = get_slot(key)
        return self.slot2node[slot]  # 根据key获取节点
Copier après la connexion
  1. Ajouter des nœuds virtuels

Pour éviter. un seul nœud contre le crash ou la surcharge, nous pouvons utiliser des nœuds virtuels. Les exemples sont les suivants :

virtual_node_num = 10  # 每个实际节点添加10个虚拟节点

class RedisCluster:
    def __init__(self, nodes):
        self.nodes = nodes
        self.slot2node = {}

        for node in self.nodes:
            for i in range(virtual_node_num):
                virtual_slot = crc16(node['host'] + str(i)) % hash_slot_cnt
                self.slot2node[virtual_slot] = node

    def get_node(self, key):
        slot = get_slot(key)
        return self.slot2node[slot]
Copier après la connexion
  1. Migration des données

Lorsqu'un nouveau nœud rejoint ou qu'un ancien nœud quitte le cluster, la migration des données est requise. Redistribuez les données initialement affectées à l'ancien nœud vers le nouveau nœud. L'exemple est le suivant :

def migrate_slot(from_node, to_node, slot):
    if from_node == to_node:  # 节点相同,不需要进行迁移
        return

    data = from_node['client'].cluster('getkeysinslot', slot, 10)
    print('migrate %d keys to node %s' % (len(data), to_node['host']))

    if data:
        to_node['client'].migrate(to_node['host'], hash_slot_cnt, '', 0, 1000, keys=data)
Copier après la connexion

3. Exemple de code complet

Ce qui suit est un exemple de code complet permettant à Redis d'implémenter la fonction d'expansion du partage de données :

import redis

hash_slot_cnt = 16384  # hash槽数量
virtual_node_num = 10  # 每个实际节点添加10个虚拟节点

def get_slot(s):
    return crc16(s) % hash_slot_cnt

def migrate_slot(from_node, to_node, slot):
    if from_node == to_node:
        return

    data = from_node['client'].cluster('getkeysinslot', slot, 10)
    print('migrate %d keys to node %s' % (len(data), to_node['host']))

    if data:
        to_node['client'].migrate(to_node['host'], hash_slot_cnt, '', 0, 1000, keys=data)

class RedisCluster:
    def __init__(self, nodes):
        self.nodes = nodes
        self.slot2node = {}

        for node in self.nodes:
            for i in range(virtual_node_num):
                virtual_slot = crc16(node['host'] + str(i)) % hash_slot_cnt
                self.slot2node[virtual_slot] = node

    def get_node(self, key):
        slot = get_slot(key)
        return self.slot2node[slot]

    def add_node(self, node):
        self.nodes.append(node)

        for i in range(virtual_node_num):
            virtual_slot = crc16(node['host'] + str(i)) % hash_slot_cnt
            self.slot2node[virtual_slot] = node

        for slot in range(hash_slot_cnt):
            if self.slot2node[slot]['host'] == node['host']:
                migrate_slot(self.slot2node[slot], node, slot)

    def remove_node(self, node):
        self.nodes.remove(node)

        for i in range(virtual_node_num):
            virtual_slot = crc16(node['host'] + str(i)) % hash_slot_cnt
            del self.slot2node[virtual_slot]

        for slot in range(hash_slot_cnt):
            if self.slot2node[slot]['host'] == node['host']:
                new_node = None

                for i in range(len(self.nodes)):
                    if self.nodes[i]['host'] != node['host'] and self.nodes[i]['slots']:
                        new_node = self.nodes[i]
                        break

                if new_node:
                    migrate_slot(node, new_node, slot)
                else:
                    print('no new node for slot %d' % slot)

if __name__ == '__main__':
    nodes = [
        {'host': '127.0.0.1', 'port': 7000, 'slots': [0, 1, 2]},
        {'host': '127.0.0.1', 'port': 7001, 'slots': [3, 4, 5]},
        {'host': '127.0.0.1', 'port': 7002, 'slots': [6, 7, 8]},
        {'host': '127.0.0.1', 'port': 7003, 'slots': []},
        {'host': '127.0.0.1', 'port': 7004, 'slots': []},
        {'host': '127.0.0.1', 'port': 7005, 'slots': []},
        {'host': '127.0.0.1', 'port': 7006, 'slots': []},
        {'host': '127.0.0.1', 'port': 7007, 'slots': []},
        {'host': '127.0.0.1', 'port': 7008, 'slots': []},
        {'host': '127.0.0.1', 'port': 7009, 'slots': []},
    ]

    clients = []
    for node in nodes:
        client = redis.Redis(host=node['host'], port=node['port'])
        node['client'] = client
        clients.append(client)

    cluster = RedisCluster(nodes)

    for key in range(100):
        node = cluster.get_node(str(key))
        node['client'].set('key_%d' % key, key)

    cluster.add_node({'host': '127.0.0.1', 'port': 7010, 'slots': []})

    for key in range(100, 200):
        node = cluster.get_node(str(key))
        node['client'].set('key_%d' % key, key)

    cluster.remove_node(nodes[-1])
Copier après la connexion

Le code ci-dessus crée un cluster Redis, ajoute de nouveaux nœuds et supprime les anciens. nœuds, démontrant la dispersion de l’équilibre des données et la migration des données.

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
3 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 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

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)

Comment choisir une clé de fragment dans le cluster redis? Comment choisir une clé de fragment dans le cluster redis? Mar 17, 2025 pm 06:55 PM

L'article discute du choix des clés de fragment dans le cluster Redis, mettant l'accent sur leur impact sur les performances, l'évolutivité et la distribution des données. Les problèmes clés incluent d'assurer une distribution de données, une alignement sur les modèles d'accès et d'éviter les erreurs courantes L

Comment mettre en œuvre l'authentification et l'autorisation dans Redis? Comment mettre en œuvre l'authentification et l'autorisation dans Redis? Mar 17, 2025 pm 06:57 PM

L'article discute de la mise en œuvre de l'authentification et de l'autorisation dans Redis, en se concentrant sur l'activation de l'authentification, en utilisant les ACL et les meilleures pratiques pour sécuriser Redis. Il couvre également la gestion des autorisations et des outils des utilisateurs pour améliorer la sécurité Redis.

Comment utiliser Redis pour les files d'attente et le traitement des antécédents? Comment utiliser Redis pour les files d'attente et le traitement des antécédents? Mar 17, 2025 pm 06:51 PM

L'article discute de l'utilisation de Redis pour les files d'attente de travaux et le traitement des antécédents, la configuration de détail, la définition du travail et l'exécution. Il couvre les meilleures pratiques comme les opérations atomiques et la hiérarchisation des travaux, et explique comment Redis améliore l'efficacité du traitement.

Comment mettre en œuvre des stratégies d'invalidation du cache dans Redis? Comment mettre en œuvre des stratégies d'invalidation du cache dans Redis? Mar 17, 2025 pm 06:46 PM

L'article traite des stratégies de mise en œuvre et de gestion de l'invalidation du cache dans Redis, y compris l'expiration basée sur le temps, les méthodes axées sur les événements et le versioning. Il couvre également les meilleures pratiques pour l'expiration du cache et les outils pour la surveillance et l'automate

Comment surveiller les performances d'un cluster redis? Comment surveiller les performances d'un cluster redis? Mar 17, 2025 pm 06:56 PM

L'article traite de la surveillance des performances et de la santé du cluster Redis à l'aide d'outils comme Redis CLI, Redis Insight et des solutions tierces comme Datadog et Prometheus.

Comment utiliser Redis pour les messages pub / sous? Comment utiliser Redis pour les messages pub / sous? Mar 17, 2025 pm 06:48 PM

L'article explique comment utiliser Redis pour les messages pub / sous, couvrant la configuration, les meilleures pratiques, assurer la fiabilité des messages et la surveillance des performances.

Comment utiliser Redis pour la gestion des sessions dans les applications Web? Comment utiliser Redis pour la gestion des sessions dans les applications Web? Mar 17, 2025 pm 06:47 PM

L'article traite de l'utilisation de Redis pour la gestion des sessions dans les applications Web, de la configuration de détail, des avantages tels que l'évolutivité et les performances et les mesures de sécurité.

Comment assurer Redis contre les vulnérabilités communes? Comment assurer Redis contre les vulnérabilités communes? Mar 17, 2025 pm 06:57 PM

L'article traite de la sécurisation Redis contre les vulnérabilités, en se concentrant sur des mots de passe forts, une liaison réseau, une désactivation des commandes, l'authentification, le chiffrement, les mises à jour et la surveillance.

See all articles