memcached,redis 都是key-value 的形式存储数据,如果为了分担缓存数据库的压力,将不同的数据存储到的不同的服务器,而且不管怎么样,编号都是固定的,以下是解决问题的代码
$key_str = "mc_user_pos_info_3274798";
$serverList = array(
array("127.0.0.1", 6375),
array("127.0.0.1", 5678),
array("127.0.0.1", 5673),
array("192.168.100.1", 5673),
);
$hashRingNumber = count($serverList);
$scopeNumber = vsprintf('%u', 4294967296 / $hashRingNumber); // 按 4294967296(0 ~ 2^32) 分成N份,每份的值范围
$computedHashCode = vsprintf('%u', crc32($key_str)); // 计算 key_str 的循环冗余校验码
var_dump($scopeNumber);
var_dump($computedHashCode);
$position = ceil($computedHashCode / $scopeNumber) - 1; // 计算 key_str 的循环冗余校验码落在哪个区间内
var_dump($position);
var_dump($serverList[$position]);
string(10) "1073741824"
string(10) "4046273907"
float(3)
array(2) {
[0]=>
string(13) "192.168.100.1"
[1]=>
int(5673)
}