11.3 使用StringRedisTemplate和RedisTemplate
两者的关系是StringRedisTemplate继承RedisTemplate。
两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
@Autowired private StringRedisTemplate stringRedisTemplate; //对字符串支持比较友好,不能存储对象 @Autowired private RedisTemplate redisTemplate; //存储对象 @Test public void testRedisTemplate(){ System.out.println(redisTemplate); //设置redistemplate值使用对象序列化策略 redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());//指定值使用对象序列化 //redisTemplate.opsForValue().set("user",new User("21","小黑",23,new Date())); User user = (User) redisTemplate.opsForValue().get("user"); System.out.println(user); }
11.4.opsForXXX和boundXXXOps区别
//key的绑定操作 如果日后对某一个key的操作及其频繁,可以将这个key绑定到对应redistemplate中,日后基于绑定操作都是操作这个key
//boundValueOps 用来对String值绑定key
//boundListOps 用来对List值绑定key
//boundSetOps 用来对Set值绑定key
//boundZsetOps 用来对Zset值绑定key
//boundHashOps 用来对Hash值绑定key
@Test public void test(){ ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue(); valueOperations.set("name","zhangsan"); valueOperations.append("name","this is good man"); valueOperations.size("name"); //String //stringRedisTemplate.boundValueOps() BoundValueOperations<String, String> nameOperations = stringRedisTemplate.boundValueOps("name"); nameOperations.set("xiaochen"); nameOperations.append("this is good man"); nameOperations.size(); //list ListOperations<String, String> listOperations = stringRedisTemplate.opsForList(); listOperations.leftPush("lists","zhangsan"); listOperations.size("lists"); listOperations.range("lists",0,-1); BoundListOperations<String, String> listsOperations = stringRedisTemplate.boundListOps("lists"); listsOperations.leftPush("zhangsan"); listsOperations.leftPush("xiaozhang"); listsOperations.size(); listsOperations.range(0,-1); //stringRedisTemplate.boundSetOps() //stringRedisTemplate.boundZsetOps() //stringRedisTemplate.boundHashOps() }
12. Redis 主从复制
5.x版本之后不支持
12.1 主从复制
主从复制架构仅仅用来解决数据的冗余备份,从节点仅仅用来同步数据
无法解决: 1.master节点出现故障的自动故障转移
12.2 主从复制架构图
12.3 搭建主从复制
这里给大家演示Redis伪分布式的搭建
**1.准备三台机器 **
2.准备三个配置文件
mkdir master slave1 slave2
3.复制三份配置文件到指定目录
cp redis-4.0.10/redis.conf master/
cp redis-4.0.10/redis.conf slave1/
cp redis-4.0.10/redis.conf slave2/
4.修改配置文件
vim master/redis.conf
master 修改以下配置:
port 7001 bind 0.0.0.0
vim slave1/redis.conf
slave1 修改以下配置:
port 7002 bind 0.0.0.0 slaveof 10.15.0.5 7001
vim slave2/redis.conf
slave2 修改以下配置:
port 7003 bind 0.0.0.0 slaveof 10.15.0.5 7001
# 5.启动3台机器进行测试 - cd /usr/redis/bin - ./redis-server /root/master/redis.conf - ./redis-server /root/slave1/redis.conf - ./redis-server /root/slave2/redis.conf
13. Redis哨兵(Sentinel)机制
13.1 哨兵Sentinel机制
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有自动故障转移功能的主从架构。
无法解决: 1.单节点并发压力问题 2.单节点内存和磁盘物理上限
13.2 哨兵架构原理
13.3 搭建哨兵架构
1.创建sentinel启动配置文件
mkdir sentinel
touch sentinel/sentinel.conf 新建sentinel.conf文件,名字绝对不能错;
2.配置哨兵,在sentinel.conf文件中填入内容:
在sentinel.conf中加入以下配置:
vim sentinel/sentinel.conf
sentinel monitor 被监控数据库名字(自己起名字) ip port 1
eg:
sentinel monitor aa 10.15.0.5 7001 1
说明:这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能。
3.将哨兵的启动脚本文件复制到redis目录下
cp redis-4.0.10/src/redis-sentinel /usr/redis/
4.进入redis目录指定配置文件启动rendis-sentinel
./redis-sentinel /root/sentinel/sentinel.conf
5.测试哨兵能否自动的作主节点故障转移
13.4 通过springboot操作哨兵
# redis sentinel 配置 # master书写是使用哨兵监听的那个名称 spring.redis.sentinel.master=mymaster # 连接的不再是一个具体redis主机,书写的是多个哨兵节点 spring.redis.sentinel.nodes=192.168.202.206:26379
注意:如果连接过程中出现如下错误:RedisConnectionException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2)
解决方案:在哨兵的配置文件中加入bind 0.0.0.0 开启远程连接权限