Redis集群(八)
一、Redis集群#
1.1 问题#
容量不够,Redis如何进行扩容?
并发写操作,Redis如何分摊?
另外,主从模式、薪火相传模式、主机宕机,导致IP地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息(代码中地址肯定写死了)。
之前通过代理主机来解决,但是 redis3.0 中提供了解决方案。就是 无中心化集群 配置
任何一个服务都能作为集群的入口,他们之间可以互相访问。
1.2 什么是集群#
Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的 1/N 。
Redis集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。
#
二、模拟集群#
制作6个实例:6379、6380、6381、6389、6390、6391
2.1 配置基本信息#
删除 /myredis
目录下的所有 dump**.rdb ,然后再删除 redis6380.conf
和redis6381.conf
,留下 redis6379.conf
修改 redis6379.conf
。仅留下以下内容。
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进入主从切换
然后复制5份分别为redis6380.conf
,redis6381.conf
,redis6389.conf
,redis6390.conf
,redis6391.conf
。并将里面的端口信息修改为对应的端口。例如 6379
---> 6380
可以使用快捷键批量替换字符
启动6个redis服务
2.2 将6个节点合成一个集群#
组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都正常生成。
合体:
# 进入redis的安装目录下的 src 文件夹
cd /export/software/redis-6.2.6/src/
# --cluster 集群操作
# create 创建集群
# --cluster-replicas 1 1代表从机数量。采用最简单的方式配置集群,一台主机,一台从机。6台主机正好三组
# 都填写真实IP地址,不要用127.0.0.1
redis-cli --cluster create --cluster-replicas 1 192.168.121.138:6379 192.168.121.138:6380 192.168.121.138:6381 192.168.121.138:6389 192.168.121.138:6390 192.168.121.138:6391
2.3 采用集群的方式连接#
# -c :采用集群策略连接,设置数据会自动切换到相应的“写”主机
# 在redis安装目录下的src文件夹中操作
redis-cli -c -p 6379
2.4 什么是slots#
一个Redis集群包含16384个插槽,数据库中的每个键都属于这16384个插槽中的其中一个。
集群使用公式 CRC16(key) % 16384
来计算键 key 属于哪个槽,其中 CRC16(key)
语句用于计算键 key 的CRC16校验和。
集群每个节点负责一部分插槽。
2.4.1 在集群中插入值
2.4.2 查询集群中的值
cluster keyslot cust # 计算key对应的插槽值
cluster countkeysinslot 4847 # 计算该插槽值里面有几个key
cluster getkeysinslot 4847 10 # 在对应插槽中返回10个值
2.5 故障恢复#
测试某主机挂掉,和重启后的情况。
三、Jedis操作集群#
package com.example.jedis;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class RedisClusterDemo {
public static void main(String[] args) {
//创建对象
HostAndPort hostAndPort = new HostAndPort("192.168.121.138", 6379);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//进行操作
jedisCluster.set("b1", "value1");
String b1 = jedisCluster.get("b1");
System.out.println(b1);
jedisCluster.close();
}
}
四、Redis集群的优缺点#
4.1 优点#
- 实现扩容
- 分摊压力
- 无中心配置相对简单
4.2 不足#
- 多键操作是不支持的
- 多键的Redis事务是不被支持的。lua脚本不被支持。
- 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
参考资源:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器