redis依赖包_092-Redis集群、JedisCluster

1. Redis集群-创建Redis集群

(1) 如何搭建Redis集群?

需求:

搭建一个 Redis 的最小集群,使用伪集群方式。

Redis 中最小的集群三对主从。

在 192.168.224.130 中安装 6 个 redis 实例。

如果使用已经使用过的单机版创建集群时,需要删除 dump.rdb 与 apeendonly.aof 文件。

6 个 redis 实例的端口分配:8001、8002、8003、8004、8005、8006

集群步骤:

redis 集群时需要使用一个 ruby 的脚本来完成集群。

第一步 安装 ruby 环境

命令: yum install ruby

第二步 安装 ruby 的包管理器

命令:yum install rubygems

第三步 进入到 redis 的安装目录下的 src 目录下找到到 redis-trib.rb 这个文件 这是集群时需要的脚本

第四步 这个脚本的执行需要依赖于一些其他的 ruby 包 所以我们还要下载一个redis-3.0.0.gem,将这个文件上传到 linux 服务器中

第五步 安装这个 ruby 包

命令:gem install redis-3.0.0.gem

第六步 先启动 redis 的 6 个实例

先在 local 目录下创建一个目录名称为:redis-cluster

命令:mkdir redis-cluster

第七步 将安装好的 redis 下的 bin 目录拷贝到 redis-cluster 目录下 并起名为 redis01

命令:进入到 redis 目录下执行:cp -r bin ../redis-cluster/redis01

第八步 删除 dump.rdb 与 apeendonly.aof 文件

第九步 修改 redis.conf 配置文件

命令:vim redis.conf

(1)修改端口:默认的为 6379 将六个 redis 实例的端口改成从 8001-8006 在配置文件的 port 属性中。

(2)修改开启集群 在配置文件中搜索 cluster 找到后 将默认为注释的 cluster-enabled yes 去掉注释

第十步 将这个 redis01 拷贝 6 份到当前这个目录下

命令:cp -r redis01/ redis02

cp -r redis01/ redis03

cp -r redis01/ redis04

cp -r redis01/ redis05

cp -r redis01/ redis06

第十一步 修改拷贝的这些 redis 的端口

命令:

[root@localhost redis-cluster]# vim redis02/redis.conf

[root@localhost redis-cluster]# vim redis03/redis.conf

[root@localhost redis-cluster]# vim redis04/redis.conf

[root@localhost redis-cluster]# vim redis05/redis.conf

[root@localhost redis-cluster]# vim redis06/redis.conf

第十二步 把创建集群的 ruby 脚本复制到 redis-cluster 中

第十三步 创建一个能够批量启动的脚本程序

命令:vim startall.sh

第十四步 在脚本文件中添加命令

命令:cd redis01

./redis.server redis.conf

cd ..

cd redis02

./redis.server redis.conf

cd ..

cd redis03

./redis.server redis.conf

cd ..

cd redis04

./redis.server redis.conf

cd ..

cd redis05

./redis.server redis.conf

cd ..

cd redis06

./redis.server redis.conf

cd ..

第十五步 将批量启动脚本设置为可执行权限

命令:chmod +x startall.sh

第十六步 执行这个批量启动的脚本

命令:[root@localhost redis-cluster]# ./startall.sh

第十七步 查看 redis 是否启动成功

命令:ps aux|grep redis

第十七步 创建集群

命令:./redis-trib.rb create --replicas 1 192.168.224.130:8001 192.168.224.130:8002 192.168.224.130:8003 192.168.224.130:8004 192.168.224.130:8005 192.168.224.130:8006

控制台会显示如下信息 输入 yes

>>> Creating clusterConnecting to node 192.168.224.130:8001: OK

Connecting to node 192.168.224.130:8002: OK

Connecting to node 192.168.224.130:8003: OK

Connecting to node 192.168.224.130:8004: OK

Connecting to node 192.168.224.130:8005: OK

Connecting to node 192.168.224.130:8006: OK

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

192.168.224.130:8001

192.168.224.130:8002

192.168.224.130:8003

Adding replica 192.168.224.130:8004 to 192.168.224.130:8001

Adding replica 192.168.224.130:8005 to 192.168.224.130:8002

Adding replica 192.168.224.130:8006 to 192.168.224.130:8003

M: 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7 192.168.224.130:8001

slots:0-5460 (5461 slots) master

M: e8038d0965377ff0793911a10984174b57ddbaaf 192.168.224.130:8002

slots:5461-10922 (5462 slots) master

M: be58583284fd2f26f03f2fce6c4e38de240eb841 192.168.224.130:8003

slots:10923-16383 (5461 slots) master

S: e66b85a7e72913f1ca4657600a0113d2cb0ece8e 192.168.224.130:8004

replicates 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7

S: 9f1897cb9c570487685c467b7b4b53f4c0c9f556 192.168.224.130:8005

replicates e8038d0965377ff0793911a10984174b57ddbaaf

S: 1966b2674ce141da372438a29e9e84bfad266da3 192.168.224.130:8006

replicates be58583284fd2f26f03f2fce6c4e38de240eb841

Can I set the above configuration? (type 'yes' to accept):

如果控制台输出如下信息表集群成功

>>> 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 192.168.224.130:8001)

M: 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7 192.168.224.130:8001

slots:0-5460 (5461 slots) master

M: e8038d0965377ff0793911a10984174b57ddbaaf 192.168.224.130:8002

slots:5461-10922 (5462 slots) master

M: be58583284fd2f26f03f2fce6c4e38de240eb841 192.168.224.130:8003

slots:10923-16383 (5461 slots) master

M: e66b85a7e72913f1ca4657600a0113d2cb0ece8e 192.168.224.130:8004

slots: (0 slots) master

replicates 8cf30cb6141b5d5db1fce2c8bdabe32666bbb1e7M: 9f1897cb9c570487685c467b7b4b53f4c0c9f556 192.168.224.130:8005

slots: (0 slots) master

replicates e8038d0965377ff0793911a10984174b57ddbaaf

M: 1966b2674ce141da372438a29e9e84bfad266da3 192.168.224.130:8006

slots: (0 slots) master

replicates be58583284fd2f26f03f2fce6c4e38de240eb841

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

测试 Redis 集群

测试 Redis 集群:可以连接集群中的任意一个节点进行测试 注意一定要有-c 参数,则能连上,但是无法操作 redis 集群

命令:[root@localhost redis-cluster]# ./redis01/redis-cli -h 192.168.224.130-p 8001 -c

关闭 Redis 集群

命令:bin/redis-cli -p 8001 shutdown

也可以编写一个批量关闭的脚本

命令:vim shutdown.sh

./redis01/redis-cli -h 192.168.224.130 -p 8001 shutdown

./redis01/redis-cli -h 192.168.224.130 -p 8002 shutdown

./redis01/redis-cli -h 192.168.224.130 -p 8003 shutdown

./redis01/redis-cli -h 192.168.224.130 -p 8004 shutdown

./redis01/redis-cli -h 192.168.224.130 -p 8005 shutdown

./redis01/redis-cli -h 192.168.224.130 -p 8006 shutdown

2. Jedis操作Redis单机版

(1) 什么是Jedis?

Jedis 集成了 redis 的一些命令操作,封装了对 redis 命令的 Java 客户端。

(2) 在代码中如何通过Jedis单机版操作Redis?

修改pom文件,添加 Jedis 坐标

<dependencies>

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.9.0</version>

</dependency>

</dependencies>

测试代码

package com.bjsxt;

import java.util.Set;

import redis.clients.jedis.Jedis;

public class JedisTest {

public static void main(String[] args) {

JedisTest.testIedisSingle();

}

/*

* Jedis单机版测试

*/

public static void testIedisSingle() {

//创建Jedis对象

Jedis jedis=new Jedis("192.168.224.130", 6379);

//调用Jedis的API完成对Redis的操作,在jedis中方法的命名与操作redis的命令相同

String result = jedis.set("key1", "hello");

System.out.println(result);

String str = jedis.get("key1");

System.out.println(str);

System.out.println("--------------");

Long l = jedis.hset("user", "username", "dijia");

System.out.println(l);

String res = jedis.hget("user", "username");

System.out.println(res);

jedis.close();

}

}

3. JedisPool的使用

(1) 在代码中如何通过Jedis连接池操作Redis?

public static void testJedisPool() {

//创建连接池

JedisPool pool = new JedisPool("192.168.224.130", 6379);

//获取Jedis对象

Jedis jedis = pool.getResource();

String res = jedis.hget("user", "username");

System.out.println(res);

jedis.close();

}

4. JedisCluster的使用

(1) 如何通过JedisCluster操作Redis集群?

public static void testJedisCluster() throws IOException {

//创建HosetAndPort:集群中的一个节点

Set<HostAndPort> nodes=new HashSet<>();

nodes.add(new HostAndPort("192.168.224.130", 8001));

nodes.add(new HostAndPort("192.168.224.130", 8002));

nodes.add(new HostAndPort("192.168.224.130", 8003));

nodes.add(new HostAndPort("192.168.224.130", 8004));

nodes.add(new HostAndPort("192.168.224.130", 8005));

nodes.add(new HostAndPort("192.168.224.130", 8006));

//创建操作集群的jedis对象

JedisCluster jc = new JedisCluster(nodes);

jc.set("aoteman", "aisi");

String string = jc.get("aoteman");

System.out.println(string);

jc.close();

}

5. Spring整合Jedis单机版-配置整合

(1) 在Spring中如何整合Jedis单机版?

创建 JedisDao 接口与接口实现类

创建 JedisDao 接口

package com.bjsxt.dao;

public interface JedisDao {

public String set(String key,String value);

public String get(String key);

public Long hset(String hkey, String key,String value);

public String hget(String hkey,String key);

}

创建 JedisDao 接口实现类

package com.bjsxt.dao.impl;

import org.omg.CORBA.PRIVATE_MEMBER;

import org.springframework.beans.factory.annotation.Autowired;

import com.bjsxt.dao.JedisDao;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

public class JedisDaoImplSingle implements JedisDao{

// 创建 Jedis 连接池

@Autowired

private JedisPool jedisPool;

@Override

public String set(String key, String value) {

Jedis jedis = jedisPool.getResource();

return jedis.set(key, value);

}

@Override

public String get(String key) {

Jedis jedis = jedisPool.getResource();

return jedis.get(key);

}

@Override

public Long hset(String hkey, String key, String value) {

Jedis jedis = jedisPool.getResource();

return jedis.hset(hkey, key, value);

}

@Override

public String hget(String hkey, String key) {

Jedis jedis = jedisPool.getResource();

return jedis.hget(hkey, key);

}

}

在 Spring 配置文件中整合 Jedis

<!-- 扫描器 -->

<context:component-scan base-package="com.bjsxt.dao"></context:component-scan>

<!-- jedisPool的配置 -->

<bean id="poolconfig" class="redis.clients.jedis.JedisPoolConfig">

<!-- 最大连接数 -->

<property name="maxTotal" value="30" />

<!-- 最大空闲连接数 -->

<property name="maxIdle" value="10" />

<!-- 每次释放连接的最大数目 -->

<property name="numTestsPerEvictionRun" value="1024" />

<!-- 释放连接的扫描间隔(毫秒) -->

<property name="timeBetweenEvictionRunsMillis" value="30000" />

<!-- 连接最小空闲时间 -->

<property name="minEvictableIdleTimeMillis" value="1800000" />

<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->

<property name="softMinEvictableIdleTimeMillis" value="10000" />

<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->

<property name="maxWaitMillis" value="1500" />

<!-- 在获取连接的时候检查有效性, 默认false -->

<property name="testOnBorrow" value="true" />

<!-- 在空闲时检查有效性, 默认false -->

<property name="testWhileIdle" value="true" />

<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->

<property name="blockWhenExhausted" value="false" /></bean>

<!-- 配置连接池 -->

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">

<constructor-arg name="poolConfig">

<ref bean="poolconfig"/>

</constructor-arg>

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>6379</value>

</constructor-arg>

</bean>

<!-- JedisDaoImplSingle ,创建接口实现类对象-->

<bean id="jedisDaoImplSingle" class="com.bjsxt.dao.impl.JedisDaoImplSingle"></bean>

测试类

package com.bjsxt;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.bjsxt.dao.JedisDao;

public class Test {

public static void main(String[] args) {

Test.testJedisSingle();

}

public static void testJedisSingle() {

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-jedis.xml");

JedisDao jd = (JedisDao)ac.getBean("jedisDaoImplSingle");

String str = jd.set("shenshou", "yangtuo");

System.out.println(str);

String result = jd.get("shenshou");

System.out.println(result);

}

}

6. Spring整合JedisCluster

(1) 在Spring中如何整合Jedis集群版?

在 Spring 配置文件中整合 JedisCluster

<!-- 扫描器 -->

<context:component-scan base-package="com.bjsxt.dao"></context:component-scan>

<!-- jedisPool的配置 -->

<bean id="poolconfig" class="redis.clients.jedis.JedisPoolConfig">

<!-- 最大连接数 -->

<property name="maxTotal" value="30" />

<!-- 最大空闲连接数 -->

<property name="maxIdle" value="10" />

<!-- 每次释放连接的最大数目 -->

<property name="numTestsPerEvictionRun" value="1024" />

<!-- 释放连接的扫描间隔(毫秒) -->

<property name="timeBetweenEvictionRunsMillis" value="30000" />

<!-- 连接最小空闲时间 -->

<property name="minEvictableIdleTimeMillis" value="1800000" />

<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->

<property name="softMinEvictableIdleTimeMillis" value="10000" />

<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->

<property name="maxWaitMillis" value="1500" />

<!-- 在获取连接的时候检查有效性, 默认false -->

<property name="testOnBorrow" value="true" />

<!-- 在空闲时检查有效性, 默认false -->

<property name="testWhileIdle" value="true" />

<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->

<property name="blockWhenExhausted" value="false" />

</bean>

<!-- 配置连接池 -->

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">

<constructor-arg name="poolConfig">

<ref bean="poolconfig"/>

</constructor-arg>

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>6379</value>

</constructor-arg>

</bean>

<!-- JedisDaoImplSingle ,创建接口实现类对象-->

<!-- <bean id="jedisDaoImplSingle" class="com.bjsxt.dao.impl.JedisDaoImplSingle"></bean> -->

<!-- JedisCluster配置 -->

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">

<constructor-arg name="nodes">

<set>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" >

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8001</value>

</constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8002</value>

</constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8003</value>

</constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8004</value>

</constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8005</value>

</constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host">

<value>192.168.224.130</value>

</constructor-arg>

<constructor-arg name="port">

<value>8006</value>

</constructor-arg>

</bean>

</set>

</constructor-arg>

<constructor-arg name="poolConfig">

<ref bean="poolconfig"/>

</constructor-arg>

</bean>

<!-- JedisDaoImplCluster 创建接口实现类对象 -->

<bean id="jedisDaoImplCluster" class="com.bjsxt.dao.impl.JedisDaoImplCluster"></bean>

测试集群Jedis

public static void testJedisCluster() {

ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext-jedis.xml");

JedisDao jdc =(JedisDao) ac.getBean("jedisDaoImplCluster");

Long hl = jdc.hset("user", "usersex", "f");

System.out.println(hl);

String hstr = jdc.hget("user", "usersex");

System.out.println(hstr);

}

7. RedisDesktopManager的使用

(1) 如何通过Redis Desktop Manager工具管理Redis?

b608e14b4ce3ea4ad733531a3e772cd7.png

(2) Redis Desktop Manager在使用时需要注意什么?

①只能连接单机版Redis

分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值