1.课程计划
1 | 1、首页轮播图展示(已经完成) |
2.Redis集群的搭建
2.1.redis-cluster架构图 (redis官方给出的集群方案)
redis-cluster投票:容错
架构细节:
- 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
- 节点的fail是通过集群中超过半数的节点检测失效时才生效.
- 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value->->
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
5.2Redis集群的搭建
Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。
Redis集群至少需要6台服务器。
搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006
5.3搭建步骤
需要6台redis服务器。搭建伪分布式。
需要6个redis实例。
需要运行在不同的端口7001-7006
第一步:创建redis-cluster目录,并修改配置文件,删除无用文件
第二步:复制实例(6个)
第三步:修改六个实例的端口号
第四步:写批处理文件
第五步:修改批处理文件的权限
第六步:运行批处理文件
第七步:拷贝redis集群所用的工具
第八步:安装ruby的运行环境
第九步:导入ruby所用的一个第三方类库
第十步:安装这个类库
第十一步:运行redis-trib.rb这个工具(用来构建redis集群)
恭喜你!!!搭建成功!!!!
3.Jedis
需要把jedis依赖的jar包添加到工程中。Maven工程中需要把jedis的坐标添加到依赖。
推荐添加到服务层。E3-content-Service工程中。
3.1连接单机版
第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
第三步:打印结果。
第四步:关闭Jedis1
2
3
4
5
6
7
8
9
10
11
12
13@Test
public void testJedis() throws Exception{
//创建一个连接jedis对象,参数:host、port
Jedis jedis = new Jedis("192.168.25.128",6379);
//直接使用jedis操作redis,所有jedis的命令都对应一个方法
jedis.set("test123","my first jedis test");
String test123 = jedis.get("test123");
System.out.println(test123);
//关闭连接
jedis.close();
}
3.2连接单机版使用连接池
第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
第二步:从JedisPool中获得Jedis对象。
第三步:使用Jedis操作redis服务器。
第四步:操作完毕后关闭jedis对象,连接池回收资源。
第五步:关闭JedisPool对象。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15@Test
public void testJedisPool(){
//创建一个连接池,两个参数host、port
JedisPool jedisPool = new JedisPool("192.168.25.128",6379);
//从连接池获得一个连接,就是一个jedis对象
Jedis jedis = jedisPool.getResource();
//使用jedis操作redis
String test123 = jedis.get("test123");
System.out.println(test123);
//关闭连接,每次使用完毕后关闭连接,连接池回收资源
jedis.close();
//关闭连接池
jedisPool.close();
}
3.3连接集群版
第一步:使用JedisCluster对象。需要一个Set
第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
第三步:打印结果
第四步:系统关闭前,关闭JedisCluster对象。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19@Test
public void testJedisCluster() throws Exception{
//创建一个JedisCluster对象。有一个参数nodes是一个set类型。set中包含若干个HostAndPort对象
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.128",7001));
nodes.add(new HostAndPort("192.168.25.128",7002));
nodes.add(new HostAndPort("192.168.25.128",7003));
nodes.add(new HostAndPort("192.168.25.128",7004));
nodes.add(new HostAndPort("192.168.25.128",7005));
nodes.add(new HostAndPort("192.168.25.128",7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
//直接使用JedisCluster对象操作redis
jedisCluster.set("test","123");
String test = jedisCluster.get("test");
System.out.println(test);
//关闭JedisCluster对象
jedisCluster.close();
}
4.向业务逻辑中添加缓存
4.1接口封装
常用的操作redis的方法提取出一个接口,分别对应单机版和集群版创建两个实现类。
4.1.1接口定义
1 | public interface JedisClient { |
4.1.2单机版实现类
1 | public class JedisClientPool implements JedisClient { |
4.1.3集群版实现类
1 | public class JedisClientCluster implements JedisClient { |
4.1.4封装代码测试
1 | @Test |
4.2添加缓存
4.2.1功能分析
1 | 查询内容列表时添加缓存。 |
注意:添加缓存不能影响正常业务逻辑。
4.2.1代码实现
1 | @Override |
4.2.1缓存同步
1 | @Override |