1 数据存储
Redis是基于内存的缓存中间件,共有5种存储数据的方式,分别为string,list,set,zset和hash,同时,Redis具备持久化数据的功能,即RDB和AOF,默认为RDB方式。
2 数据备份
数据持久化到磁盘:rdb和aof两种方式,默认rdb方式。
2.1 快照持久化
快照持久化即RDB持久化数据是将当前数据库中的数据备份到*.rdb文件中,配置文件:
# 备份文件名称:dump.rdb
dbfilename dump.rdb
# 备份文件位置
dir /var/lib/redis
# 保存快照
# 格式:save 时间间隔(秒) key改变的最少个数
# save 900 1:每900秒,检查key改变个数,
# 当至少有1个key改变,则保存快照
save 900 1
save 300 10
save 60 10000
Redis通过saveparam结构体保存save参数
struct{
time_t seconds;
int changes;
}
服务器结构体redisSever添加了三个字段:
saveparams:保存所有save参数;
dirty:保存上一次成功执行SAVE或BGSAVE命令之后,服务器对数据库执行的修改次数;
lastsave:记录服务器上一次执行SAVE和BGSAVE的UNIX时间戳;
struct{
struct saveparam *saveparams;
long long dirty;
time_t lastsave;
}
rdb文件位置:/var/lib/redis,文件为dump.rdb,使用vim打开,内容如下:
REDIS0008ú redis-ver^E4.0.9ú
redis-bitsÀ@ú^EctimeÂ<98>±ª^ú^Hused-memÂ^@^Q^L^@ú^Laof-preambleÀ^@þ^@û^L^H^@^S¬í^@^Et^@^LuserInfosObj^@ü5^@<9c>^Rr^A^@^@^@,refresh:1875c460-2d69-47e3-a240-f0c9020b7b33Ã@üAB^_¬í^@^Esr^@Lorg.springframework.secu^]rity.oauth2.common.DefaultExpi@/^AOA@^\^ZRefreshToken/ßGc<9d>ÐÉ·^B^@^AL^@
持久化的rdb文件为Redis的数据格式,可看出部分的存储数据,如refresh。
2.2 AOF持久化
默认情况Redis通过异步转存数据到磁盘,这种方式可满足大部分应用需求,但是由于Redis进程问题和断电会丢失几分钟写入的数据。Append Only File模式是另一种更好的持久化方案,该方式在断电或单次写入错误(操作系统正常运行)情况下仅会丢失1秒的数据,RDB和AOF两种方式可以同时使用,若同时使用,默认会载入AOF数据,AOF保存的数据更加可靠(丢失数据更少)。
# 配置,默认no,关闭
appendonly no
# 文件名称
appendfilename "appendonly.aof"
# 保存周期:共有三种模式
# always:实时保存,AOF缓冲区所有内容写入并同步到AOF文件中数据安全性高,CPU资源占用较多
# everysec:每秒同步一次数据,将AOF缓冲区所有数据写入AOF文件中,并且这个同步操作由一个线程专门负责执行,数据安全性不如always,当当服务器出现故障时会出现1s的数据空窗期,但是CPU消耗比always小
# no:将AOF缓冲区所有内容写入到AOF文件,但不对AOF文件进行同步,何时同步由操作系统决定,CPU消耗较低,但数据安全性较差,且单次同步时间最长
appendfsync everysec
2.3 持久化保存方式
Redis提供两种具体的保存方式,即同步保存(SAVE)和异步保存(BGSAVE)。
- SAVE
同步保存,使用主线程保存,此时Redis线程阻塞,客户端无法连接Redis,当保存完成时,释放主线程,客户端重新建立连接,当数据量较大时,会出现获取数据失败等问题;
节约资源,大量数据存储,阻塞; - BGSAVE
异步保存,使用BGSAVE保存时,Redis会fork一个子线程进行保存操作,此时Redis主线程仍保持与客户端的连接;
耗费资源较多,保证数据传输;
3 问题
3.1 快照持久化失败
- 问题
1871:M 09 May 11:02:15.096 * Background saving started by pid 19285
19285:C 09 May 11:02:15.096 # Failed opening the RDB file dump.rdb (in server root dir /var/lib/redis) for saving: Permission denied - 原因
*.rdb文件权限不足 - 方案
修改*.rdb文件权限,
文件位置:/var/lib/redis
chmod 766 dump.rdb
注意:
修改用户。
sudo chown root xdq dump.rdb
当然,上述的解决方式都没有解决我的问题,因为我使用vim打开过dump.rdb文件,导致了文件不能在使用,同时再新建一个同名文件仍不可使用,只能重新安装Redis。
4 小结
- Redis基于内存缓存的中间件,同时具有持久化数据的功能,共有两种方式:RDB和AOF方式;
- AOF方式持久化数据最多丢失1秒的数据,RDB依据的规则,会丢失几分钟的数据;
- AOF和RDB持久化数据可同时使用,两者同时开启时,默认读取AOF数据;
【参考文献】
[1]https://blog.csdn.net/u014466635/article/details/80081378
[2]https://www.cnblogs.com/itdragon/p/7906481.html
[3]https://baijiahao.baidu.com/s?id=1643385491075066750&wfr=spider&for=pc
[4]https://www.daixiaorui.com/read/230.html