1 一致性hash算法的一致性
这里的一致性指的是该算法可以保持memcached和数据库中的数据的一致性。
2 什么是一致性hash算法
2.1 为什么需要一致性hash算法
现在有大量的key value的数据需要分散的存储到不同的机器上的memcached中,如何根据key来分派机器。
简单的方法直接对机器数目取模,比如有3台机器,首先对key求hash,假如hash分别是1,2,3,4,5,6,7,8,那么
3,6 分派到第一台机器
1,4,7分派到第二台机器
2,5,8分派到第三台机器
但是,假如加了一台机器,4台机器,那么就要对4取模了,
4,8分派到第一台机器
1,5分派到第二台机器
2,6分派到第三台机器
3,7分派到第四台机器
这样,3本来是第三台机器,现在分到了第4台机器,那么原来的数据就失效了,第四台机器的数据需要去数据库中重新取。4、5、6、7、8同理。
这样导致的问题就是原来的memcached缓存的数据大量失效,需要重新获取,成本很高。
2.2 一致性hash算法怎么做
对机器根据ip计算hash值,比如机器1是3,机器2是5,机器3是9。
现在分派策略变成了,如果key的hash值大于9并且小于3,就分派给机器1,如果大于3小于5就分派给机器2,如果大于5小于9就分派给机器3。
如果新加一台机器4,hash值是8,那么如果key大于5小于8就分派给机器4,大于8小于9就分配给机器3,其它的都不变。
这样只是机器3上的memcached需要更新部分数据,其它原来的机器上的memcached和数据库中保持一致。
hash不直接对N取模,而是根据将hash key空间分成多个段,段的断点为机器ip的hash值。某个请求的hash key落在某个段上面,然后将该请求分配给顺时针走遇到的第一个节点。
2 memcached
它是一个分布式的缓存,它通过客户端实现了分布式缓存,根据key将数据缓存到不同的机器上。
客户端可以使用xmemcached、spymemcached等
boolean set(final String key, final int exp, final Object value);
可见,任何对象都可以存放在memcached中。