2017-02-13 3 views
2

Je construis un service d'arrière-plan qui se résume à un système de files d'attente très compliqué. L'idée est d'utiliser Redis comme stockage non persistant, et d'avoir un schéma sub/pub qui s'exécute sur un intervalle.Comment mettre à jour des données dans Redis et MySQL en même temps?

Tous les abonnés seront derrière un équilibreur de charge. Cela supprime le problème complexe de la maintenance de l'état entre tous les serveurs derrière l'équilibreur de charge.

Mais, ceci introduit un nouveau problème ... comment puis-je m'assurer que les bases de données persistantes (Redis) et persistantes (MySQL) sont toutes deux mises à jour par mes applications?

Il semble que je sois obligé de prioriser un, et si je dois en prioriser un, je vais donner la priorité à la persistance. Mais, dans ce scénario, que se passe-t-il si MySQL est mis à jour, Redis ne l'est pas, et pour une raison quelconque j'ai perdu la connexion à MySQL et ne peux pas annuler ma dernière écriture?

Répondre

0

Il y a deux solutions possibles à votre problème:

  1. , procédez comme suit:
    a. Démarrer la transaction MySQL avec START TRANSACTION
    b. Exécutez votre requête MySQL INSERT INTO ...
    c. Exécutez votre commande Redis
    d. Terminez votre transaction MySQL avec l'instruction COMMIT si la commande Redis a réussi ou ROLLBACK si la commande a échoué
    L'utilisation de transctions garantit la cohérence des données dans les deux stockages.
  2. Ecrivez LUA script pour Redis en utilisant la bibliothèque LuaSQL (https://realtimelogic.com/ba/doc/en/lua/luasql.html), où vous vous connectez à MySQL, insérez vos données, puis envoyez des commandes à Redis. Ensuite, ce script LUA peut être appelé d'un côté client avec une seule commande EVAL ou EVALSHA