天天看点

笔记:缓存一致性

参考博客地址https://blog.csdn.net/kevinfankai/article/details/4024937?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160570747619724836714085%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160570747619724836714085&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-4024937.pc_first_rank_v2_rank_v28&utm_term=%E7%A7%9F%E7%BA%A6&spm=1018.2118.3001.4449

维护缓存一致性的方法简述

轮询:客户端每次向缓存中读取数据时,都要先向服务器询问,此时缓存中的数据是否是最新的数据。

回调:即服务器先记住所有读取了该数据块(假设为数据块A)的客户端,在服务器每次对数据块A进行修改之前,服务器都会先通知读取了数据块A的客户端们,数据块A失效(发生了变化)。

综上,会发现服务器的通信开销都很大,为了解决这一问题,也就是要减少服务器的消息传递次数,由此1989年斯坦福大学的Cary G. Gray和David R. Cheriton提出了利用租约来维护缓存一致性的方法。

租约:就是在客户端向服务器读取数据时,服务器会将该数据的租约连通要读取的数据一块传给客户端。客户端在获得该数据的租约后,服务器之后在租约期内若是想要对该数据进行修改,那么服务器就必须得先取得客户端的同意,潜台词就是客户端知道服务器要对该数据进行修改了。这样的话,只要某个时刻客户端未收到服务器发来的数据修改请求,那么缓存中此时存储的数据就是最新的。

三者比较:租约方法与轮询相比,很显然减少了服务器与客户端通信的次数。租约方法与回调相比,只要在租约期内,缓存中的数据一定是最新的,这时客户端无需向服务器询问是否为最新,直接从缓存中读取数据即可,只有当服务器需要对数据进行修改时,服务器才需要向客户端发送更改请求。所以在租约期内,客户端需要向缓存读取数据的情境下,客户端和服务器通信的次数大大减少。而回调的情况下,虽然通信次数跟租约方法是差不多的,但由于服务器必须先保存所有读取了该数据块的客户端的信息(租约方法只需要服务器记住还有租约期的客户端信息即可),这使得服务器的存储开销大大增加。

继续阅读