
文章插图
Write Behind 模式的算法是:
1)对于不可变操作(读?。??
此策略不处理不可变操作 。它应该与通读模式相结合 。
2)对于可变操作(创建、更新、删除):
客户端只需要在 Redis 中创建、更新或删除条目 。缓存层将更改保存到消息队列中并向客户端返回成功 。更改会异步复制到 MySQL , 并且可能在 Redis 向客户端发送成功响应后发生 。
后写模式与直写不同,因为它异步地将更改复制到 MySQL 。它提高了吞吐量,因为客户端不必等待复制发生 。具有高持久性的消息队列可能是一种可能的实现 。Redis 流(自 Redis 5.0 起受支持)可能是一个不错的选择 。为了进一步提高性能,可以结合更改并批量更新 MySQL(以节省查询次数) 。
Write Behind 模式的缺点是相似的 。首先,许多缓存层本身并不支持这一点 。其次,使用的消息队列必须是 FIFO(先进先出) 。否则,对 MySQL 的更新可能会乱序,因此最终结果可能不正确 。
回写缓存提高了写入性能,适用于写入繁重的工作负载 。与通读结合使用时,它适用于混合工作负载,其中最近更新和访问的数据始终在缓存中可用 。
它对数据库故障具有弹性,并且可以容忍一些数据库停机时间 。如果支持批处理或合并,它可以减少对数据库的总体写入 , 从而减少负载并降低成本,如果数据库提供程序按请求数量收费,例如动态数据库 。请记?。?DAX 是直写的,因此如果应用程序写入繁重 , 则不会看到任何成本降低 。
一些开发人员将 Redis 用于缓存和回写,以更好地吸收峰值负载期间的峰值 。主要缺点是如果缓存失败,数据可能会永久丢失 。
大多数关系数据库存储引擎(即 InnoDB)在其内部默认启用回写缓存 。查询首先写入内存并最终刷新到磁盘 。
3、Write invalidate:类似于直写,先写入数据库,然后使缓存无效 。在并发更新的情况下,这简化了缓存和数据库之间的一致性处理 。我们不需要复杂的同步 , 权衡是命中率较低 , 因为我们总是使缓存无效并且下一次读取将始终未命中 。
读模型Read Through:即“ 通读 ” 。当读取未命中时,需要从数据库中加载并保存到缓存中 。这种模式的主要问题是基于某些特定的场景有时需要预热缓存 。通读缓存与数据库保持一致 。当缓存未命中时,它会从数据库中加载丢失的数据,填充缓存并将其返回给应用程序 。

文章插图
通读模式的算法是:
1、对于不可变操作(读?。??
客户端将始终简单地从缓存中读取 。缓存命中或缓存未命中对客户端是透明的 。如果是缓存未命中,缓存应该具有自动从数据库中获取的能力 。
2、对于可变操作(创建、更新、删除):
此策略不处理可变操作 。它应该与直写(或后写)模式结合使用 。
通读模式的一个主要缺点是许多缓存层可能不支持它 。例如 , Redis 将无法自动从 MySQL 获?。ǔ?俏?Redis 编写插件) 。
Cache-Aside 和 Read-Through 策略都是延迟加载数据,即仅在第一次读取时加载 。其适用 用例场景如下所示:
虽然 Read- Through 和 Cache-Aside 非常相似,但至少有两个关键区别:
在缓存侧,应用程序负责从数据库中获取数据并填充缓存 。在通读中 , 此逻辑通常由库或独立缓存提供程序支持 。
与 Cache-Aside 不同,Read-Through Cache 中的数据模型不能与数据库的数据模型不同 。
当多次请求相同的数据时,通读缓存最适合读取繁重的工作负载 。例如,一个新闻故事 。缺点是当第一次请求数据时 , 总是会导致缓存未命中,并招致将数据加载到缓存中的额外惩罚 。开发人员通过手动发出查询来“加热”或“预热”缓存来处理这个问题 。就像 cache-aside 一样,缓存和数据库之间的数据也有可能不一致 , 解决方法在于写入策略,我们将在下面看到 。
不读或不写模型Refresh ahead:预测热点数据并自动刷新数据库中的缓存,永不阻塞读?。?钍屎闲⌒椭欢潦?菁? ,例如邮政编码列表缓存,我们可以定期刷新整个缓存,因为它很小并且是只读的 。如果能够可以准确地预测最常读取哪些键,那么,还可以在此模式中预热这些键 。最后,如果数据在系统之外更新而系统无法收到通知,可能必须使用此模式 。
推荐阅读
- 一文读懂 Transformer 神经网络模型
- Redis Stream 数据结构实现原理真的很强
- 一文学会Linux内核的编译和调试
- 一文带你了解Docker与Containerd的区别
- 面试为啥都问Redis缓存?赶紧补一下
- 一台服务器上部署 Redis 伪集群
- 为什么创建 Redis 集群时会自动错开主从节点?
- 王者荣耀的段位排行榜是通过Redis实现的?
- Redis断连该如何抢救?
- 一文搞懂Redis架构演化之路
