架构师训练营 1 期 -- 第五周笔记
架构师训练营,第五周学习,因时间关系,这周只学习了一遍。本周讲了缓存和消息队列:
缓存是存储在计算机上的一个原始数据复制集,便于快速访问。
缓存数据一般存储在Hash表中,它的时间复杂度是O(1)。
缓存设计好还的一个衡量指标是缓存命中率,缓存命中率是是从缓存读取数据和总访问次数的比,如果访问10次,9次从缓存读取,那么缓存命中率就是90%。影响缓存命中率的因素有:
缓存键集合的大小,缓存键越多,缓存命中率就低。
缓存可使用存储空间大小,存储空间越大,缓存命中率越高。
缓存时间越长,缓存命中率越高。
分布式缓存如Memached在做集群时,一般是客户端SDK通过计算key的hash值,通过某一种路由算法,将访问请求转发给集群中的某台服务器,比如我们又3台Memcached服务器集群,通过简单取模,就可以将客户请求转发到这三台服务器上。这三台服务器都无法感知其它服务器的存在,他们是share nothing的集群。
以上集群会带来一个问题,就是当我们增加或减少服务器的时候,会有大量缓存失效。比如原来有3台服务器,客户请求key的hash值是5,原来5%3==2,缓存在第三台服务器上,现在增加了一台服务器,5%4=1,缓存就应该存储在第二台服务器上。这样之前存在的大量缓存就失效了。
这里老师提出了一个观点,要搞清楚技术的本质,否则容易弄巧成拙。
为了解决取余hash路由算法带来的问题,可以使用一致性hash算法。一致性hash算法是创建一个大的hash环,将负载均衡节点分布在hash环上。寻找节点的方法是,取当前key的hash值,然后顺时针找距离当前key hash值最近的节点。比如当前集群有3个节点N1->N2->N3,如果需要增加一个节点N4,顺序如下N1->N2->N4->N3。那么只有N2->N4的数据需要重新路由到N4,其它节点都不受影响。
评论