高并发:缓存模式以及缓存的数据一致性
作者 | stephanie Tang
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写入的时候的效率较高,如果数据写入后很少被读取,缓存也不会被没用到的数据占满。
缺点
如果数据会写入多次,那么可能存在缓存和数据库不一致
- 推荐阅读 -
往期推荐
下方二维码关注我
互联网草根,坚持分享技术、创业、产品等心得和总结~
点击“阅读原文”,领取 2020 年最新免费技术资料大全
评论