当前位置: 首页 > 科技观察

穿透类缓存Cache的使用,这篇文章就够了!

时间:2023-03-19 02:19:46 科技观察

有一些成熟的技术方案不需要创新,固化的模式(pattern)可以学习。比如“CacheAsidePattern”就是使用穿透类缓存的一个很好的实践,那么今天就来聊聊CacheAsidePattern。画外音:就像“设计模式”一样,是沉淀下来的设计方法。什么是“缓存备用模式”?绕过缓存方案的实证实践,本次实践分为阅读实践和写作实践。画外音:对应旁路缓存,就是穿透缓存。阅读实践是什么样的?对于读请求:(1)先读缓存,再读db;(2)如果缓存命中,直接返回数据;(3)如果cachemiss,访问db并将数据Set送回cache;如上图所示:(1)首先尝试从缓存中获取数据,结果为miss;(2)从db中读取数据,从库中分离读写;(3)最后将数据设置回缓存,方便下次读取命中;写作练习是什么样的?对于写请求:(1)清除缓存而不是更新缓存;(2)先操作数据库,再清除缓存;如上图所示:(1)第一步是操作数据库,第二步是操作缓存;(2)缓存,使用delete消除而不是setupdate;为什么CacheAsidePattern建议消除缓存而不是更新缓存?如果更新了缓存,并发写入时可能会出现数据不一致的情况。如上图,如果使用setcache。当发生1和2的两次并发写入时,由于不能保证时序,无论是先操作缓存还是先操作数据库,都可能出现:(1)请求1先操作数据库,请求2之后操作数据库;(2)请求2先设置缓存,请求1后再设置缓存;结果,数据库和缓存之间的数据不一致。因此,CacheAsidePattern建议删除缓存而不是设置缓存。为什么CacheAsidePattern建议先操作数据库,再操作缓存?如果先操作缓存,读写并发时可能会出现数据不一致的情况。如上图,如果先操作缓存。当发生1和2并发读写时,由于不能保证时序,可能会出现:(1)写请求消除了缓存;(2)写请求操作数据库(主从同步未完成);(3)读请求读Cache(cachemiss);(4)读请求从库中读取(读一个旧数据);(5)读请求设置回缓存(setanolddata);(6)数据库主从同步完成;导致,数据库与缓存数据不一致。所以CacheAsidePattern建议先操作数据库,再操作缓存。CacheAsidePattern方案有什么问题?答:如果先操作数据库,再清除缓存,当原子性被破坏时:(1)数据库修改成功;(2)缓存被淘汰;导致数据库和缓存中的数据不一致。CacheAsidePattern总结:对于读请求:(1)先读cache,再读db;(2)如果缓存命中,直接返回数据;(3)如果缓存未命中,访问db并将数据设置回Cache;对于写请求:(1)清除缓存而不是更新缓存;(2)先操作数据库,再清除缓存;任何技术方案的设计都是折衷的。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文