这篇文章主要介绍“Redis安装配置及整合SpringBoot的方法”,在日常操作中,相信很多人在Redis安装配置及整合SpringBoot的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis安装配置及整合SpringBoot的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
安装 Redis
# 下载Redis
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
# 解压 redis
tar -zxvf redis-6.0.9.tar.gz
# 安装 gcc 环境, 安装过 忽略
yum -y install gcc-c++
cd redis-5.0.5
# 安装
make && make install
Redis 配置启动脚本
# 拷贝 utils 目录下的 redis_init_script 到 /etc/init.d 目录下 redis_init_script 是启动脚本
cp utils/redis_init_script /etc/init.d
cd /etc/init.d
vim /etc/init.d/redis_init_script
# ----------------- redis_init_script start ---------------
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6379
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
# redis 默认端口
REDISPORT=6379
# redis 默认启动 redis-server 位置
EXEC=/usr/local/bin/redis-server
# redis redis-cli 位置
CLIEXEC=/usr/local/bin/redis-cli
# redis pid 位置 拼接了默认端口参数。
PIDFILE=/var/run/redis_${REDISPORT}.pid
# redis 默认配置的conf 配置文件
CONF="/usr/local/redis/conf/redis.conf"
# $1 参数 为 start 或者 stop
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
# ----------------- redis_init_script end ---------------
# 保存之后启动redis
./redis_init_script start
# 停止 redis
./redis_init_script stop
配置Redis 开启自启动
# 在以下位置加上一段注释
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6379
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
#chkconfig: 22345 10 90
#desccription: Start and Stop redis
:wq! # 保存
# 注册redis 到开机自启动
chkconfig redis_init_script on
Redis 配置文件解析
# 设置后台运行 yes 后台运行, no 前台运行
daemonize yes
# pidfile pid 目录文件
pidfile /var/run/redis_6379.pid
# dir redis 的工作空间。必须写一个目录。不能写一个文件名
dir /usr/local/redis/working
# bind 哪些ip地址可以访问 redis-server 0.0.0.0 任何地址都可以访问
bind 0.0.0.0
# requirepass 设置 redis 链接密码
requirepass 584521
SpringBoot 整合 Redis
<dependency>
<goupId>org.springframework.boot</goupId>
<artifactId>spring-boot-starter-data-redis</aartifactId>
</dependency>
spring:
redis:
database: 0 # 数据库
host: 127.0.0.1 # redis 地址
port: 6379 # redis 端口
password: 584521 # redis 密码
@ApiIgnore
@RestController
@RequestMapping("redis")
public class RedisController {
@Autowired
private RedisTemplate redisTemplate;
@GetMapping("/set")
public Object set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
return "ok";
}
@GetMapping("get")
public Object get(String key) {
Object value = redisTemplate.opsForValue().get(key);
return value;
}
@GetMapping("delete")
public Object delete(String key) {
redisTemplate.delete(key);
return "ok";
}
}
Redis 持久化机制
Redis RDB 机制 Redis DataBase
# 打开 redis.conf 文件
vim redis.conf
# redis 工作空间
dir /usr/local/redis/working
# rdb 持久化文件名
dbfilename dump.rdb
# save 保存到硬盘。多少时间内发生了多少次改变
save 900 1
save 300 10
save 60 10000
# stop-writes-on-bgsave-error 保存时,发生错误停止写入操作
stop-writes-on-bgsave-error yes
# rdbcompression 压缩 rdb 文件 如果像节省cpu性能开销。 就可以关闭 no
rdbcompression yes
# rdbchecksum 压缩 rdb 文件以后。 是否要检验 rdb 文件。 会有百分之 10 的性能损耗
rdbchecksum yes
RDB 优点
全量备份
可以远程传输
子进程备份时,主进程不会有IO操作。
RDB 缺点
Redis AOF 机制 Append Only File
Redis 默认使用的是RDB模式作为持久化操作
关于 AOF 的配置名称
# 选择是否开启 aof
appendonly yes
# appendfilename 配置 aof 持久化文件的名称
appendfilename "appendonly.aof"
# appendfsync aof 文件的同步策略。 always 针对每一次的写操作。 资源占用比较大。, erverysec 每秒同步一次 no 永不同步
appendfsync everysec
# no-appendfsync-on-rewrite 重写的时候可以不做同步。 如果是yes 有可能会导致文件内容的不一致性
bi-appendfsync-on-rewrite no
# auto-aof-rewrite-percentage 100 aof 文件增长比例,指当前 aof 文件比上次重写的增长比例大小。 aof 重写即在 aof 文件在一定大小之后,重新将整个内存写道 aof 文件当中,以反应最新得状态 这样就避免了文件过大而实际内存数据小的问题。 (频繁修改问题)
auto-aof-rewrite-percentage 100
# auto-aof-rewrite-min-size 64mb aof 文件重写最小得文件大小。即最开始 aof 文件必须要达到这个文件时才触发,后面的每次重写就不会根据这个变量了, 根据上一次重写完成之后的大小。 此变量仅仅只有初始化启动 redis 时有效,如果是 redis 恢复时, 则 lastSize 等于初始 aof 文件大小。
auto-aof-rewrite-min-size 64mb
# aof-load-truncated 指redis在恢复时,会忽略最后一条可能存在问题的指令。默认值yes。即在aof写入时,可能存在指令写错的问题(突然断电,写了一半),这种情况下,yes会log并继续,而no会直接恢复失败.
aof-load-truncated yes
不小心使用了 flushdb , flushall 。 我们可以停止 redis-server, 打开 aof 文件。 将 flushdb flushall 这种命令直接删除。重启 redis 服务
RDB 和 AOF 可以同时使用, 加载顺序,先加载 AOF 再加载 RDB
Redis 主从架构
原来的单个Redis作为一个主 (Master),多个从 (Slave) 。读写分离架构。 主作为写库, 从作为读库,也就是说写操作操作 Mater, 大多数读操作用 Slave 。Slave 会对 Mater 做一个全量复制的数据。
Master 先启动,随后启动 Slave , 然后 Slave 会去 ping Master 节点,ping 通知后。 Master 会将数据提交给 Slave。Master 的数据复制是全量复制。
Master 会从内存中拷贝所有的 数据生成RDB文件。然后通过网络传输给我们的 Slave 节点。
Slave 拿到 RDB 文件后,会先下载到自己的硬盘中,然后再加载到 Slave 中。 这只是一个第一次启动时的操作
后续操作 Master 会直接传输给 Slave 节点。 传输操作并不会阻塞写操作
配置 一主二从机制,需要先准备三台Redis 机器 一台主,两台从
# 启动 Redis-cli
redis-cli
# 查看 Redis 角色信息
info replication
# Replication
role:master # 当前 redis 角色
connected_slaves:0 # 当前 redis 连接数量
master_replid:9d6bd1e0965ba650aed518034318a11c243c2d8c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# replicaof <masterip> <masterport> 主库 ip , 主库 端口号
replicaof 192.168.1.191 6379
# masterauth <master-password> 主库 redis 密码
masterauth 584521
# replica-read-only yes 配置从主只能够读 不能写数据
replica-read-only yes
# 停止 redis 服务
./redis_init_script stop
# 删除 dump.rdb 和 aof 文件
rm -rf dump.rdb *.aof
# 启动 redis 服务
./redis_init_script start
# replicaof <masterip> <masterport> 主库 ip , 主库 端口号
replicaof 192.168.1.191 6379
# masterauth <master-password> 主库 redis 密码
masterauth 584521
# replica-read-only yes 配置从主只能够读 不能写数据
replica-read-only yes
# 停止 redis 服务
./redis_init_script stop
# 删除 dump.rdb 和 aof 文件
rm -rf dump.rdb *.aof
# 启动 redis 服务
./redis_init_script start
Disk-backed : Redis 会创建一个进程。 会写入一个文件到硬盘,然后将硬盘传输到 Redis Slave 节点上。
Diskless: Redis 会创建一个进程,会将 RDB 文件写入到 socket 连接中,不会接触到磁盘。 可以通过 socket 传输. Redis 会在 Slave 都连接上的一段时间后, 然后将 socket 传输到 多个 Slave 节点上。
全部启动成功之后,通过 info replication
命令查看各个 Redis 的角色状态。
无磁盘化复制
# 当磁盘很慢,但是网络环境又很不错。 那么就可以使用无磁盘化传输
repl-diskless-sync no
# 配置 slave 连接上多久后,才开始通过 socket 传输。
repl-diskless-sync-delay 5
配置 从 Redis Slave 第二台
配置 从 Redis , Slave 第一台
主 Redis Master
Redis 缓存过期处理和内存淘汰机制
Redis 哨兵模式
原来一主二从里面, Master 节点一旦宕机。 我们就无法写入数据了。因为主节点宕机。从节点无法写入数据。只可以读取数据。
# 开启保护模式后 绑定 ip 哪个 ip 才能够连接
# bind 127.0.0.1
# yes 开启绑定模式 ,。 no 不开启
protected-mode no
# 端口号
port 26379
# daemonize 是否开启后台
daemonize yes
# pid 文件位置。 和 redis 不是同一个进程
pidfile /var/run/redis-sentinel.pid
# 配置 sentinel 的日志文件
logfile /usr/local/redis/logs/sentinel/redis-sentinel.log
# dir sentinel 的工作空间
dir /usr/local/redis/sentinel
# sentinel monitor <master-group-name> <ip> <port> <quorum> 配置监听的 master 名称、 以及 ip 地址, 端口号。
sentinel monitor xh-master 192.168.1.191 6379 2
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
sentinel auth-pass xh-master 584521
# sentinel down-after-milliseconds <master-name> <milliseconds> master 名称。 哨兵认为master 失败的时间段
sentinel down-after-milliseconds xh-master 10000
# sentinel parallel-syncs <master-name> <numslaves> master 名称 以及同时需要同步几个 slave 节点的数据。
sentinel parallel-syncs xh-master 1
# sentinel failover-timeout <master-name> <milliseconds> master 名称。 故障转移超时时间。
sentinel failover-timeout xh-master 180000
scp ./sentinel.conf root@192.168.1.192:/usr/local/redis/
scp ./sentinel.conf root@192.168.1.193:/usr/local/redis/
# 启动时会报一个错误
redis-sentinel
# 说 Sentinel 没有指定配置文件
6031:X 08 Nov 21:12:20.727 # Sentinel started without a config file. Exiting...
# 指定配置文件启动
redis-sentinel /usr/local/redis/sentinel.conf
安装此方式启动 slave 1 和 slave 2
4-4 解决原Master恢复后不同步问题
在本节课中,相信细心的同学会发现原来的Master(191)恢复成Slave后,他的同步状态不OK,状态为 master_link_status:down ,这是为什么呢?
这是因为我们只设置了192和193的 masterauth ,这是用于同步master的数据,但是191一开始是master是不受影响的,当master转变为slave后,由于他没有
auth ,所以他不能从新的master同步数据,随之导致 info replication 的时候,同步状态为 down ,所以只需要修改 redis.conf 中的 masterauth 为 584521
一般master数据无法同步给slave的方案检查为如下:
1. 网络通信问题,要保证互相ping通,内网互通。
2. 关闭防火墙,对应的端口开发(虚拟机中建议永久关闭防火墙,云服务器的话需要保证内网互通)。
3. 统一所有的密码,不要漏了某个节点没有设置。
# 查看xh-master下的master节点信息
sentinel master xh-master
# 查看xh-master下的slaves节点信息
sentinel slaves xh-master
# 查看xh-master下的哨兵节点信息
sentinel sentinels xh-master
Redis 使用 哨兵模式整合 SpringBoot 中
spring:
redis:
database: 1
password: 584521
sentinel:
master: xh-master # 配置 master 的名称
nodes: 192.168.1.191:26379,192.168.1.192:26379,192.168.1.193:26379 # 配置 redis 哨兵的 端口号以及 ip
Redis Cluster集群
是单个master容量有限,数据达到一定程度会有瓶颈,这个时候可以通过水平扩展为多master 集群。
redis-cluster:他可以支撑多个master-slave,支持海量数据,实现高可用与高并发。 哨兵模式其实也是一种集群,他能够提高读请求的并发,但是容错方面可能会有一些问题,比如master同步数据给slave的时候,这其实是异步复制吧,这个时候 了,那么slave上的数据就没有master新,数据同步需要时间的,1-2秒的数据会丢失。master恢复并转换成slave后,新数据则丢失。
每个节点知道彼此之间的关系,也会知道自己的角色,当然他们也会知道自己存在与一个集群环境中,他们彼此之间可以交互和通信, ong。那么这些关系都会保存到某个配置文件中,每个节点都有,这个我们在搭建的时候会做配置的。
客户端要和集群建立连接的话,只需要和其中一个建立关系就行。
某个节点挂了,也是通过超过半数的节点来进行的检测,客观下线后主从切换,和我们之前在哨兵模式中提到的是一个道理。
Redis中存在很多的插槽,又可以称之为槽节点,用于存储数据,这个先不管,后面再说。
搭建 Redis-cluster 集群
# 开启 cluster 集群 yes 开启, no 关闭
cluster-enabled yes
# cluster-config-file nodes-6379.conf cluster-config-file cluster 节点配置文件
cluster-config-file nodes-6379.conf
# cluster-node-timeout 15000 配置 redis-cluster 超时时间
cluster-node-timeout 1500
# 开启 aof 持久化
appendonly yes
# 修改万配置文件后。删除 aof 和 rbd 文件 如果不删除可能就会报错
rm -rf *.aof
rm -rf *.rdb
# 停止 redis
/etc/init.d/redis_init_script stop
# 启动 redis
/etc/init.d/redis_init_script start
# 如果设置密码了记得设置密码
redis-cli -a 584521 --cluster create 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379 --cluster-replicas 1

# 上面最后会询问你是否要配置该集群了
Can I set the above configuration? (type 'yes' to accept) : yes
redis-cli -a 584521 --cluster check 192.168.1.201:6379
Redis Slots 概念
[OK] All 16384 slots covered

# 查看集群的信息
redis-cli-c -a 584521 -h 192.168.1.202 -p6379
# 查看节点的信息
cluster nodes
Redis SpringBoot 中整合 Cluster 集群
spring:
redis:
password: 584521
cluster:
nodes: 192.168.1.201:6379 192.168.1.202:6379 192.168.1.203:6379 192.168.1.204:6379 192.168.1.205:6379 192.168.1.206:6379
缓存穿透
缓存击穿
缓存雪崩
到此,关于“Redis安装配置及整合SpringBoot的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注天达云网站,小编会继续努力为大家带来更多实用的文章!