web-dev-qa-db-fra.com

Quelle est la meilleure stratégie pour synchroniser les données Redis avec MySQL?

  1. Le cas d’utilisation est d’utiliser Redis comme cache local de MySQL
  2. Le format de données dans MySQL est le suivant: une clé primaire unique et plusieurs autres champs. Il n'y aura pas de requêtes cross table of db
  3. La clé Redis est la clé primaire dans MySQL et la valeur est un hachage contenant d'autres champs dans MySQL.
  4. Lorsque l'appareil est éteint, une perte de données inférieure à une minute est acceptable.

Ma solution est:

  1. Redis écrit un fichier AOF, un processus le surveillera et synchronisera les données mises à jour avec MySQL
  2. Hack Redis pour écrire AOF dans plusieurs fichiers, tout comme MySQL binlog
  3. L’interface de données ne lit et écrit que via Redis

Cette solution est-elle correcte? 
Et quelle est la meilleure stratégie pour faire ce travail?

18
pengdu

Vous n'avez besoin de rien pirater;)

Je ne suis pas tout à fait sûr de savoir pourquoi vous avez besoin des données sur mysql. Si je le savais, il y aurait peut-être une réponse plus appropriée. Dans tous les cas, en tant que réponse générique, vous pouvez utiliser notifications redis d'espaces de clés

Vous pouvez vous abonner aux commandes HSET, HMSET, HDEL et DEL sur vos clés afin de recevoir une notification chaque fois qu'une clé est supprimée ou qu'une valeur de hachage est définie ou supprimée.

Notez que si vous manquez une notification, vous auriez une incohérence. Donc, de temps en temps, vous pouvez simplement utiliser la commande SCAN pour parcourir toutes vos clés et vérifier sur mysql si elles doivent être mises à jour.

Une autre stratégie pourrait consister à maintenir deux structures distinctes. L'un serait le hachage avec les valeurs et l'autre serait un ZSET de toutes les valeurs triées par horodatage de mise à jour. Le meilleur moyen de maintenir les deux structures à jour serait d'écrire deux ou trois scripts lua (insert/update et delete) qui opéreraient de manière atomique sur le hachage et le zset.

Ensuite, vous pouvez simplement interroger périodiquement le ZSET pour les éléments dont l'horodatage est supérieur à votre dernière opération de synchronisation, obtenir toutes les clés mises à jour (elles incluraient les clés supprimées, à moins que vous ne souhaitiez conserver un deuxième ZSET exclusivement pour ces éléments), puis simplement récupérez tous les éléments par clé et synchronisez avec mysql.

J'espère que cela fonctionnera pour vous!

18
Javier Ramirez

vous pouvez implémenter redis réplication protocol.
mais il y a un github project pour vos demandes. 

la version stable est 2.5.0 

<dependency>
    <groupId>com.moilioncircle</groupId>
    <artifactId>redis-replicator</artifactId>
    <version>2.5.0</version>
</dependency>
1
leon chen

Lorsque vous mettez à jour des valeurs dans Redis, vous pouvez les placer dans une autre "File d'attente", telle que "List in Redis".

Si les données Redis ne sont pas trop nombreuses, utilisez simplement un planificateur pour vider toutes les données par lot dans Mysql.

0
songxin