目录
二 Redis高可用(主从复制,持久化)-->哨兵机制+keepalived
一 SpringBoot集成Redis
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
spring.redis.database=0
spring.redis.host=192.168.110.180
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=5000
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
//封装不全
@Service
public class RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public void setObject(String key, Object value) {
this.setObject(key, value, null);
}
public void setObject(String key, Object value, Long time) {
if (StringUtils.isEmpty(key) || value == null) {
return;
}
if (value instanceof String) {
// 存放string类型
String stringValue = (String) value;
if (time == null) {
stringRedisTemplate.opsForValue().set(key, stringValue);
} else {
stringRedisTemplate.opsForValue().set(key, stringValue, time, TimeUnit.SECONDS);
}
return;
}
if (value instanceof List) {
// 存放list類型
List<String> listValue = (List<String>) value;
for (String string : listValue) {
stringRedisTemplate.opsForList().leftPush(key, string);
}
}
}
public void delKey(String key) {
stringRedisTemplate.delete(key);
}
public String getString(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
}
@RestController
public class IndexController {
@Autowired
private RedisService redisService;
@RequestMapping("/setObject")
public String setString(String key, String value) {
redisService.setObject(key, value, 30l);
return "success";
}
@RequestMapping("/setList")
public String setList(String key) {
List<String> listValue = new ArrayList<String>();
listValue.add("zhangsan");
listValue.add("lisi");
redisService.setObject(key, listValue);
return "success";
}
@RequestMapping("/getString")
public String getString(String key) {
return redisService.getString(key);
}
}
二 Redis高可用(主从复制,持久化)-->哨兵机制+keepalived
Redis高可用:哨兵机制+keepalived
哨兵机制:选举Master;keepalived:自动重启 。
主从复制:数据备份,读写分离,集群,高可用,宕机容错机制
实现主从复制:只是需要修改配置文件
redis只能一主多备 ,nginx多主多备
高可用机制----
哨兵机制(投票选举):监听服务器 ,如果监听主服务器宕机,会在从服务器根据投票选择为主服务器;
如果所有的服务器都宕机了,用keepalived(高可用)监听,自动重启,一直重启失败,发送邮件给运维人员。
keepalived是重启脚本,任何软件一个挂了,都可监听,进行重启
Redis主从复制集群
mysql主从复制原理:二进制存储文件,Mycat反向代理
如果redis的主服务器挂了,从服务器实时把主服务器里面的快照文件拿过来,执行一次;如果有延迟,重试机制再次执行
搭建服务器集群
注意:1使用root账号登录 2关闭所有防火墙
关闭防火墙
修改 slave (从服务器)redis.conf
192.168.110.181为主服务器
修改slave从redis中的 redis.conf文件
slaveof 192.168.110.181 6379
masterauth 123456--- 主redis服务器配置了密码,则需要配置
cd redis/ cd bin
启动后输入命令 ping 和 info
Redis哨兵机制
管理多台服务器,哨兵(sentinel) 的一些设计思路和zookeeper非常类似
实现步骤: 修改从服务器
1.拷贝到etc目录
先进入 cd redis
cp sentinel.conf /usr/local/redis/etc
2.修改sentinel.conf配置文件,找到模板示例进行修改
cd /usr/local/redis/etc
sentinel monitor mymast 192.168.110.181 6379 1 #主节点 名称 IP 端口号 选举次数
sentinel auth-pass mymaster 123456
关闭防火墙
3. 修改心跳检测 5000毫秒
sentinel down-after-milliseconds mymaster 5000
4.sentinel parallel-syncs mymaster 2 --- 做多多少合格节点
5. 启动哨兵模式 进入bin目录启动
./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &
启动成功
6. 停止哨兵模式
宕机命令:shutdown 宕机后重新选择服务器为主服务器
三、Redis持久化
redis宕机后,数据不会消失
什么是Redis持久化,就是将内存数据保存到硬盘。
Redis 持久化存储 (AOF 与 RDB 两种模式),默认开启rdb存储,可以同时开启
rdb存储和aof存储
rdb存储:二进制文件方式,不是实时存储。存储10key以上,开始持久化机制,体积小
aof存储:日志文件存储,文件大,在文件末尾进行累加
Redis持久化RDB(默认存储)
RDB 是以二进制文件,是在某个时间 点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
先关闭哨兵机制,关闭后redis不会关闭,rdb宕机会做灾难备份,但是不是实时的,杀死进程不能灾难备份,需要达到一定的key的次数才会保存
RDB 默认开启,redis.conf 中的具体配置参数如下;
#dbfilename:持久化数据存储在本地的文件
dbfilename dump.rdb
#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下
dir ./
##snapshot触发的时机,save
##如下为900秒后,至少有一个变更操作,才会snapshot
##对于此值的设置,需要谨慎,评估系统的变更操作密集程度
##可以通过“save “””来关闭snapshot功能
#save时间,以下分别表示更改了1个key时间隔900s进行持久化存储;更改了10个key300s进行存储;更改10000个key60s进行存储。
save 900 1
save 300 10
save 60 10000
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间
rdbcompression yes
AOF持久化
AOF 默认关闭,开启方法,修改配置文件 reds.conf:appendonly yes
##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能
##只有在“yes”下,aof重写/文件同步等特性才会生效
appendonly yes
##指定aof文件名称
appendfilename appendonly.aof
##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec
appendfsync everysec
##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no”
no-appendfsync-on-rewrite no
##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb”
auto-aof-rewrite-min-size 64mb
##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。
##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后
##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。
auto-aof-rewrite-percentage 100
redis宕机后,redis会失效吗?
答:不会,默认开启rdb
四 、Redis事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
序号 | 命令及描述 |
1 | DISCARD |
2 | EXEC |
3 | MULTI |
4 | UNWATCH |
5 | WATCH key [key ...] |
五、Redis发布订阅(用mq)