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?
(2) Redis Desktop Manager在使用时需要注意什么?
①只能连接单机版Redis
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。