我将一些数据缓存在redis中,如果存在则从redis读取数据,否则从数据库读取数据并将数据写入redis.

我发现有几种方法可以在更新数据库后更新redis.例如:

  1. 将以红色表示的密钥设置为过期
  2. 在更新数据库之后立即更新redis.
  3. 将数据放入MQ并使用使用者更新Redis.

我有点困惑,不知道如何 Select .

你能告诉我每种方法的优缺点吗?最好告诉我其他方法来更新redis或推荐一些关于这个问题的博客.

推荐答案

实际的数据存储和缓存应该使用您在问题中已经描述的第三种方法进行同步.

当您将数据添加到最终存储区(即SQL数据库)时,您需要将这些数据排队到某个服务总线或消息队列中,并让某个异步服务使用某种后台进程来完成整个同步.

您不希望进入这种情况(当不使用服务总线和异步服务时):

  • 使您的请求或处理速度变慢,因为用户需要等待,直到数据同时存储在您的数据库和高速缓存中.
  • 在缓存过程中有失败的风险,并且无法拥有重试策略(这通常是服务总线或某些消息队列中的内置功能).此外,此故障可能会导致部分或全部缓存损坏,您将无法自动轻松地安排某些任务来修复此情况.

关于使用Redis密钥过期,这是个好主意.由于Redis可以使用其内置机制使密钥过期,因此您不应该从整个后台进程实现密钥过期.密钥是否存在是因为它仍然有效.

顺便说一句,您不会一直关注这种情况(如果密钥没有过期,就意味着它不应该被覆盖).这可能取决于您的实际域.

Database相关问答推荐

为Postgres数据库字段创建复合索引

使用自动递增主键将 csv 导入 sqlite

需要未提供的参数@ID?

Mysql - 在所有数据库中查找表

使用 Laravel 5.2 从存储在 Y-m-d 数据库中的日期计算年龄

便携式(PHPPass)密码哈希.我应该使用它们吗?

Entity Framework:如何检测对数据库的外部更改

如何最好地在 MS SQL Server 中复制整个数据库?

通过删除执行计划中的排序运算符来优化 SQL 查询

寻找基于磁盘的类 redis 数据库

单向和双向关系关系的区别

Postgresql 从多个表中删除多行

SQL Server 2008 中的 Open Table go 了哪里?

MySQL 数据库中列名中的连字符

表格字段可以包含连字符吗?

如何使用 Realm 进行排序?

MySQL 从一个数据库插入另一个数据库

Django:检测数据库后端

Data Mapper 是不是比 Active Record 更现代的趋势

数据库事务是否防止竞争条件?