由于redis是单点,但是项目中不可避免的会使用多台Redis缓存服务器,那么怎么把缓存的Key均匀的映射到多台Redis服务器上,且随着缓存服务器的增加或减少时做到最小化的减少缓存Key的命中率呢?这样就需要我们自己实现分布式。
Memcached对大家应该不陌生,通过把Key映射到Memcached Server上,实现快速读取。我们可以动态对其节点增加,并未影响之前已经映射到内存的Key与memcached Server之间的关系,这就是因为使用了一致性哈希。因为Memcached的哈希策略是在其客户端实现的,因此不同的客户端实现也有区别,以 Spymemcache、Xmemcache为例,都是使用了KETAMA作为其实现。
一致性hash算法:
由于hash算法结果一般为unsigned int型,因此对于hash函数的结果应该均匀分布在[0,2^32-1]区间,如果我们把一个圆环用2^32 个点来进行均匀切割,首先按照hash(key)函数算出服务器(节点)的哈希值, 并将其分布到0~2^32的圆环上。
用同样的hash(key)函数求出需要存储数据的键的哈希值,并映射到圆环上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器 (节点)上。key1、key2、key3和server1、server2通过hash都能在这个圆环上找到自己的位置,并且通过顺时针的方式来将 key定位到server。按上图来说,key1和key2存储到server1,而key3存储到server2。如果新增一台server,hash 后在key1和key2之间,则只会影响key1(key1将会存储在新增的server上),其它不变。
16家上市银行去年净赚1.27万亿 仍占A股半壁江山:http://licai.daiyuline.com/caijingxinwen/317.html
财政部:扩大18项行政事业性收费免征范围:http://licai.daiyuline.com/zhengquan/316.html