# Cache Design

From 58沈剑 架构师之路 _1 week ago_

> 架构师之路年终总结（五）-缓存篇

**缓存**是互联网系统架构中必不可少的一环，之前花大精力系统性的写了10篇，缓存架构设计相关的文章，欢迎回顾。

_1._《[进程内缓存究竟怎么玩？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961296\&idx=1\&sn=883a46db0e4b4fe8bd2de5a370e3304e\&chksm=bd2d020c8a5a8b1a2938b07da1a42648d562c559d573b5700e48ea5318dac3ee246b2e6ce908\&scene=21#wechat_redirect)》\
缓存，可以分为：**进程内缓存**，**缓存服务**。文章介绍了：\
（1）什么是进程内缓存\
（2）进程内缓存的优缺点\
（3）进程内缓存保存一致性的3种方案\
（4）到底什么时候用进程内缓存

文章也说明，大部分业务场景，不应该用进程内缓存，而应该用缓存服务，而如今最常见的缓存服务是redis和memcache，遂引出了第二篇文章。

_2._《[选redis还是memcache，源码怎么说？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961272\&idx=1\&sn=79ad515b013b0ffc33324db86ba0f834\&chksm=bd2d02648a5a8b728db094312f55574ec521b30e3de8aacf1d2d948a3ac24dbf30e835089fa7\&scene=21#wechat_redirect)》\
没有最正确，只有最适合。从源码的角度看，到底啥时候用redis，啥时候用memcache。文章介绍了：\
（1）复杂数据结构，选择redis\
（2）不要把redis当DB和MQ使用\
（3）高可用，真的需要么？\
（4）内存分配、虚拟内存、网络模型、线程模型上看redis和memcache的差异与选型。

不管是redis还是memcache，缓存服务，有很多误用，遂引出了第三篇文章。

_3._《[缓存服务，你真的用对了么？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961307\&idx=1\&sn=2ea36d014299c7870a0b40575578469e\&chksm=bd2d02078a5a8b111d0caa649ae93f050ee6d4168c43322c2cf8cd8387becdd9b78a7202daa0\&scene=21#wechat_redirect)》\
这篇文章介绍了，缓存的一些“值得商榷”的用法：\
（1）服务之间，通过缓存传递数据真的合适么？\
（2）缓存服务，真的不需要考虑高可用么？\
（3）调用方缓存数据，真的合适么？\
（4）多个服务，公用缓存实例真的合适么？

了解了常见用法，那么对于缓存的读写，淘汰，一致性有什么常见的问题呢？遂引出了接下来的几篇文章。

_4._《[缓存，究竟是淘汰，还是修改？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961313\&idx=1\&sn=60d74fdbc1fb1dae696e0f4997c09f21\&chksm=bd2d023d8a5a8b2bba2f8a3807492771a442495d27323d8dbfae670508fd0c46780308a9280d\&scene=21#wechat_redirect)》\
这个问题问的人很多，《[Cache Aside Pattern](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961349\&idx=1\&sn=59119a223f62d3740712ca0f62064f04\&chksm=bd2d0dd98a5a84cf94d75e8e84ad7fe35fd040dfe02fe49db8dd64127c548aa194d2d169e149\&scene=21#wechat_redirect)》一文也提到了此问题：\
（1）修改缓存，可能会使得代价过高，重复计算\
（2）修改缓存，在并发写时，可能数据不一致

**结论**：应该淘汰缓存，而不是更新缓存。

明确了淘汰，还是修改，接下来需要明确的是：先操作数据库，还是先操作缓存。

_5._**先操作数据库，还是先操作缓存?**\
关于这个问题，行业有两种不同的实践，大家根据自己的业务场景选择使用哪一种。

《[Cache Aside Pattern](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961349\&idx=1\&sn=59119a223f62d3740712ca0f62064f04\&chksm=bd2d0dd98a5a84cf94d75e8e84ad7fe35fd040dfe02fe49db8dd64127c548aa194d2d169e149\&scene=21#wechat_redirect)》\
**观点**：应该先操作数据库，再淘汰缓存\
**原因**：否则，读写并发会导致数据不一致

《[或许，应该先淘汰缓存？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961341\&idx=1\&sn=e27916b8e96bd771c72c055f1f53e5be\&chksm=bd2d02218a5a8b37ecffd78d20b65501645ac07c7ba2eb65b7e501a3eb9de023febe63bfdb36\&scene=21#wechat_redirect)》\
**观点**：应该先淘汰缓存，再操作数据库\
**原因**：否则，原子性被破坏时，会导致数据不一致

不管先操作数据库，还是先操作缓存，其实都解决不了“写后立刻读，脏数据库入缓存”的问题。

**什么是“写后立刻读，脏数据库入缓存”问题？**\
**答**：发生写请求后（不管是先操作DB，还是先淘汰Cache），在主从数据库同步完成之前，如果有读请求，都可能发生读Cache Miss，读从库把旧数据存入缓存的情况。此时怎么办呢？遂引出了下一篇文章。

_6._《[缓存与数据库不一致，怎么办？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961356\&idx=1\&sn=8fa6a57d128a3255a049bee868a7a917\&chksm=bd2d0dd08a5a84c62c1ac1d90b9f4c11915c9e6780759d167da5343c43445759bce0f16de395\&scene=21#wechat_redirect)》\
缓存与数据库的不一致，本质是由主从数据库延时引起的，有没有办法优化主从数据库的一致性呢？遂引出了下一篇文章。

_7._《[主从数据库不一致，怎么办？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961330\&idx=1\&sn=4bdbada3b26d4fc2fc505f7a0f2ad7c4\&chksm=bd2d022e8a5a8b38e59f0dfffba7ca407fe8711644b3794832572dd822c665205bb820cdddf7\&scene=21#wechat_redirect)》\
文章提出了三种优化方案，最后一个方案挺有意思，一个很巧妙的方法。

_8._&#x756A;外篇\
《[到底选redis还是memcache，面试官究竟想考察啥？](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961269\&idx=1\&sn=ea447397423a2ad9d9f44ad51f0bed5e\&chksm=bd2d02698a5a8b7f966f77c0283124e7d7dee42cc604b418b57ba4ff15e583fe2873a356dc31\&scene=21#wechat_redirect)》\
这是一篇聊思路的文章，技术人，不要只会使用，知其然并知其所以然。

这个缓存系列10篇，希望整体的思路是清晰的。

![](https://firebasestorage.googleapis.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M63nDeRq0OluA2VzyJc%2Fuploads%2FHIvWfsCe8FnHJCSsts8N%2Ffile.gif?alt=media)

架构师之路-分享通俗易懂的技术文章

推荐阅读：

《[“立体化监控告警平台”-年终总结（一）](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961930\&idx=1\&sn=f2008355d7f11c83f9629c970e2a4456\&chksm=bd2d0f968a5a8680a1c3897c6f28c3b6f729cb1c9c458d63b4faf058c634fc7f8fa6ac1a51b9\&scene=21#wechat_redirect)》

《[“区块链与比特币”-年终总结（二）](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961934\&idx=1\&sn=53db7089f85c6aebf5d90ccc8f1f6636\&chksm=bd2d0f928a5a8684d5bceaca6aa89a55c7b466f7d53ceeddd9c4f73d08d442d27524cc80c06c\&scene=21#wechat_redirect)》

《[“杀熟杀豪与互联网推荐”-年终总结（三）](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961935\&idx=1\&sn=e2147771c2615b2dbd3711a9e864627d\&chksm=bd2d0f938a5a868543371d46a7b48f8c80a2adfe38ef4f593dbef386ed8942cfe79a62a2a3af\&scene=21#wechat_redirect)》

《[“读写扩散、消息系统”-年终总结（四）](http://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==\&mid=2651961939\&idx=1\&sn=31a0a4b45a25befbde5b05fe0ba574f6\&chksm=bd2d0f8f8a5a86994f983eb45873e06145d5ebbafedec9adf039aabef9cef70700b87e0c5aa8\&scene=21#wechat_redirect)》

思路比结论重要。

帮忙转发、收藏、好看一下。

[Read more](https://mp.weixin.qq.com/s/c1mOxGeoJzlWC1YkkbDRgA##)
