缓存的本质:
抛离实现细节来说,缓存的本质就是* 访问速度更快的数据副本*
从定义而言,强调两个关键词 更快 副本,并且可以看出缓存是针对查询的
快
如何实现更快的访问?(存储设备,传输距离)
1.性能更好的存储设备
2.更近的访问节点(CDN 网络节点,浏览器缓存 本地缓存)
eg:
内存可以看做磁盘的缓存,L1 Cache ,L2 Chace ,高速缓存块,分部署缓存,数据库缓存….. 当然根据缓存数据类型不同会有针对不同数据类型的不同的数据结构的缓存架构 eg: KV ,表格 ….
JVM中存储结构(堆,栈,寄存器 也起到了缓存的作用) ,很多牛逼的算法&数据结构都会对局部性做一定的优化有兴趣的可以找资料看看
eg:disruptor 号称是最快的实现同步数据访问的解决方案,本质上就是
乐观所+CAS 来实现无锁 ; 版本控制来实现有序 (版本或者说序号是保证有序执行的银弹,可以参照分布式一致性算法) ;通过数据块填充来充分利用高速缓存块
SO 无处不缓存
副本
当然这里的副本不包括将缓存作为唯一存储设备的应用
既然是副本,也就存在着共性的问题—>一致性(一致性在不同的应用场景可能)
数据库中的隔离级别本质上就是一致性策略问题,当然一致性在各种系统中有着各种各样的别名,一致性策略也分为 严格一致性,顺序一致性
缓存的一个重要的属性是是否失效,这个失效的时期该如何决定是本文想分享的重点.
不考虑移动,对数据的操作就只有两种:read , write,为了简化问题,我们这里只讨论一个副本
涉及一致性的操作都是发生在write时
缓存置失效可以发生在write前,也可以发生在write后,除非write操作需要阻塞read操作那么一般放在write后来操作足够应付大部分场景,对并发算法比较熟悉的同学应该会联想到一个比较重要的同步算法(COW)
#
本质 : 一致性 , 一致性策略 .
我觉得只要搞懂这两个词,足以应付大部分同步问题.
本人不擅长写作,意会……..