标签: 高并发
缓存设计的那些坑
缓存是最容易加的优化,也是最容易埋雷的优化。加的时候只要几行代码,出问题时往往是深夜的数据不一致或者数据库被打穿。 一致性:先更库还是先删缓存 这个问题的正确答案是先更新数据库,再删除缓存(Cache Aside)。但要理解它为什么仍然不完美。 先删缓存再更库的问题很直接:删完缓存到更库完成之间,另一个请求读到旧数据并把它写回缓存,之后缓存里就一直是脏数据。 先更库再删缓存也有极小概率出问题:读请求恰好在缓存失效后读到旧库值,且回写发生在删除动作之后。概率很低,但在高并发下不等于零。 …
缓存是最容易加的优化,也是最容易埋雷的优化。加的时候只要几行代码,出问题时往往是深夜的数据不一致或者数据库被打穿。 一致性:先更库还是先删缓存 这个问题的正确答案是先更新数据库,再删除缓存(Cache Aside)。但要理解它为什么仍然不完美。 先删缓存再更库的问题很直接:删完缓存到更库完成之间,另一个请求读到旧数据并把它写回缓存,之后缓存里就一直是脏数据。 先更库再删缓存也有极小概率出问题:读请求恰好在缓存失效后读到旧库值,且回写发生在删除动作之后。概率很低,但在高并发下不等于零。 …