缓存分为页面缓存(静态页面缓存,页面片段缓存),数据缓存等。在单机环境下,为了降低DB的访问压力,或者是为了提高页面的访问速度都可以使用缓存
如果使用了缓存,一般的操作流程是先访问缓存,如果缓存有,就从缓存取;如果没有,则访问DB或其他数据源;如果缓存空间可用,则将查询的数据放入缓存,否则执行缓存替换策略。如果是更新操作,可以同时更新缓存和数据源;也可以先更新数据源,再将缓存置为无效,再次读取就会从数据源读取;也可以先更新缓存,再开个线程配合定时机制和时间戳将缓存中的数据更新到数据源,但缓存数据可能会丢失,所以不安全。
如果先更新缓存,为了解决缓存数据丢失的问题,则可以先写本地日志,在更新缓存。
在单机下不存在缓存一致性问题,因为只有一份缓存数据,只有缓存和数据源不一致的问题。
分布式数据一致性是个比较难处理的问题,互联网公司一般都没有采用强一致性,转而采用弱一致性(最终一致性),允许存在一个时间窗口,在这个时间窗口中缓存是不一致的。在分布式环境下,你可以看下CAP,BASE,Paxos,ZAB协议。zookkeeper目前使用的比较多,它的协议就是ZAB。
如果使用了缓存,一般的操作流程是先访问缓存,如果缓存有,就从缓存取;如果没有,则访问DB或其他数据源;如果缓存空间可用,则将查询的数据放入缓存,否则执行缓存替换策略。如果是更新操作,可以同时更新缓存和数据源;也可以先更新数据源,再将缓存置为无效,再次读取就会从数据源读取;也可以先更新缓存,再开个线程配合定时机制和时间戳将缓存中的数据更新到数据源,但缓存数据可能会丢失,所以不安全。
如果先更新缓存,为了解决缓存数据丢失的问题,则可以先写本地日志,在更新缓存。
在单机下不存在缓存一致性问题,因为只有一份缓存数据,只有缓存和数据源不一致的问题。
分布式数据一致性是个比较难处理的问题,互联网公司一般都没有采用强一致性,转而采用弱一致性(最终一致性),允许存在一个时间窗口,在这个时间窗口中缓存是不一致的。在分布式环境下,你可以看下CAP,BASE,Paxos,ZAB协议。zookkeeper目前使用的比较多,它的协议就是ZAB。