(给数据分析与开发加星标,提升数据技能)
转自:GitHub 作者: stephanie Tang
stephanietang.github.io/2020/04/13/cache-pattern/
Cache-Aside
-
程序需要判断缓存中是否已经存在数据。 -
当缓存中已经存在数据(也就是缓存命中,cache hit),则直接从缓存中返回数据 -
当缓存中不存在数据(也就是缓存未命中,cache miss),则先从数据库里读取数据,并且存入缓存,然后返回数据

-
更新数据库 -
更新缓存
-
A写数据库 -
B后于A写数据库 -
B写缓存 -
A写缓存 -
缓存和数据库中的数据不一致,缓存中的是脏数据
-
更新数据库 -
删除缓存中对应的数据

那么这种写策略会有线程安全的问题吗?有,试想一下有两个线程,线程A读,线程B写
-
A读数据,由于未命中那么从数据库中取数据 -
B写数据库 -
B删除缓存 -
A由于网络延迟比较慢,将脏数据写入缓存
应用场景
优点
-
缓存仅仅保存被请求的数据,属于懒加载模式(Lazy Loading),和下文的Write-Through模式相比,避免了任何数据都被写入缓存造成缓存频繁的更新。
缺点
-
当发生缓存未命中的情况时,则会比较慢,因为要经过三个步骤:查询缓存,从数据库读取,写入缓存。 -
复杂的逻辑都在应用程序中,如果实现微服务,多个微服务中会有重复的逻辑代码
Read-Through/Write-Through
Read-Through


优点
-
缓存不存在脏数据 -
相比较Cache-Aside懒加载模式,读取速度更高,因为较少因为缓存未命中而从数据库中查找 -
应用程序的逻辑相对简单
缺点
-
对于总是写入却很少被读取的应用,那么Write-Through会非常浪费性能,因为数据可能更改了很多次,却没有被读取,白白的每次都写入缓存造成写入延迟。
Write-Back

优点
-
写入和读取数据都非常的快,因为都是从缓存中直接读取和写入。 -
对于数据库不可用的情况有一定的容忍度,即使数据库暂时不可用,系统也整体可用,当数据库之后恢复的时候,再将数据写入数据库。
缺点
-
有数据丢失的风险,如果缓存挂掉而数据没有及时写到数据库中,那么缓存中的有些数据将永久的丢失了
Write-Around

优点
-
相比较Write-Through写入的时候的效率较高,如果数据写入后很少被读取,缓存也不会被没用到的数据占满。
缺点
-
如果数据会写入多次,那么可能存在缓存和数据库不一致
看完本文有收获?请转发分享给更多人
关注「数据分析与开发」加星标,提升数据技能

好文章,我在看❤️

