Redis数据存储

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值