(六) Redis缓存读写策略

news/2024/2/27 23:50:32

一 引言

缓存的引入后极大的提高了服务器的访问速率,但是当持久化数据发生变化时,如何更新缓存成为了研发中不可规避的问题,不同的方案决定缓存的最终的一致性,本文就redis的缓存读写策略,以及其他的缓存读写策略做简要概述

二 Cache Aside Pattern(旁路缓存模式)

Cache Aside Pattern是一种比较常用的缓存模式,适合读比较多的场景

Cache Aside Pattern 中服务端需要同时维系db和cache,并且是以db 的结果为准。

2.1 读写策略

在这里插入图片描述
写策略

  • 新更新db
  • 然后直接删除cache

读策略

  • 从cache中读取数据,读取到数据就直接返回
  • cache中读不到的话,就从db中读取数据返回
  • 再把读取到是数据放到cache中

2.2 缓存更新顺序

2.2.1 先更新缓存,在更新DB

假设「请求 A 」和「请求 B 」两个请求,同时更新「同一条」数据,则可能出现这样的顺序
A 请求先将缓存的数据更新为 1,然后在更新数据库前,B 请求来了, 将缓存的数据更新为 2,紧接着把数据库更新为 2,然后 A 请求将数据库的数据更新为 1, 出现了缓存和数据库中的数据不一致的现象

在这里插入图片描述

2.2.2 先更新DB,在更新缓存

请求 A 」和「请求 B 」两个请求,同时更新「同一条」数据,则可能出现这样的顺序:
A 请求先将数据库的数据更新为 1,然后在更新缓存前,请求 B 将数据库的数据更新为 2,紧接着也把缓存更新为 2,然后 A 请求更新缓存为 1。此时,数据库中的数据是 2,而缓存中的数据却是 1, 出现了缓存和数据库中的数据不一致的现象
在这里插入图片描述

2.2.3 先删除缓存,再更新数据库

假设某个用户的年龄是 20,请求 A 要更新用户年龄为 21,所以它会删除缓存中的内容。这时,另一个请求 B 要读取这个用户的年龄,它查询缓存发现未命中后,会从数据库中读取到年龄为 20,并且写入到缓存中,然后请求 A 继续更改数据库,将用户的年龄更新为 21
在这里插入图片描述
最终,该用户年龄在缓存中是 20(旧值),在数据库中是 21(新值),缓存和数据库的数据不一致。
可以看到,先删除缓存,再更新数据库,在并发的时候,还是会出现缓存和数据库的数据不一致的问题

2.2.4 先更新数据库,再删除缓存

假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存中。

在这里插入图片描述
最终,该用户年龄在缓存中是 20(旧值),在数据库中是 21(新值),缓存和数据库数据不一致。

从上面的理论上分析,先更新数据库,再删除缓存也是会出现数据不一致性的问题,但是在实际中,这个问题出现的概率并不高。
因为缓存的写入通常要远远快于数据库的写入,所以在实际中很难出现请求 B 已经更新了数据库并且删除了缓存,请求 A 才更新完缓存的情况。

2.3 Cache Aside Pattern 的缺陷

缺陷 1:首次请求数据一定不在 cache 的问题

解决办法:可以将热点数据可以提前放入 cache 中。

缺陷 2:写操作比较频繁的话导致 cache 中的数据会被频繁被删除,这样会影响缓存命中率 。

解决办法:

  • 数据库和缓存数据强一致场景 :更新 db 的时候同样更新 cache,不过我们需要加一个锁/分布式锁来保证更新 cache 的时候不存在线程安全问题。
  • 可以短暂地允许数据库和缓存数据不一致的场景 :更新 db 的时候同样更新 cache,但是给缓存加一个比较短的过期时间,这样的话就可以保证即使数据不一致的话影响也比较小。

三 其他策略

3.1 Read/Write Through Pattern(读写穿透)

Read/Write Through Pattern 中服务端把 cache 视为主要数据存储,从中读取数据并将数据写入其中。cache 服务负责将此数据读取和写入 db,从而减轻了应用程序的职责。
这种缓存读写策略在开发过程中非常少见。抛去性能方面的影响,大概率是因为我们经常使用的分布式缓存 Redis 并没有提供 cache 将数据写入 db 的功能

  • 先查 cache,cache 中不存在,直接更新 db。
  • cache 中存在,则先更新 cache,然后 cache 服务自己更新 db(同步更新 cache 和 db)。

  • 从 cache 中读取数据,读取到就直接返回 。
  • 读取不到的话,先从 db 加载,写入到 cache 后返回响应。

Read-Through Pattern 实际只是在 Cache-Aside Pattern 之上进行了封装。在 Cache-Aside Pattern 下,发生读请求的时候,如果 cache 中不存在对应的数据,是由客户端自己负责把数据写入 cache,而 Read Through Pattern 则是 cache 服务自己来写入缓存的,这对客户端是透明的。和 Cache Aside Pattern 一样, Read-Through Pattern 也有首次请求数据一定不再 cache 的问题,对于热点数据可以提前放入缓存中。

3.2 Write Behind Pattern(异步缓存写入)

Write Behind Pattern 和 Read/Write Through Pattern 很相似,两者都是由 cache 服务来负责 cache 和 db 的读写
但是,两个又有很大的不同:Read/Write Through 是同步更新 cache 和 db,而 Write Behind 则是只更新缓存,不直接更新 db而是改为异步批量的方式来更新 db
很明显,这种方式对数据一致性带来了更大的挑战,比如 cache 数据可能还没异步更新 db 的话,cache 服务可能就就挂掉了
这种策略在我们平时开发过程中也非常非常少见,但是不代表它的应用场景少,比如消息队列中消息的异步写入磁盘、MySQL 的 Innodb Buffer Pool 机制都用到了这种策略。
Write Behind Pattern 下 db 的写性能非常高,非常适合一些数据经常变化又对数据一致性要求没那么高的场景,比如浏览量、点赞量。

四 总结

Redis 和 MySQL 的更新策略用的是 Cache Aside,另外两种策略主要应用在计算机系统里。


http://www.ppmy.cn/news/394280.html

相关文章

缓存读写策略 - Cache Aside

场景描述 比如一条数据同时存在数据库、缓存,现在你要更新此数据,你会怎么更新? 先更新数据库?还是先更新缓存? 其实这两种方式都有问题。 ###(1)先更新数据库,后更新缓存 这样会…

深入浅出cache写策略

随着计算机行业的飞速发展,CPU的速度和内存的大小都发生了翻天覆地的变化,在处理器速度不断增加的形势下,处理器处理数据的能力也得到大大提升。数据是存储在内存中的,内存吞吐率虽然得到很大的提升,但是相对于处理器来…

缓存常用的3种读写策略

注意:该博客仅是本人对掌握知识的测试,具体内容请移步guide哥网站!!! https://snailclimb.gitee.io/javaguide 链接 一、Cache Aside Pattern(旁路缓存模式) 适合于读请求比较多的场景。 cach…

数据缓存策略

数据缓存策略 (一)hibernate数据缓存策略 缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的拷贝,位于数据库与数据访问层之间。对于查询操作相当频繁的系统(论坛,新闻发布等)&am…

缓存读写策略:CacheAside、Read/WriteThrough及WriteBack策略

1.缓存读写策略 对于缓存的读写来说,通常存在三种使用方式,也就是缓存的三种读写策略:CacheAside、Read/WriteThrough及WriteBack策略。 2.最简单的缓存更新策略 先假设一个常见的缓存使用场景:有一个电商系统首页调用商品接口…

如何选择缓存的读写策略

今天,我们先讲讲缓存的读写策略。你可能觉得缓存的读写很简单,只需要优先读缓存,缓存不命中就从数据库查询,查询到了就回种缓存。实际上,针对不同的业务场景,缓存的读写策略也是不同的。 而我们在选择策略…

浅析缓存的读写策略

前言 提起缓存,我们首先想到缓存是一种存储数据的组件,它的作用是让对数据的请求能更快地返回。 我们一般会把不经常改变而且又需要快速访问的数据进行缓存,常用的做法是将这些数据写进内存中,当需要访问的时候能快速地返回需要…

缓存常用的三种读写策略==》Cache Aside Pattern(旁路缓存模式)

Cache Aside Pattern(旁路缓存模式) Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准。 下面我们来看一下这个策略模式下的缓存读写步骤。 写 : 先更新 DB 然后直接删除 cache 。 简单画了一…

Mysql 缓存策略

文章目录 1、访问性能提升1.1、读写分离mysql 主从复制 1.2、连接池1.3、异步连接 2、缓存方案2.1、场景分析2.1.1、存储层2.1.2、缓存层2.1.3、热点数据 2.2、一致性状态分析2.3、读写策略2.3.1、读策略2.3.2、写策略安全优先效率优先 2.4、同步策略伪装从库 3、缓存故障3.1、…

三种缓存策略分析:Cache aside,Read/Write through,Write Back

Cache aside 旁路缓存,旁路缓存操作逻辑是查询缓存,如果不存在那么就读取数据库并更新到缓存当中. 如果是更新数据库,那么操作完数据库后,删除缓存. 注意旁路缓存,缓存中的内容是不做更新操作的,只有写入和删除操作. 问题 1.请求1查询不到缓存,查询数据库.请求2更新数据,删…

常见缓存读写策略

目录 缓存读写策略Cache Aside Pattern读请求写请求旁路缓存模式的缺点 Read/Write Through Pattern读请求写请求 Write Behind Pattern读请求写请求 缓存读写策略 我们都知道缓存大多数情况下是用来减轻数据库压力的。缓存读写策略就是在进行数据读/写时以何种策略读写缓存和…

缓存常用的三种读写策略

文章目录 缓存常用的三种读写策略Cache Aside Pattern(旁路缓存模式)应用情况及场景旁路缓存模式的原理旁路缓存模式的缓存读写步骤旁路缓存模式的面试问题问题一问题二(追问 问题一)问题三问题四 Read / Write Through Pattern&a…

什么是缓存,缓存策略有哪些?

1、什么是缓存? ☞ 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的…

3种常用的缓存读写策略

导读 提起缓存,大家应该都不陌生,开始时,如果你的业务处于起步阶段,流量非常小,那无论是读请求还是写请求,直接操作数据库即可,这时你的架构模型是这样的: 但随着业务量的增长&…

MySQL缓存策略详解

MySQL缓存方案 一、MySQL缓存方案目的分析1.1、缓存层的作用1.2、缓存层选择1.3、场景分析 二、提升MySQL访问性能的方式2.1、MySQL主从复制2.2、读写分离2.3、连接池2.4、异步连接 三、redis作为主数据库的常用方法四、缓存方案4.1、缓存和MySQL一致性状态分析4.2、制定读写策…

常用缓存读写策略(cache读写策略)

文章目录 前言一、Cache Aside Pattern (旁路缓存模式)二、Read/Write Through Pattern(读写穿透模式)三、Write Behind Pattern(异步缓存写入)总结 前言 平时在我们使用数据库的时候一般都会再额外使用缓存,使用缓存…

三种缓存策略:Cache Aside 策略、Read/Write Through 策略、Write Back 策略

作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林。 今天跟大家聊聊,常见的缓存更新策略。 Cache Aside(旁路缓存)策略;Read/Write Through(读穿 / 写…

Win11开启U盘移动硬盘写入缓存策略怎么设置

Win11开启U盘移动硬盘写入缓存策略怎么设置?有一些用户希望能够提升U盘移动硬盘传输数据的性能,具体应该怎么设置U盘移动硬盘才能有更好的性能呢?下面小编带大家看看Win11设置U盘移动硬盘写入缓存策略的方法。 更多重装系统教程尽在小白系统…

Redis三种常用的缓存读写策略,这些你都知道吗?

一、Redis三种常用的缓存读写策略 Redis有三种读写策略分别是:旁路缓存模式策略、读写穿透策略、异步缓存写入策略。 这三种缓存读写策略各有优势,不存在最佳,需要我们根据实际的业务场景选择最合适的。 二、旁路缓存模式(Cache A…

华为Atlas 部署YOLOV5

目录 脚本下载 版本估计5.0: 推理示例: 在华为Atlas200部署YOLOV5 好几个版本都有 YOLOv5模型转换 YOLOv5 v6.0
最新文章