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 端口号

redis 集群 节点 redis集群节点数量与性能_spring

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

redis 集群 节点 redis集群节点数量与性能_ip地址_02