Redis集群搭建

一、安装

第一步:下载redis

wget http://download.redis.io/releases/redis-5.0.5.tar.gz

第二步:解压压缩包

tar -zxvf redis-5.0.5.tar.gz

第三步:编译安装

make MALLOC=libc
将/usr/local/redis-5.0.5/src目录下的文件添加到/usr/local/bin目录
cd src && make install

二、本机测试

2.1 启动

到安装目录下,使用此命令:./redis-server …/redis.conf

2.2 本地连接

./redis-cli

[root@izuf6gyz9kds1ehq1clau4z src]# ./redis-cli 
127.0.0.1:6379> 
2.3 新建值
127.0.0.1:6379> set "hutaoqizi" 胡桃七子
OK

三、新建Springboot项目

3.1主要引入的jar包
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>3.1.0</version>
</dependency>
3.2创建redis配置类
public class RedisConfig {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName("139.224.34.233");
        redisStandaloneConfiguration.setPort(6379);
        redisStandaloneConfiguration.setPassword("123456");
        redisStandaloneConfiguration.setDatabase(0);
        JedisConnectionFactory factory = new JedisConnectionFactory(redisStandaloneConfiguration);
        return factory;
    }

    @Bean
    public StringRedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        StringRedisTemplate redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        return redisTemplate;
    }
}

3.3创建测试类
public class RedisTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RedisConfig.class);
        RedisTemplate redisTemplate = annotationConfigApplicationContext.getBean(StringRedisTemplate.class);
        System.out.println(redisTemplate.opsForValue().get("hutaoqizi"));
    }
}

输出结果为:胡桃七子

3.集群搭建

3.1修改配置文件

修改安装目录下的redis.conf文件

daemonize 后台模式,修改为yes
port 端口
bind 绑定的ip(指定ip访问,注释掉)
dir  指定数据存储文件夹
cluster-enabled 是否开启集群模式
cluster-config-file 集群配置文件夹(默认dir文件夹)
cluster-node-timeout 超时时间设置
appendonly 是否持久化
protected-mode 保护模式(开启需配置bind ip或者设置访问密码)
requirepass 密码
masterauth 集群通信密码

修改这些属性,单节点集群属性配置便完成了

3.2多节点配置

集群规格:redis集群最少6节点,3主3从。所有我用了2台虚拟机,每台3节点的搭建结构。当然你也可以1台虚拟机搭建6节点。

复制redis.conf文件,复制2份,如果你台虚拟机搭建6台,就直接复制6份。

修改每一份配置文件的端口,直接替换

vim redis.conf
:%s/6379/6380/g
3.3启动每一个节点

与前面启动方式,指定每一个配置文件启动./redis-server …/redis.conf。启动日志如下:

8432:C 11 Jan 2020 01:12:05.141 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8432:C 11 Jan 2020 01:12:05.141 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=8432, just started
8432:C 11 Jan 2020 01:12:05.141 # Configuration loaded

3.4集群创建

使用如下命令:

redis-cli -a 123456 --cluster create --cluster-replicas 1
139.224.34.233:6001 120.55.101.185:6002 139.224.34.233:6003
120.55.101.185:6004 139.224.34.233:6005 120.55.101.185:6006

replicas表示需要有几个slave,我这边是配置3主3从,所以设置为1

启动日志:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 120.55.101.185:6006 to 139.224.34.233:6001
Adding replica 139.224.34.233:6005 to 120.55.101.185:6002
Adding replica 120.55.101.185:6004 to 139.224.34.233:6003
M: efa2273be9e6e9a1aa35b4f4be1190c756d711fa 139.224.34.233:6001
   slots:[0-5460] (5461 slots) master
M: b438c55aaafebda8c2221d9528675bc604801d4c 120.55.101.185:6002
   slots:[5461-10922] (5462 slots) master
M: a916a0b6aedcd2262d7e43dac239cade68fda6da 139.224.34.233:6003
   slots:[10923-16383] (5461 slots) master
S: 4233d6a1ef57366505824489ffc63a6a2c7d5bb9 120.55.101.185:6004
   replicates a916a0b6aedcd2262d7e43dac239cade68fda6da
S: 1547aad124a719abaa6d249624beabb462369c9b 139.224.34.233:6005
   replicates b438c55aaafebda8c2221d9528675bc604801d4c
S: 5065a1565195402cbfc6f4ab2a579e959c2b1e72 120.55.101.185:6006
   replicates efa2273be9e6e9a1aa35b4f4be1190c756d711fa
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.....
>>> Performing Cluster Check (using node 139.224.34.233:6001)
M: efa2273be9e6e9a1aa35b4f4be1190c756d711fa 139.224.34.233:6001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 4233d6a1ef57366505824489ffc63a6a2c7d5bb9 120.55.101.185:6004
   slots: (0 slots) slave
   replicates a916a0b6aedcd2262d7e43dac239cade68fda6da
S: 1547aad124a719abaa6d249624beabb462369c9b 139.224.34.233:6005
   slots: (0 slots) slave
   replicates b438c55aaafebda8c2221d9528675bc604801d4c
S: 5065a1565195402cbfc6f4ab2a579e959c2b1e72 120.55.101.185:6006
   slots: (0 slots) slave
   replicates efa2273be9e6e9a1aa35b4f4be1190c756d711fa
M: b438c55aaafebda8c2221d9528675bc604801d4c 120.55.101.185:6002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: a916a0b6aedcd2262d7e43dac239cade68fda6da 139.224.34.233:6003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

slots:[0-5460] 为槽点区间,通过算法算出key的槽点,根据槽点找到对应节点

集群操作常用命令如下:

cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。节点
cluster meet <ip> <port> :将 ip 和 port所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot的导入(import)或者迁移(migrate)。
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。

4.java集群测试代码

修改redis配置文件

public class RedisConfig {

    @Bean
    public RedisClusterConfiguration redisClusterConfiguration() {
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration();
        RedisNode redisNode1 = new RedisNode("139.224.34.233", 6001);
        RedisNode redisNode2 = new RedisNode("139.224.34.233", 6003);
        RedisNode redisNode3 = new RedisNode("139.224.34.233", 6005);
        RedisNode redisNode4 = new RedisNode("120.55.101.185", 6002);
        RedisNode redisNode5 = new RedisNode("120.55.101.185", 6004);
        RedisNode redisNode6 = new RedisNode("120.55.101.185", 6006);
        List<RedisNode> redisNodes = new ArrayList<>();
        redisNodes.add(redisNode1);
        redisNodes.add(redisNode2);
        redisNodes.add(redisNode3);
        redisNodes.add(redisNode4);
        redisNodes.add(redisNode5);
        redisNodes.add(redisNode6);
        redisClusterConfiguration.setClusterNodes(redisNodes);
        redisClusterConfiguration.setPassword("123456");
        redisClusterConfiguration.setMaxRedirects(3);
        return redisClusterConfiguration;
    }

    @Bean
    public JedisPoolConfig jedisPoolConfig(){
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(100);
        jedisPoolConfig.setMaxTotal(600);
        return jedisPoolConfig;
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory(RedisClusterConfiguration redisClusterConfiguration,JedisPoolConfig jedisPoolConfig) {
        JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguration,jedisPoolConfig);
        return factory;
    }

    @Bean
    public StringRedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        StringRedisTemplate redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        return redisTemplate;
    }

}

测试,set键值

public class RedisTest {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(RedisConfig.class);
        RedisTemplate redisTemplate = annotationConfigApplicationContext.getBean(StringRedisTemplate.class);
        redisTemplate.opsForValue().set("hutaoqizi","123456");
    }
}

我这边写入到了6002的节点中
image

欢迎扫描下面图片关注我的个人公众号,回复“资源”可以获取java核心知识整理和经典书籍

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值