Le magasin de données et le cache réels doivent être synchronisés à l'aide de la troisième approche que vous avez déjà décrite dans votre question.
Lorsque vous ajoutez des données à votre magasin définitif (c'est-à-dire votre base de données SQL), vous devez mettre ces données en file d'attente dans un bus de service ou une file d'attente de messages, et laisser un service asynchrone effectuer toute la synchronisation en utilisant une sorte de processus d'arrière-plan.
Vous ne voulez pas entrer dans ces cas (lorsque vous n'utilisez pas un bus de service et un service asynchrone) :
- Rendez vos requêtes ou vos processus plus lents, car l'utilisateur doit attendre que les données soient à la fois stockées dans votre base de données et dans le cache.
- Avoir le risque d'échouer pendant le processus de mise en cache et de ne pas pouvoir avoir de politique de nouvelle tentative (qui est généralement une fonctionnalité intégrée dans un bus de service ou certaines files d'attente de messages). De plus, cet échec peut entraîner une corruption partielle ou complète du cache et vous ne pourrez pas planifier automatiquement et facilement certaines tâches pour résoudre cette situation.
À propos de l'expiration de la clé Redis, c'est une bonne idée. Étant donné que Redis peut faire expirer les clés à l'aide de son mécanisme intégré, vous ne devez pas implémenter l'expiration des clés à partir de l'ensemble du processus d'arrière-plan. Si une clé existe, c'est parce qu'elle est toujours valide.
BTW, vous ne serez pas toujours dans ce cas (si une clé n'est pas expirée, cela signifie qu'elle ne doit pas être écrasée). Cela peut dépendre de votre domaine actuel.