1、集群
概念
Redis Cluster是社区版推出的Redis分布式集群解决方案,主要解决Redis分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster能起到很好的负载均衡的目的。
Redis Cluster集群节点最小配置6个节点以上(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用
优缺点
优点:
- 无中心架构
- 数据按照slot存储分布在多个节点,节点间数据共享,可动态调整数据分布
- 可扩展性:可线性扩展到1000多个节点,节点可动态添加或删除
- 高可用性:部分节点不可用时,集群仍可用。通过增加Slave做standby数据副本,能够实现故障自动failover,节点之间通过gossip协议交换状态信息,用投票机制完成Slave到Master的角色提升
- 降低运维成本,提高系统的扩展性和可用性
缺点:
- 节点会因为某些原因发生阻塞(阻塞时间大于clutser-node-timeout),被判断下线,这种failover是没有必要的
- Slave在集群中充当“冷备”,不能缓解读压力,当然可以通过SDK的合理设计来提高Slave资源的利用率
- Key批量操作限制,如使用mset、mget目前只支持具有相同slot值的Key执行批量操作。对于映射为不同slot值 的Key由于Keys不支持跨slot查询,所以执行mset、mget、sunion等操作支持不友好
- Key事务操作支持有限,只支持多key在同一节点上的事务操作,当多个Key分布于不同的节点上时无法使用事务功能
- 不支持多数据库空间,单机下的redis可以支持到16个数据库,集群模式下只能使用1个数据库空间,即db 0
搭建
1.在/usr/local目录下创建文件夹redis-cluster
mkdir /usr/local/redis-cluster
2.在redis-cluster下创建六个子文件夹分别是7001-7006
cd /usr/loca/redis-cluster
mkdir 7001
mkdir 7002
...
mkdir 7006
3.将redis.conf配置文件复制到7001中
cp /usr/local/redis-5.0.7/redis.conf /usr/loca/redis-cluster/7001/
4.修改配置文件
cd /usr/local/redis-cluster/7001/
vim redis.conf
在redis.conf中找到对应配置并改成如下模样
daemonize yes
port 7001
dir /usr/local/redis-cluster1/7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
bind 0.0.0.0
5.将7001中的redis.conf 复制到7002-7006中,并将配置文件中的7001改成对应的文件名字
cp redis.conf /usr/local/redis-cluster/7002
...
6、安装ruby的相关的工具(redis5.0开始这个步骤可省略)
yum install ruby
yum install rubygems
gem install redis
7.开启服务
./redis-server /usr/local/redis-cluster/7001/redis.conf
./redis-server /usr/local/redis-cluster/7002/redis.conf
...
8.创建集群
最后的1代表的是主服务器和从服务器的比值,三主三从
redis-cli --cluster create ip地址:7001 ip地址:7002 ip地址:7003 ip地址:7004 ip地址:7005 ip地址:7006 --cluster-replicas 1 -a redis密码
9.登陆redis客户端
./redis-cli -c -h ip地址 -p 端口号
2、SpringBoot整合redis
导包
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
配置文件
#配置集群端口号
spring.redis.cluster.nodes=114.55.219.117:7001,114.55.219.117:7002,114.55.219.117:7003,114.55.219.117:7004,114.55.219.117:7005,114.55.219.117:7006
#配置redis密码
spring.redis.password=caonima
controller
@RestController
public class RedisController {
@Autowired
private IRedisService redisService;
@RequestMapping("addValue")
public Object add(){
redisService.add("xbb","xdd");
return "执行完成";
}
@RequestMapping("getValue")
public String get(String key){
return redisService.getValueByKey(key);
}
}
manager的使用
@Component
public class RedisManager {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void add(String key,String value){
stringRedisTemplate.opsForValue().set(key,value);
}
public String getValueByKey(String key){
return stringRedisTemplate.opsForValue().get(key);
}
}
测试:http://localhost:8080/getValue?key=xbb