文章目录

  • 第1章 实践环境介绍和前期规划
  • 1.1 操作系统的基本环境
  • 1.2 操作系统的基本优化
  • 1.3 Redis部署前期规划
  • 1.4 Redis软件安装部署
  • 第2章 Redis 6379实例部署[基于RDB持久化]
  • 2.1 Redis 6379实例部署步骤
  • 2.2 Redis 6379实例启停脚本
  • 2.3 Redis 6379实例连接方式
  • 2.4 看看Redis 6379是啥角色
  • 2.5 RDB持久化相关知识总结
  • 2.6 RDB持久化的相关图集
  • 第3章 Redis 6380实例部署[基于AOF持久化]
  • 3.1 Redis 6380实例部署步骤
  • 3.2 Redis 6380实例启停脚本
  • 3.3 Redis 6380实例连接方式
  • 3.4 看看Redis 6380是啥角色
  • 3.5 AOF持久化相关知识总结
  • 3.6 AOF持久化相关的图集


第1章 实践环境介绍和前期规划

1.1 操作系统的基本环境

#### 系统版本
[root@node21 ~]# cat /etc/redhat-release;uname -r;uname -m;
CentOS Linux release 7.5.1804 (Core)
3.10.0-862.el7.x86_64
x86_64

#### ssh的端口
[root@node21 ~]# netstat -lntup|grep sshd
tcp        0      0 0.0.0.0:22             0.0.0.0:*          LISTEN      884/sshd            
tcp6       0      0 :::22                  :::*               LISTEN      884/sshd   

#### 内存和磁盘挂载情况
[root@node21 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        116M        3.5G        8.9M        115M        3.4G
Swap:          4.0G          0B        4.0G 
[root@node21 ~]# 
[root@node21 ~]# df -h|grep -w "data"
Filesystem               Size  Used Avail Use% Mounted on
/dev/sdb1                100G   54M  100G   1% /data           

#### 服务器网卡及其IP地址
[root@node21 ~]# ifconfig ens33|awk -F " " 'NR==2{print $2}' 
10.0.0.21
[root@node21 ~]# ifconfig ens34|awk -F " " 'NR==2{print $2}' 
172.16.1.21

1.2 操作系统的基本优化

#### 关闭selinux和firewalld防火墙
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
firewall-cmd --state

#### 调整资源描述符
# 这是修改全局下
cat >>/etc/security/limits.conf<<EOF
* soft nproc  65535
* hard nproc  65535
* soft nofile 65535
* hard nofile 65535
* soft stack  65535
* hard stack  65535
EOF

# 针对操作系统系统下用户级别
echo " * - nproc 65535" >/etc/security/limits.d/20-nproc.conf
echo "session    required    pam_limits.so" >>/etc/pam.d/login

# 退出当前连接后,重新连接
[root@node21 ~]# ulimit -n
65535

#### 内核方面的优化
chattr -i /etc/sysctl.conf
cat >>/etc/sysctl.conf<<EOF
vm.swappiness=10
net.core.somaxconn=2048
vm.overcommit_memory=1
EOF
sysctl -p

#### 禁用大内存交互
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'echo never >/sys/kernel/mm/transparent_hugepage/enabled ' >> /etc/rc.local

1.3 Redis部署前期规划

#### 软件的部署位置
/data/apps/redis          # 这是个软链接文件,指向的是/data/apps/redis-4.0.14目录

#### 6379实例的部署位置
/data/redis/6379           # 该目录下部署Redis 6379实例
  /data/redis/6379/conf    # 存放redis 6379实例的配置文件
  /data/redis/6379/data    # 存放redis 6379实例的持久化数据
  /data/redis/6379/logs    # 存放redis 6379实例的日志文件
  /data/redis/6379/run     # 存放redis 6379实例的pid和socket文件 
  /data/redis/6379/script  # 存放redis 6379实例的启停脚本

#### 6380实例的部署位置
/data/redis/6380           # 该目录下部署Redis 6380实例
  /data/redis/6380/conf    # 存放redis 6380实例的配置文件
  /data/redis/6380/data    # 存放redis 6380实例的持久化数据
  /data/redis/6380/logs    # 存放redis 6380实例的日志文件
  /data/redis/6380/run     # 存放redis 6380实例的pid和socket文件 
  /data/redis/6380/script  # 存放redis 6380实例的启停脚本

1.4 Redis软件安装部署

#### 创建redis用户(需要设置密码,需要远程登录,需要有家目录,不要让其用户和密码过期)
#### redis服务不要使用操作系统的root用户来启动,存在安全的问题;
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
useradd redis && echo "redis"|passwd --stdin redis

#### 安装相关的依赖包
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
yum -y install gcc gcc-c++ make
rpm -qa install gcc gcc-c++ make
  
#### 创建相关的目录
mkdir /data/apps
ls -ld /data/apps/
  
#### 上传软件包,进行安装
ll redis-4.0.14.tar.gz
tar xf redis-4.0.14.tar.gz 
cd redis-4.0.14
make PREFIX=/data/apps/redis-4.0.14 install
  
#### 做软链接并更改属主/组
ln -sv /data/apps/redis-4.0.14/ /data/apps/redis
chown -R redis:redis /data/apps/redis/
ls -ld /data/apps/redis/
  
#### 配置环境变量
01:vim /etc/profile.d/redis.sh文件,在里面输入以下内容并进行保存退出
    export PATH=/data/apps/redis/bin:$PATH
02:加载 /etc/profile.d/redis.sh文件,并查看相关命令
    source /etc/profile.d/redis.sh
    echo $PATH
    which redis-cli redis-server


第2章 Redis 6379实例部署[基于RDB持久化]

2.1 Redis 6379实例部署步骤

#### 创建redis 6379实例的相关目录
mkdir /data/redis/6379/{conf,data,logs,run,script} -p
tree /data/redis/6379

#### 为redis 6379实例准备配置文件
cat >>/data/redis/6379/conf/redis.conf<<EOF
## Basic parameters
bind 172.16.1.21   
protected-mode yes
port 6379
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6379/logs/redis.log
pidfile /data/redis/6379/run/redis.pid
unixsocket /data/redis/6379/run/redis.sock
dir /data/redis/6379/data/

## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60
  
## RDB Persistence
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave-error no
EOF

#### 查看配置文件以及配置文件说明
ll /data/redis/6379/conf/redis.conf

2.2 Redis 6379实例启停脚本

Redis服务的启停方式

#### 注意:
redis服务不要用root用户来启动,用普通用户来启动,在安装创建了普通用户redis

#### 启动方式
第一种:redis-server  /data/redis/6379/conf/redis.conf   # 文件中的daemonize得等于yes
第二种:redis-server /data/redis/6379/conf/redis.conf &  # 不用管daemonize是不是yes

#### 停止方式(-a表示指定redis实例的密码,shutdown表示关闭)
第一种:redis-cli -h 172.16.1.21 -p 6379 -a chenliang shutdown
第一种:redis-cli -s /data/redis/6379/run/redis.sock -a chenliang shutdown

我编写的redis启停脚本的思路

01:脚本中没有限制只能某个用户来启动,例如:root
02:但脚本的属主/组都是redis用户(可远程登录、有密码、永不过期的)
03:脚本中的启动方式:redis-server  /data/redis/6379/conf/redis.conf
04:脚本中的停止方式:redis-cli -s /data/redis/6379/run/redis.sock -a chenliang shutdown

日常我是怎么来启动redis实例的呢?

01:我编写的脚本是如何加入开机自启动的呢?
	A:在/etc/rc.local文件中添加 su - redis  PATH/脚本  start 
	B:在开机启动时,root切换到redis后(不需要密码)再执行执行 PATH/脚本 start
	C:启动起来的redis服务是用redis用户来启动的

03:平时使用这个脚本来启停redis服务?
    A:正常的情况下,就是说脑袋清醒的状态下;
       a:没处于服务器的redis用户
       b:找到相应的脚本,然后启动
       c:启动后的redis服务是用redis这个普通用户来启动的;
    B:非正常情况下,就是说手里活比较多,忙起来了
       a:没有处于服务器的redis用户下,比如在超级用户root下;
       b:找到相应的脚本,然后就直接启动了;
       c:启动后,redis服务就是用root用户来启动的了(不安全,且日志文件的属主/组也是root)
          你下一次,用redis启动时,会提示没有相应的权限写入日志文件;
       d:其实是有办法解决的,虽然有办法解决,但又存在安全问题(不可兼得)
       e:所以你记住在启动服务时,一定要在redis用户下去启动(可以交互式,也可非交互式)
#### redis 6379实例的启动脚本
01:vi /data/redis/6379/script/redisd 文件,按i键,进入编辑模式
02:复制   博客的脚本内容
03:把复制的内容粘贴至/data/redis/6379/script/redisd文件中,按esc键后,输入:wq保存退出
04:给脚本上加可执行权限:chmod 700 /data/redis/6379/script/redisd
     
#### 更改/data/redis/6379目录及目录下所有文件的属主/组为redis
chown -R redis:redis /data/redis/6379
ls -ld /data/redis/6379/
  
#### 启动redis 6379实例【我是在root用户下】
[root@node21 ~]# su - redis /data/redis/6379/script/redisd start
上一次登录:四 10月 15 18:25:42 CST 2020pts/0 上
Start redis[6379] service [  确定  ]  
[root@node21 ~]#
[root@node21 ~]# lsof -i :6379
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 4966 redis    6u  IPv4  25156      0t0  TCP node21:6379 (LISTEN)

#### 加入开机自启动
[root@node21 ~]# echo -ne "\n# Boot start redis service[6379]. USER:chenliang TIME:$(date +%F)\nsu - redis /data/redis/6379/script/redisd start\n" >>/etc/rc.local
[root@node21 ~]#
[root@node21 ~]# chmod 755 /etc/rc.d/rc.local
[root@node21 ~]#
[root@node21 ~]# tail -2 /etc/rc.local 
# Boot start redis service[6379]. USER:chenliang TIME:2020-10-15
su - redis /data/redis/6379/script/redisd start

2.3 Redis 6379实例连接方式

#### 用监听的IP和端口连接(连接时指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -h 172.16.1.21 -p 6379 -a chenliang
172.16.1.21:6379> 
172.16.1.21:6379> exists key1           # 判断key1是否存在,0表示不存在
(integer) 0 
172.16.1.21:6379>


#### 用监听的IP和端口连接(连接时不指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -h 172.16.1.21 -p 6379
172.16.1.21:6379> 
172.16.1.21:6379> exists key1           # 判断key1是否存在,提示需要进行认证
(error) NOAUTH Authentication required.
172.16.1.21:6379> 
172.16.1.21:6379> auth chenliang        # 进行密码认证
OK
172.16.1.21:6379> 
172.16.1.21:6379> exists key1           # 判断key1是否存在,0表示不存在
(integer) 0


#### 用socket进行连接(连接时指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -s /data/redis/6379/run/redis.sock -a chenliang
Warning: Using a password with '-a' option on the command line interface may not be safe.
redis /data/redis/6379/run/redis.sock> 
redis /data/redis/6379/run/redis.sock> exists key1
(integer) 0

2.4 看看Redis 6379是啥角色

Redis任何一个单实例,它的角色默认是master。

172.16.1.21:6379> info replication
# Replication
role:master              # 角色:master
connected_slaves:0       # 连接slave个数:0
master_replid:414c8302c9996957b1f70921c72e7d2e1dde3a33
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

2.5 RDB持久化相关知识总结

01:RDB持久化默认是没有开启的(即你的配置文件中没有RDB的相关参数,启动后你用config get
   save是空的,这就表示是没有开RDB持久化)。那么是不会进行自动进行RDB持久化的,且在关闭
   Redis服务时也不会进行最终的RDB持久化。

02:RDB持久化是可以在线进行开启的(开启后,会根据设置的条件进行自动RDB持久化,在关闭Redis
   时也会进行最终的RDB持久化)。
   A:在线开启RDB持久化
      a:config set save "900 1"     # 设置1条规则,配置文件中加上save 900 1
      b:config set save "60 2 30 2" # 设置2条规则,配置文件加上save 60 2 换行 save 30 2 
   B:在线修改RDB持久化条件
      a:config get save             # 查看其是否开启,如果是开启(假如结果是60 2 30 2)
      b:config set save "20 2"      # 这是将两条规则修改成了一条规则了
   C:在线关闭RDB持久化
      config set save ""             # 即表示关闭RDB持久化,不会自动RDB持久化了
      
03:当开启了RDB持久化后,会根据条件(假如条件是:20 1),即在20秒内有1个key被改变,就进行
   RDB持久化。在持久化时是使用bgsave命令for出后台线程来完成RDB持久化,这样不会影响
   redis仅有的一个主进程继续响应客户端的操作。

04:RDB持久化是可以手动触发的,即使用bgsave和save命令;这也是有些人说RDB默认是开启的。
   A:不用管RDB是否开启(以在线的结果为准,不管save参数是否有值)
   B:bgsave命令for出后台线程完成RDB持久化,不阻塞Redis的主进程继续响应客户端;
   C:save命令就是使用redis的主进程来完成RDB持久化的数据;

05:RDB持久化的数据体现是dump.rdb文件(这是由dbfilename参数决定的,默认值就是它),该文件
   是不可直接查看和编辑的,持久化时是先生成一个dump.rdb.tmp文件,然后再替换dump.rdb文件。 

06:RDB持久化的数据(dump.rdb文件)要比实际数据要小,因为它是打快照,且会进行压缩,

07:RDB持久化时是后台的子进程来工作,若在持久化数据过程中,出现了错误(例如磁盘满了或损坏
   了),Redis的主进程是否还接受客户端的操作呢?这个其实是redis服务的另一个参数来让其决
   定,该参数是stop-writes-on-bgsave-error,默认是yes,也就是redis主进程不响应客户端的写
   操作;建设设置成no,则表示继续响应客户端的读写操作;
    
08:redis服务在启动时是根据什么来找RDB持久化的呢?答案是:只要在启动时,redis的配置文件中
   有开启AOF(即appendonly yes)持久化,那么都只会找AOF持久化数据进行加载,不会找RDB持久化
   数据。换句话说:启动时redis配置文件中没开AOF(没有appendonly参数,或者appendonly no)
   持久化,不管有没有RDB相关参数(save),都只会找RDB持久化的数据。

09:当在大数据集的时候,RDB持久化的数据在加载或恢复时要比AOF持久化的要快;但在RDB和AOF
   同时开启的情况下,加载数据只会加载AOF的持久化数据
 
10:RDB持久化不能做到实时或秒级的数据持久,因此对数据有实时持久化的需求下,RDB持久化就不太适合了;

2.6 RDB持久化的相关图集

redis多实例对应多租户 redis多实例部署_redis多实例对应多租户


redis多实例对应多租户 redis多实例部署_redis_02


redis多实例对应多租户 redis多实例部署_redis多实例对应多租户_03


redis多实例对应多租户 redis多实例部署_持久化_04


redis多实例对应多租户 redis多实例部署_redis_05


第3章 Redis 6380实例部署[基于AOF持久化]

3.1 Redis 6380实例部署步骤

#### 创建redis 6380实例的相关目录
mkdir /data/redis/6380/{conf,data,logs,run,script} -p
tree /data/redis/6380

#### 为redis 6380实例准备配置文件
cat >>/data/redis/6380/conf/redis.conf<<EOF
## Basic parameters
bind 172.16.1.21
protected-mode yes
port 6380
maxmemory 1GB
requirepass chenliang
daemonize yes
databases 16
syslog-enabled no
loglevel notice
logfile /data/redis/6380/logs/redis.log
pidfile /data/redis/6380/run/redis.pid
unixsocket /data/redis/6380/run/redis.sock
dir /data/redis/6380/data/
   
## Client
maxclients  10000
timeout 300
tcp-backlog 511
tcp-keepalive 60

## AOF Persistence
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
EOF

#### 查看配置文件
ll /data/redis/6380/conf/redis.conf

3.2 Redis 6380实例启停脚本

Redis服务的启停方式

##### 注意:
redis服务不要用root用户来启动,用普通用户来启动,在安装创建了普通用户redis

#### 启动方式
第一种:redis-server  /data/redis/6380/conf/redis.conf   # 文件中的daemonize得等于yes
第二种:redis-server /data/redis/6380/conf/redis.conf &  # 不用管daemonize是不是yes

#### 停止方式(-a表示指定redis实例的密码,shutdown表示关闭)
第一种:redis-cli -h 172.16.1.21 -p 6380 -a chenliang shutdown
第一种:redis-cli -s /data/redis/6380/run/redis.sock -a chenliang shutdown

我编写的redis启停脚本的思路

01:脚本中没有限制只能某个用户来启动,例如:root
02:但脚本的属主/组都是redis用户(可远程登录、有密码、永不过期的)
03:脚本中的启动方式:redis-server  /data/redis/6380/conf/redis.conf
04:脚本中的停止方式:redis-cli -s /data/redis/6380/run/redis.sock -a chenliang shutdown

日常我是怎么来启动redis实例的呢?

01:我编写的脚本是如何加入开机自启动的呢?
A:在/etc/rc.local文件中添加 su - redis  PATH/脚本  start 
B:在开机启动时,root切换到redis后(不需要密码)再执行执行 PATH/脚本 start
C:启动起来的redis服务是用redis用户来启动的

03:平时使用这个脚本来启停redis服务?
    A:正常的情况下,就是说脑袋清醒的状态下;
       a:没处于服务器的redis用户
       b:找到相应的脚本,然后启动
       c:启动后的redis服务是用redis这个普通用户来启动的;
    B:非正常情况下,就是说手里活比较多,忙起来了
       a:没有处于服务器的redis用户下,比如在超级用户root下;
       b:找到相应的脚本,然后就直接启动了;
       c:启动后,redis服务就是用root用户来启动的了(不安全,且日志文件的属主/组也是root)
          你下一次,用redis启动时,会提示没有相应的权限写入日志文件;
       d:其实是有办法解决的,虽然有办法解决,但又存在安全问题(不可兼得)
       e:所以你记住在启动服务时,一定要在redis用户下去启动(可以交互式,也可非交互式)
#### redis 6380实例的启动脚本
01:vi /data/redis/6380/script/redisd 文件,按i键,进入编辑模式
02:复制   博客的脚本内容
03:把复制的内容粘贴至/data/redis/6380/script/redisd文件中,按esc键后,输入:wq保存退出
04:执行sed -i 's#6379#6380#g' /data/redis/6380/script/redisd 命令进行替换内容;
05:给脚本上加可执行权限:chmod 700 /data/redis/6380/script/redisd
     
#### 更改/data/redis/6380目录及目录下所有文件的属主/组为redis
chown -R redis:redis /data/redis/6380
ls -ld /data/redis/6380/
  
#### 启动redis 6380实例【我是在root用户下】
[root@node21 ~]# su - redis /data/redis/6380/script/redisd start
上一次登录:四 10月 15 18:25:42 CST 2020pts/0 上
Start redis[6379] service [  确定  ]  
[root@node21 ~]#
[root@node21 ~]# lsof -i :6380
COMMAND    PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 5094 redis    6u  IPv4  25156      0t0  TCP node21:6380 (LISTEN)
  
#### 加入开机自启动
[root@node21 ~]# echo -ne "\n# Boot start redis service[6380]. USER:chenliang TIME:$(date +%F)\nsu - redis /data/redis/6380/script/redisd start\n" >>/etc/rc.local
[root@node21 ~]#
[root@node21 ~]# chmod 755 /etc/rc.d/rc.local
[root@node21 ~]#
[root@node21 ~]# tail -2 /etc/rc.local 
# Boot start redis service[6380]. USER:chenliang TIME:2020-10-15
su - redis /data/redis/6380/script/redisd start

3.3 Redis 6380实例连接方式

#### 用监听的IP和端口连接(连接时指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -h 172.16.1.21 -p 6380 -a chenliang
172.16.1.21:6380> 
172.16.1.21:6380> exists key1         # 判断key1是否存在,0表示不存在
(integer) 0 
172.16.1.21:6380>

#### 用监听的IP和端口连接(连接时不指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -h 172.16.1.21 -p 6380
172.16.1.21:6380> 
172.16.1.21:6380> exists key1           # 判断key1是否存在,提示需要进行认证
(error) NOAUTH Authentication required.
172.16.1.21:6380> 
172.16.1.21:6380> auth chenliang        # 进行密码认证
OK
172.16.1.21:6380> 
172.16.1.21:6380> exists key1           # 判断key1是否存在,0表示不存在
(integer) 0

#### 用socket进行连接(连接时指定密码,我配置文件中事先设置好的)
[root@node21 ~]# redis-cli -s /data/redis/6380/run/redis.sock -a chenliang
Warning: Using a password with '-a' option on the command line interface may not be safe.
redis /data/redis/6380/run/redis.sock> 
redis /data/redis/6380/run/redis.sock> exists key1
(integer) 0

3.4 看看Redis 6380是啥角色

Redis任何一个单实例,它的角色默认是master。

172.16.1.21:6380> info replication
172.16.1.21:6380> info replication
# Replication
role:master                                               # 角色:master
connected_slaves:0                                        # 连接的slave:0个
master_replid:2623b1d6538a3d2f1aee5ae8f7db8c970278c4b1    # 复制ID:随便生成的
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

3.5 AOF持久化相关知识总结

01:AOF持久化默认是关闭了的,即配置文件中没有appendonly yes,在线用config get appendonly 
   查看的结果为no,那么不会进行自动AOF持久化,在关闭Redis服务时也是不会进行AOF的最终持久

02:AOF持久化是可以在线开启的,即使用config set appendonly "yes",这样就会进行自动AOF持久
   化,在关闭Redis服务时,也会进行AOF的最终持久化;

03:只要开启AOF持久化,即AOF自动持久化的条件是everysec策略(由appendfsync参数决定)
   everysec   # fsync每秒只进行一次。妥协。
   always     # fsync在每次写入append only日志后执行。缓慢的,安全的。
   no         # 不要fsync,让操作系统在需要的时候刷新数据。得更快。

04:AOF持久化的数据到磁盘体现是appendonly.aof文件,是由appendfilename参数决定的,默认就是
   它。当redis产生数据时,会把命令追加到appendonly.aof文件尾部,这人文件是可以直接查看和
   编辑的,这个文件始终只有一个,随着着数据的增加,该文件的大小也会增加。 
 
05:那么如何解决AOF持久化文件过大,redis为AOF持久化提供了重写功能(手动或自动),示例说明;    
    # 通过举例理解什么是AOF的重写
    A:你添加一个key(set key01 "chenliang"),此时这条命令被追加到持久化文件尾部;
    B:往key01中追加数据(append key01 "lili"),此时这条命令被追加到持久化文件尾部;
    C:Redis服务中key01的数据为chenlianglili,AOF持久化文件中保留了两条命令;
    D:此时你手动执行bgrewriteaof命令,让其后台进行重写,重写后的AOF文件中对于key01
       的数据就只有一条命令了(set key01 "chenlianglili");
      
    # Redis何时自动触发第一次AOF的重写呢?
    当AOF的文件达到参数auto-aof-rewrite-min-size设置的大小时,默认是64mb。
    自动在for出一个后台子进程来完成重写的工作,此时会占用额外的内存哈;
      
    # Redis何时会自动触发第二次AOF的重写呢?
    A:当AOF文件达到64mb(假如auto-aof-rewrite-min-size设置的就是64mb哈)时
       AOF自动触发重写,重写完成后,AOF的持久化文件为60mb;
    B:那么Redis第二次自动触发的就得根据auto-aof-rewrite-percentage设置的
       值(百分比)来决定。假如是100,就得等AOF文件达到120mb时再自动触发重写;
    C:以此类推哈;

    # 有些误操作会把AOF文件内容全部清除(不是说直接清空AOF持久化文件哈)
    A:在线执行了flushall命令,redis内存中的数据全部没有了(所有库下的数据)
    B:如果你开了AOF持久化,AOF文件中还有,但前面执行的flushall命令在AOF文件尾部;
    C:如果你又执行了bgrewriteaof命令,这时会进行重写,因内存中没有数据了,AOF文件也空了;

06:Redis在启动时是根据什么去找AOF持久化文件的,这个得看redis的配置文件中是否开了AOF,
    如果开了AOF,那么只会找AOF持久化的数据进行加载,不会找RDB持久化的数据,反之。

07:redis在恢复或加载AOF持久化的数据时,遇到可能存在问题的指令时,是否继续;其实是由
    aof-load-truncated参数决定的,默认值是yes,表示发现现错误时继续执行后面的数据

3.6 AOF持久化相关的图集

redis多实例对应多租户 redis多实例部署_redis_06


redis多实例对应多租户 redis多实例部署_redis_02


redis多实例对应多租户 redis多实例部署_redis多实例对应多租户_08


redis多实例对应多租户 redis多实例部署_redis多实例对应多租户_09