# Redis
**Repository Path**: xiaoxinbupa/redis
## Basic Information
- **Project Name**: Redis
- **Description**: Redis数据库最核心的就是key-value,是用来实现高速的读写操作
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-08-19
- **Last Updated**: 2024-08-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Redis, 学习笔记
## README
# Redis
#### 介绍
Redis数据库最核心的就是key-value,是用来实现高速的读写操作
## redis数据库
### Redis -Remote Dictionary Server (远程字典服务器)
- 是一款高性能的(key/values)分布式内存数据库
- 支持数据持久化(定期把内存里的数据储存到磁盘)
- 支持多种数据类型:字符、列表、散列、集合
- 支持master-server 模式数据备份
- 中文网站www.redis.cn
**Redisr特点**:
1. 高性能,数据储存在内存中,读写速度块
2. 持久化, RDB快照、AOF日志两种方式
3. 支持多种数据库类型
4. 支持分布式部署
丰富的功能: 支持事物、发布订阅、Lua脚本、管道等功能

### redis服务器的搭建
redis开源软件(选者对应的软件版本)
直接使用yum源安装 并自启动 sytemctl enabled redis --now
端口号为 6379
redis-cli 访问本机的redis
1. 修改配置文件
```bash
[root@redis64 ~]# vim /etc/redis.conf
69 bind 192.168.88.64 IP地址
92 port 6364 端口号
647 requirepass tarenaplj 密码
:wq
```
2. 禁用selinux
```bash
[root@redis64 ~]# setenforce 0
```
3. 重启服务
```bash
[root@redis64 ~]# systemctl start redis
```
4. 查看端口(默认6379,自定义修改为了6364)
```bash
[root@redis64 ~]# netstat -utnlp | grep redis-server
tcp 0 0 192.168.88.64:6364 0.0.0.0:* LISTEN 2009/redis-server 1
[root@redis64 ~]#
```
5. 连接服务
redis-cli -h redis_serverIp -p 端口号 -a 密码
```
[root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 –a tarenaplj
```
或者进入redis后输入密码
```bash
[root@redis64 ~]# redis-cli -h 192.168.88.64 -p 6364 连接服务
192.168.88.64:6364> ping 不输入密码无法正常访问
(error) NOAUTH Authentication required.
192.168.88.64:6364> auth tarenaplj 输入密码
OK
```
### redis常用命令
mset 、mget、 keys、 type
exists 、ttl、 expire 、move 、select
del、 flushdb 、flushall
1. mset 一起存储多个变量
```bash
192.168.88.64:6364> mset name plj age 80 class nsd2403
OK
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
```
2. mget一起查看多个变量值
```bash
192.168.88.64:6364> mget name age
1) "plj"
2) "80"
```
3. keys 使用统配符查看变量
\* 匹配所有变量名
? 一个字符
```bash
192.168.88.64:6364> keys * 查看所有变量名
1) "age"
2) "classs"
3) "name"
4) "school"
192.168.88.64:6364> keys ??? 变量名3个字符
1) "age"
192.168.88.64:6364> keys a* 变量名a 开头的
1) "age"
192.168.88.64:6364>
192.168.88.64:6364> keys gender 查看指定变量是否存在
(empty list or set) 说明变量没不存在
192.168.88.64:6364> keys name 存在
1) "name"
192.168.88.64:6364>
```
4. select 切换库 ,默认库编号 0-15
```bash
192.168.88.64:6364> select 1 切换到 1号库里
OK
192.168.88.64:6364[1]> keys * 查看数据没有数据
(empty list or set)
192.168.88.64:6364[1]>
192.168.88.64:6364[1]> select 0 切回0号库
OK
192.168.88.64:6364> select 16 超出范围报错
(error) ERR DB index is out of range
```
5. move 命令 移动变量到其他库
```bash
查看变量
192.168.88.64:6364> keys *
1) "age"
2) "classs"
3) "name"
4) "school"
把age 变量移动到1 号库里
192.168.88.64:6364> move age 1
(integer) 1
切换到1号库
192.168.88.64:6364> select 1
OK
查看变量
192.168.88.64:6364[1]> keys *
1) "age"
```
6. exists 检查变量是否存储 返回值1 变量存储 返回值是0 变量不存在
```bash
切换到0号库
192.168.88.64:6364[1]> select 0
OK
检查name变量是否存在
192.168.88.64:6364> exists name
(integer) 1
192.168.88.64:6364> exists swy
(integer) 0
```
7. EXPIRE 命令设置变量的过期时间 不设置变量永不过期
ttl 检查变量可以在内存里存多久
```bash
存储变量
192.168.88.64:6364> set sex girl
OK
```
```bash
查看过期时间
192.168.88.64:6364> ttl sex
(integer) -1 表示永不过期
```
```bash
设置过期时间15 秒
192.168.88.64:6364> expire sex 15
(integer) 1
```
```bash
没到过期时间可以查看到变量
192.168.88.64:6364> keys sex
1) "sex"
```
```bash
查看剩余时间
192.168.88.64:6364> ttl sex
(integer) 8 还剩下8秒时间过期
```
```bash
192.168.88.64:6364> ttl sex
(integer) -2 表示已经过期被删除
```
```bash
过期后查看不到变量了
192.168.88.64:6364> keys sex
(empty list or set)
192.168.88.64:6364>
```
8. type 命令检查变量存储数据的类型
```bash
192.168.88.64:6364> set x 99
OK
192.168.88.64:6364> mset y 108
OK
192.168.88.64:6364> type x
string
192.168.88.64:6364> type y
String
```
```bash
定义类别类型的变量tea
192.168.88.64:6364> lpush tea nb wk zzg plj lx
```
```bash
查看数据类型
192.168.88.64:6364> type tea
list
```
9. del 删除内存里的变量
```bash
192.168.88.64:6364> keys * 删除前查看
1) "y"
2) "tea"
3) "name"
4) "school"
5) "x"
6) "classs"
```
```bash
192.168.88.64:6364> del tea y school 一起删除3个变量
(integer) 3
192.168.88.64:6364> keys * 删除后查看
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364>
```
10. flushdb 删除当前所在库的所有数据
```bash
192.168.88.64:6364> keys *
1) "name"
2) "x"
3) "classs"
192.168.88.64:6364> flushdb
OK
192.168.88.64:6364> keys *
(empty list or set)
192.168.88.64:6364> SELECT 1
OK
192.168.88.64:6364[1]> keys *
1) "age"
```
11. Flushall 清空内存
```bash
192.168.88.64:6364[1]> flushall 删除内存里的所有内存里所有数据 (慎用)
```
### redis数据类型
redis支持5种主要的数据类型
1. 字符串类型 String
储存任何类型的字符串,包括二进制文件,最大长度为512M
常用命令
1. `set key value [ex seconds] [px milliseconds] [nx|xx]` 设置key以值,过期时间:秒/毫秒
2. `setrange key offset value` 从偏移量开始复写key的特定为的值
3. `strlen key` 统计字符串长度
4. `append key value` 存在则追加,不存在则创建key及value,返回key长度
5. `get key`
1. 返回key存储的字符串值,若key不存在则返回null;
2. 若key的值不是字符串,则返回错误,get只能处理字串
6. `decr key` 将key中的值减一,key不存在则先初始化为0,再减1
7. `decrby key decrement` --将key中的值,减去decrement
8. `getrange key start end`
1. 返回字符串值中的子串,截取范围为start和end
2. 负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符...
9. `incr key` 将key中的值加一,key不存在则先初始化为0,再加1
10. `incrby key increment` --将key中的值,加上increment
11. incrbyfloat key increment 为key中所储存的值加上浮点数增量increment
12. mget key [key...] 获取一个或多个key的值,空格分隔,具有原子性
13. mset key value [key value ...] 设置多个key及值,空格分隔,具有原子性
2. 散列类型Hash
3. 列表类型 List
4. 无序集合类型 Set
5. 有序集合类型 Zset
### 创建redis集群与nginx服务
#### **1. 环境准备**
n台主机(n>3)、做集群的主机,不允许存储数据、不允许设置连接密码
n台集群安装 redis并修改redis的配置参数、起服务
```bash
]# vim /etc/redis.conf
92 port 6379
69 bind 'ipaddress' //填本机的ip
838 cluster-enabled yes //启用集群功能
846 cluster-config-file nodes-6379.conf //存储集群信息文件
852 cluster-node-timeout 5000 //集群中主机通信超时时间
:wq
]# systemctl start redis
]# netstat -utnlp | grep redis-serve
```
#### **2. 创建集群**
1. 在任意一台redis服务器上都可以执行创建集群的命令。
2. `--cluster-replicas 1 `给每个master服务器分配1台slave服务器,每个主至少要分配1台slave服务器,不然无法实现redis服务的高可用。
3. 创建集群时,会自动创建主从角色,默认把主机列表中的前3台服务器创建为Master角色的redis服务器,剩下的均配置为slave角色服务器。
4. 创建集群时,会自动给master角色的主机分配hash槽 ,通过hash槽实现数据的分布式存储。
```bash
]# redis-cli --cluster create 集群ip --cluster-replicas 1
```
#### **3. 查看集群信息**
1. 查看统计信息
```bash
]# redis-cli --cluster info 集群中任意ip:6379
```
2. 查看统计信息
```bash
]# redis-cli --cluster check 集群中任意ip:6379
```
3. 在一个客户端中查看集群信息
redis-cli -c -h集群中任意ip -p 6379
cluter info 显示集群信息
案例
```bash
]# redis-cli --cluster info 192.168.88.51:6379
192.168.88.53:6379 (f2c1bdb7...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.51:6379 (0eb3b7aa...) -> 0 keys | 5461 slots | 1 slaves.
192.168.88.52:6379 (a9cb8ccd...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
```
第一列:主服务器ip地址
第二列:主服务器ID
第三列:存储变量个数
第四列:hash槽个数 (hash槽的作用在集群存储工程过程里讲)
第五列:从服务器数量
#### **4. 实现数据的自动备份**
集群中slave角色的主机会自动同步master角色主机的数据
#### **5. 实现redis服务的高可用**
当master角色的服务器宕机时,对应的slave服务器会升级为master 并接手对应的hash槽,实现redis服务的高可用
#### **6. 实现数据的分布式储存**
根据集群算法`CRC16算法`的计算结果储存数据
#### **7. 网站连接redis集群**
1. **配置nginx服务**
```bash
安装依赖
]#yum -y install gcc pcre-devel zlib-devel make
解压源码
]# cd /root
]# tar -xf nginx-1.22.1.tar.gz
进源码目录
]#cd nginx-1.22.1
配置
]#./configure
编译 并 安装
]#make && make install
查看安装目录
]# ls /usr/local/nginx/
conf html logs sbin
启动服务
]# /usr/local/nginx/sbin/nginx
查看端口
]# netstat -utnlp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 10469/nginx: master
```
开启接受php服务:vim +69 /usr/local/nginx/conf/nginx.conf

2. **配置php-fpm服务**
```bash
]#yum -y install php php-fpm php-devel 安装php相关软件
修改php-fpm服务配置文件
]# vim /etc/php-fpm.d/www.conf
38 ;listen = /run/php-fpm/www.sock
39 listen = 127.0.0.1:9000 非sock方式运行
:wq
启动服务
]# systemctl start php-fpm
查看端口
]# netstat -utnlp | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 10477/php-fpm: mast
```
3. **nginx服务上加载redis模块,使其可以连接到redis服务器**
1. 列出所有模块 : `php -m `
2. 过滤redis模块: `php -m | grep -i redis`
3. 如果没有redis模块,安装提供模块的软件,然后加载模块
`phpize` 查看php的版本信息
```bash
解压源码
]# tar -xf redis-cluster-4.3.0.tgz
进源码目录
]# cd redis-4.3.0/
获取php版本信息
]# phpize
Configuring for:
PHP Api Version: 20170718
Zend Module Api No: 20170718
Zend Extension Api No: 320170718
```
```bash
配置 (--with-php-config=/usr/bin/php-config php配置信息文件)
[root@redis64 redis-4.3.0]# ./configure --with-php-config=/usr/bin/php-config
```
编译并安装
```bash
]# make && make install
……………
Installing shared extensions: /usr/lib64/php/modules/ 提示模块安装的位置
```
查看模块文件
```bash
]# vim /etc/php.ini
737 extension_dir = "/usr/lib64/php/modules/" 指定模块所在目录
739 extension = "redis.so" 指定模块名
:wq
```
重启php-fpm服务
```bash
]# systemctl restart php-fpm
```
4. 再次过滤redis模块
查看模块
```bash
]# php -m | grep redis
redis
```
4. **编写存储数据脚本**
```bash
[root@nginx57 ~]# vim /usr/local/nginx/html/set.php
set("i","tarenaA ");
$client->set("j","tarenaB ");
$client->set("k","tarenaC ");
echo "save ok\n";
?>
:wq
```
5. **编写查看数据脚本**
```bash
[root@nginx57 ~]# vim /usr/local/nginx/html/get.php
get("i"); //获取变量i 的数据
echo $client->get("j"); //获取变量j 的数据
echo $client->get("k"); //获取变量k 的数据
?>
:wq
```
6. **访问脚本**
```bash
访问存储数据脚本
]# curl http://nginx-ip/get.php
Save ok
访问查询数据脚本
]# curl http://nginx-ip/get.php
tarenaA tarenaB tarenaC
```
7. **命令行连接redis集群主机查看数据**
```bash
redis-cli -c -h 集群ip1 -p 6379
> keys *
```
### Redis主从同步与哨兵服务
实现数据自动备份的服务架构i,分为主从2种角色。
将一个主节点的数据同步复制到另一个或多个从节点上,实现数据的备份和读写分离。
redis主从复制的优势在于可以提高redis服务的可用性和可靠性,并且具有良好的扩展性,支持多种复制结构。

工作原理:

有关命令:

#### 1. 配置一主一从
1. **master主服务器**
修改配置文件
```bash
]# vim /etc/redis.conf
69 bind masterServerIp 设置服务使用的Ip地址
92 port 6379 使用默认端口即可
:wq
]# systemctl restart redis 重启服务
```
连接服务
```
]# redis-cli -h masterServerIp -p 6379
```
查看角色
```bash
masterServerIp:6379> info replication
# Replication
role:master 默认就是主服务器
connected_slaves:0 没有从服务器
master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
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
masterServerIp:6379>
```
2. **slave从服务器**
修改配置文件
```bash
]# vim /etc/redis.conf
69 bind slaveServerIp 设置服务的ip地址
92 port 6379 设置服务的端口号 (默认即可)
:wq
```
重启服务
```bash
~]# systemctl restart redis
```
连接服务
```bash
]# redis-cli -h slaveServerIp -p 6379
```
指定主服务器ip地址 和 端口号
```bash
slaveServerIp:6379> replicaof masterServerIp 6379
```
永久保存配置
```bash
slaveServerIp:6379> config rewrite
OK
退出服务
slaveServerIp:6379> exit
```
查看文件末尾(验证)
```bash
]# tail -1 /etc/redis.conf
replicaof slaveServerIp 6379
```
连接服务、查看角色(验证)
```bash
]# redis-cli -h slaveServerIp -p 6379
slaveServerIp:6379> info replication
# Replication
role:slave 从服务器
master_host: masterServerIp 主服务器ip地址
master_port:6379 主服务器端口号
master_link_status:up 与主服务器连接状态 (up 正常 down 连接失败)
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
```
3. 在master主服务器查看角色(验证)
```bash
连接服务
]# redis-cli -h masterServerIp -p 6379
查看角色
masterServerIp:6379> info replication
# Replication
role:master 主服务器
connected_slaves:1 一个从服务器
slave0:ip=slaveServerIp,port=6379,state=online,offset=322,lag=0 从服务器IP地址
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:322
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:322
```
#### 2. 配置一主多从
master服务器与slaves服务器都要安装redis数据库,并修改配置文件绑定自身ip
master服务器同上一主一从操作
多台从服务器只要可以ping通,在redis服务中指定主服务器ip和端口就可以,同上一主一从的操作
```bash
]# redis-cli -h slaveServerIp -p 6379
```
```bash
slaveServerIp:6379> replicaof masterServerIp 6379
```
```bash
slaveServerIp:6379> config rewrite
```
注:取消slave从服务器的身份
`slaveServerIp:6379> replicaof no one` 恢复为独立的数据库服务器
`slaveServerIp:6379> config rewrite` 保存配置
#### 3. 配置主从从结构
`master` <---同步--- `slave_1` <---同步--- `slave_2`
slave_1 指定 master服务器为主服务器 `slave_1Ip:6379> replicaof masterIp 6379 `
slave_2 指定 slave_2服务器为主服务器 `slave_2Ip:6379> replicaof slave_1Ip 6379 `
#### 4. 配置带验证的主从复制
master主服务器的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据
相关命令:

主服务器设置密码
```bash
查看密码,默认redis服务没有密码
slaveServerIp:6379> config get requirepass
1) "requirepass"
2) ""
```
```bash
设置密码
masterServerIp:6379> config set requirepass 123456
OK
输入密码
masterServerIp:6379> auth 123456
OK
保存配置
masterServerIp:6379> config rewrite
OK
退出
masterServerIp:6379> exit
保存到文件的末尾
]# tail -1 /etc/redis.conf
requirepass "123456"
```
```bash
连接master主服务
]# redis-cli -h masterServerIp -p 6379 -a 123456
查看复制信息
masterServerIp:6379> info replication
# Replication
role:master
connected_slaves:0 没有从服务器了 (因为从没有输入连接密码连接不上主服务器)
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5763
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5763
```
从服务器配置连接主服务器的密码
```bash
连接服务
~]# redis-cli -h slaveServerIp -p 6379
查看复制信息
slaveServerIp:6379> info replication
# Replication
role:slave
master_host: masterServerIp
master_port:6379
master_link_status:down 没设置密码 与master主机是断开状态
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:274
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:7803
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:7803
```
```bash
slaveServerIp:6379> config set masterauth 123456 指定主服务器密码
OK
slaveServerIp:6379> config rewrite 保存配置
OK
slaveServerIp:6379> info replication 查看复制信息
# Replication
role:slave
master_host: masterServerIp
master_port:6379
master_link_status:up 设置连接密码后 状态为up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:5847
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5847
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5764
repl_backlog_histlen:84
```
#### 5. 哨兵服务
说明:
1)可以使用一主一从 或 一主多从 或 主从从 + 哨兵服务 ==做服务的高可用 和 数据自动备份==
2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。
主从正常配置
哨兵服务器配置
```bash
]# vim /etc/redis-sentinel.conf 创建并编辑主配置文件
15 bind sentinel_Ip 指定哨兵服务使用ip地址
21 port 26379 指定哨兵服务监听端口
26 daemonize yes 服务守护进程方式运行服务
84 sentinel monitor masterName masterServerIp 6379 1 监视master服务器Host67
:wq
]# systemctl start redis-sentinel 启动哨兵服务
]# netstat -utnlp | grep 26379 查看端口号
tcp 0 0 192.168.88.69:26379 0.0.0.0:* LISTEN 1651/redis-sentinel
```
停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。
sentinel monitor masterName masterServerIp 6379 1
1:这是法定人数(quorum)的值,表示在 Sentinel 集群中,有多少个 Sentinel 节点同意某个 Redis 实例主观下线(subjectively down)之后,该实例才会被判定为客观下线(objectively down)。换句话说,只有当至少有1个(在这个例子中)Sentinel 节点认为主服务器不可用时,主服务器才会被标记为不可用,并触发故障转移过程。
masterName是本人在Sentinel配置中用来引用这个Redis实例的,它对于Sentinel集群内的所有节点都应该是唯一的。
### redis持久化(RDB、AOF)
#### RDB持久化
**RDB---redis数据库文件,全称RedisDataBase**
数据持久化方式之一、数据持久化默认方式
按照指定的时间间隔,将内存中的数据集快照写入磁盘
**定义RDB文件名**
```bash
]# vim /etc/redis.conf
dbfilename "dump.rdb" //文件名
```
**使用RDB文件恢复数据**
- 备份数据 -备份dump.rdb文件到其他位置
第1步 停止内存没有数据的redis服务
第2步 使用有数据的dump.rdb文件覆盖没有数据dump.rdb文件
第3步 修改文件的所有者和所属组用户为redis
第4步 启动redis服务 并连接服务查看数据
```bash
]# cp /var/lib/redis/dump.rdb /备份目录/dump.rdb
```
- 恢复数据 -拷贝备份文件到数据库目录,启动redis服务
第1步 停止内存没有数据的redis服务
第2步 使用有数据的dump.rdb文件覆盖没有数据dump.rdb文件
第3步 修改文件的所有者和所属组用户为redis
第4步 启动redis服务 并连接服务查看数据
```bash
]# cp 备份目录/dump.rdb /var/lib/redis/
```
**存盘频率**
- 数据从内存保存到硬盘的频率
```bash
[root@redis70 ~]# vim +219 /etc/redis.conf
save 900 1 # 15分钟内且有>=1个变量改变 即存盘
#save 300 10
save 120 10 # 2分钟内且有>=10个变量改变
save 60 10000 # 1分钟内且有>=10000个变量改变 即存盘
:wq
```
清空数据库目录 ` ]# rm -rf /var/lib/redis/*`
启动服务( 按新的存盘频率运行)`]# systemctl start redis `
- 手动存盘
`save` --阻塞写存盘 、`bgsave` --不阻塞写存盘
**SAVE命令**:当执行SAVE命令时,Redis会阻塞当前服务器进程,直到RDB文件创建完成为止
**BGSAVE命令**:与SAVE命令不同,BGSAVE命令会创建一个子进程来负责RDB文件的创建工作,而父进程(即Redis主进程)则继续处理客户端请求。
**RDB优点和缺点**
**优点**: 将数据保存到硬盘上,保证数据的可靠性;
适用于数据量大又需要快速备份和恢复数据的场景(RDB方式的二进制文件包含redis数据集合的全部信息);
后台异步执行,不阻塞redis的正常服务,提高可用性和性能
**缺点**: 占用一定的系统资源,影响性能;
数据整体化、高频备份,数据容易丢失
#### AOF持久化
AOF--Append Only File
是日志文件,追加方式记录所有写操作命令,然后再执行到内存中,默认没有启用
**启用AOF**
```
>config get appendonly //查看
>config set appendonly yes //启用
>config rewirte //保存到配置文件
```
数据库目录多了appendonly.aof文件
**使用AOF文件恢复数据**
- 备份数据 --备份appendonly.aof 文件到其他位置
```bash
]# cp /var/lib/redis/appendonly.aof /备份目录/ 拷贝到备份目录
]# redis-cli -h redisServerIp -p 6379 连接服务
> flushall 清空内存
> exit 断开连接
```
- 恢复数据 --拷贝文件到数据库目录
```bash
]# systemctl stop redis
]# cp /备份目录/appendonly.aof /var/lib/redis/
]# chown redis:redis /var/lib/redis/appendonly.aof
]# systemcel start redis
```
AOF优点与缺点
**优点**:
最大程度保证数据的完整性和持久性,服务器宕机,也可以通过AOF文件恢复数据
AOF更新数据是追加类似mysql增量备份,高频的写入操作也不影响redis性能,而且AOF文件太大,重写AOF文件来删除其中的冗余信息
AOF有可读许和可操作性,可以对特定的键进行还原
**缺点**:
AOF文件体积通常大于RDB文件,高频写入操作,AOF文件会占用磁盘空间
AOF文件以追加的方式写入磁盘,高频会影响服务器性能
AOF文件对意外事故可以保证数据的完整性和安全性,但是相应地占用更多磁盘空间,数据以日志的形式追加到服务器中,对性能有一定影响。