在之前文章《干货!带你了解为什么那么多开源项目都是用Redis》已经介绍了redis的一些基本知识。
Redis的三种集群模式主要是:主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和redis cluster集群模式(redis3.0版本之后)。今天主要讲解在windows系统下搭建redis cluster集群环境(集群正常运作至少需要三个主节点,我们测试集群功能采用三主三从,一共六个节点),以及在代码中集成使用redis cluster。
Redis Cluster集群搭建后的目录大致如下:
一、环境搭建1、下载window系统redis安装包(版本必需要3.0以上,redis3.0版本之后才支持redis cluster集群模式)
我下载的版本是3.0.501。解压之后的目录内容:
2、下载ruby安装包,按照指引安装
下载地址:https://rubyinstaller.org/downloads/
安装完成系统自动弹出弹框,输入命令对Ruby进行配置:
gem install redis
3、搭建redis三主三从环境
(1)在第1步解压后的redis目录下建立6个文件夹,分别以端口命名:7000,7001,7002,7003,7004,7005。再将第1步解压后的所有内容分别拷贝到每个文件夹下。
(2)在每个文件夹下分别建立一个批处理启动文件start.bat,启动时直接运行该批处理文件。start.bat内容如下(对应各自的端口号):
title redis-7000
redis-server.exe redis.windows.conf
(3)修改文件redis.windows.conf
修改6个节点文件目录下的redis.windows.conf,修改节点的端口号。比如
port 7000
(4)修改其他配置支持集群
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
appendonly yes
cluster-config-file nodes-7000.conf: 是该节点的配置信息,比如当前节点端口号是7000,配置为cluster-config-file nodes-7000.conf,start.bat服务启动后会在目录生成文件nodes-7000.conf;
cluster-enabled 设置为yes;
cluster-node-timeout 调整为15000,在创建集群的时候,不会超时;
4、下载ruby语言集群脚本redis-trib.rb,复制到redis目录下
二、服务启动1、进入6个端口号命名的文件夹下,启动start.bat文件
2、切换到redis目录下执行命令
ruby redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
集群节点按照从主到从的方式从左到右依次排列6个redis 节点,因此也可以看出7000,7001,7002三个是主节点,7003,7004,7005是三个从节点,对应关系是:主7000从7003,主7001从7004,主7002从7005。
出现Can I set the above configuration? (type 'yes' to accept): 输入yes
执行完成之后,在原来每个redis节点下面可以看出主从信息。
3、启动异常处理
若执行第3步命令时提示:
[ERR] Node 127.0.0.1:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
问题原因:关闭redis集群时,直接关闭的命令行,应该按ctrl+c,然后系统会提示:终止批处理操作吗(Y/N)? 输入Y退出。
解决办法:每个redis子节点都要删除三个文件:appendonly.aof、dump.rdb、nodes-port.conf(比如nodes-7000.conf),然后再重新启动start.bat。
4、使用redis可视化工具连接查看
开始db0没有数据:
点击db0之外的db1等均提示:
ReplyError: ERR SELECT is not allowed in cluster mode
这是因为redis集群版不支持多数据库空间。单机下的Redis可以支持16个数据库,集群模式下只能使用一个数据库空间,即db0。其他的db都会返回错误。
5、测试redis数据写入与数据读取
在redis目录下执行命令redis-cli –c –h ”地址” –p “端口号”; c 表示集群。
redis-cli -c -h 127.0.0.1 -p 7000
写入数据:set name bianchengxia
根据redis-cluster的key值分配(Redis集群没有使用一致性hash, 而是引入了哈希槽的概念,所有的键根据哈希函数映射到 0 ~ 16383 整数槽内,每个key通过CRC16校验后对16384取模来决定放置哪个槽(Slot),每一个节点负责维护一部分槽以及槽所映射的键值数据),name应该分配到节点7001上,上面显示redis cluster自动从7000跳转到了7001节点。
我们可以测试一下7001从节点获取name值(实际每个节点都可以取到值,redis自动切换到对应key所在的节点)
三、项目集成测试1、项目配置
以Springboot项目为例,在application.properties中配置redis
spring.redis.cluster.nodes=127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005
若是application.yml配置方式,则按照如下方式配置:
2、SpringBootTest单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public RedisTest {
@Autowired
StringRedisTemplate redisTemplate;
ValueOperationsstringRedis;
@PostConstruct
public void init(){
stringRedis=redisTemplate.opsForValue();
}
@Test
public void testString (){
stringRedis.set("name2", "编程侠");
System.out.println(stringRedis.get("name2"));
}
}
执行结果:
通过可视化工具查看:
通过命令查看,中文乱码:
中文存在编码问题,解决办法,redis-cli 后面加上--raw
执行命令:redis-cli -c -h 127.0.0.1 -p 7000 --raw
我用的windows cmd,设置--raw之后还是乱码,因为要设置窗口的编码,回到redis目录下,输入:chcp 65001,这句命令就是换成UTF-8代码页,会提示Active code page: 65001。