Redis Cluster 在PHP上的实践

版本:redis3.0.3

redis——slot:

‘master‘ => [
‘192.168.1.55:7000‘=>[0,5460],
‘192.168.1.55:7001‘=>[5461,10922],
‘192.168.1.55:7002‘=>[10923,16383],
],

‘slave‘ => [
‘192.168.1.55:7003‘=>[0,5460],
‘192.168.1.55:7004‘=>[5461,10922],
‘192.168.1.55:7005‘=>[10923,16383],
],

以上是redis节点的配置,三主三从

当主节点宕机时,会返回信息Move,告知当前转移到slave处理

在添加键值对的时候,必须注意slot的计算:

private function redisCRC16 (&$ptr){
$crc_table=array(
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
);
$crc = 0x0000;
for ($i = 0; $i < strlen($ptr); $i++)
$crc = $crc_table[(($crc>>8) ^ ord($ptr[$i]))] ^ (($crc<<8) & 0x00FFFF);
return $crc;
}

当我们想要把一个批次的所有键值对都放入同一个节点,那么就要用到key-tags

例如 {product}.product_basic,{product}.product_desc

扩展计算方法:

private function hash_slot($key)
{
$s = strpos($key, ‘{‘);
if(!empty($s))
{
$e = strpos($key, ‘}‘, $s+1);

if(!empty($e) && $e != ($s + 1))
{
$key = substr($s+1,$e-1);
}
}

return $this->redisCRC16($key) % 16384;
}

在计算出slot之后,再通过配置,得知当前的连接地址

private function get_hostname($key)
{
$hash_slot = $this->hash_slot($key);
$host_name = ‘‘;

foreach ($this->master as $key=>$value)
{
if(empty($host_name))
{
$host_name = $key;
}

if($hash_slot >= $value[0] && $hash_slot <= $value[1])
{
$host_name = $key;

break;
}
}

return $host_name;
}

斯利民:15805893990

时间: 2024-10-29 19:06:16

Redis Cluster 在PHP上的实践的相关文章

Redis Cluster 原理详解,应付面试官就看这一篇!

Redis 缓存作为使用最多的缓存工具被各大厂商争相使用.通常我们会使用单体的 Redis 应用作为缓存服务,为了保证其高可用还会使用主从模式(Master-Slave),又或者是读写分离的设计.但是当缓存数据量增加以后,无法用单体服务器承载缓存服务时,就需要对缓存服务进行扩展.将需要缓存的数据切分成不同的分区,将数据分区放到不同的服务器中,用分布式的缓存来承载高并发的缓存访问.恰好 Redis Cluster 方案刚好支持这部分功能. 今天就来一起看看 Redis Cluster 的核心原理和

Windows 配置Reids集群 Redis Cluster

1. 下载安装Redis Redis官方不支持Windows,但是Microsoft Open Tech group在 GitHub上开发了一个Win64的版本,下载地址为: 下载Redis 启动服务 redis-server redis.windows.conf 客户端连接 redis-cli.exe -h 127.0.0.1 -p 6379 2. 安装Ruby并配置环境 安装Ruby,Windows可以安装RubyInstaller,下载地址: http://railsinstaller.o

redis cluster集群批量删除中的key

1.说明 redis cluster集群上有时候会需要删除多个key,就必须需要登录到每个节点上,而且有可能这个key不在这个节点,删除起来就比较麻烦,测试的时候极不方便.于是就自己动手写了一个支持模糊删除key的脚本,分享给大家. 2.新建del_redis.sh,内容如下 #!/bin/bash # 配置redis-cli地址 redis_cmd=redis-cli # 配置reids集群IP地址 host=192.168.1.2 # 配置reids集群节点端口 ports=(6380 63

redis cluster 实践总结

最近项目接触到了redis cluster,现在趁着使用做一下总结,记录一下遇到过的问题,简单的概述一下常用到的命令和功能. 本篇文章主要是以运维的角度去讲述如何去更好的规划redis cluster和跳坑. redis cluster 官方文档: https://redis.io/topics/cluster-tutorial 一.redis cluster 是什么 redis cluster是官方redis 3.0版本之后推出的集群方案,之前类似的方案还有豌豆荚的codis集群方案.twem

redis集群与分片(2)-Redis Cluster集群的搭建与实践

Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.其redis-cluster架构图如下: 其结构特点: 1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.     2.节点的fail是通过集群中超过半

输出redis cluster 主从的对应关系,如果同一个主从关系的master和slave在同一个node节点上,在输出的对应关系末尾输出提示

需求:输出redis cluster 主从的对应关系,如果同一个主从关系的master和slave在同一个node节点上,在输出的对应关系末尾输出提示. 为什么会有这样的需求呢?在重新搭建redis cluster的时候,创建集群期间,发现: redis-trib.rb create --replicas 1 \5.5.5.101:29001 5.5.5.102:29002 5.5.5.103:29003 \5.5.5.102:29001 5.5.5.103:29002 5.5.5.101:29

在Spring Boot 上配置Redis Cluster出现的异常

〇.背景 已在虚拟机的docker中搭建好了6个节点的redis 集群:Docker Redis 5.0集群搭建 现在在宿主机以Spring Boot环境连接集群 一.异常1:无法连接集群 1.配置: 1 #rediss 2 spring.redis.cluster.nodes=192.168.22.130:7001,192.168.22.130:7002,192.168.22.130:7003,192.168.22.130:7004,192.168.22.130:7005,192.168.22

Redis Cluster集群搭建测试

# Redis Clutser # ## 一.Redis Cluster集群 ## 参考资料: http://www.cnblogs.com/lykxqhh/p/5690923.html Redis集群搭建的方式有多种,例如使用zookper等,但从redis3.0之后版本支持redis cluster集群,Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.其redis cluster架构图如下: 其结构特点: 1.所有的redis节点彼此互

Redis集群技术及Codis实践

"高效运维最佳实践"是InfoQ在2015年推出的精品专栏,由触控科技运维总监萧田国撰写,InfoQ总编辑崔康策划. 前言 如开篇文章所言,高效运维包括管理的专业化和技术的专业化.前两篇我们主要在说些管理相关的内容,本篇说一下技术专业化.希望读者朋友们能适应这个转换,谢谢. 互联网早在几年前就已进入Web 2.0时代,对后台支撑能力的要求,提高了几十倍甚至几百倍.在这个演化过程中,缓存系统扮演了举足轻重的角色. 运维进化到今天,已经不是重复造轮子的时代.所以,我们在架构优化和自动化运维