Redis的持久化存储
Redis的持久化
Redis 是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题, Redis 提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。
RDB
RDB持久化既可以手动执行,有可以根据服务器配置预定项执行,该功能可以将某个时间点上的数据库信息保存到一个RDB文件中。
RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原数据库中的数据。
因为RDB文件是保存在硬盘里面,所有即使Redis服务器进程退出,甚至运行Redis服务器的计算机停机,只要RDB文件仍然存在,Redis服务器就可以使用它来还原数据库中的数据。
RDB文件的创建和载入
RDB文件的创建可以通过SAVE和BGSAVE命令来创建,其中SAVE命令会阻塞Redis服务的进程,直到RDB文件创建完毕为止,在阻塞期间服务器不能处理任何命令请求。
BGSAVE命令是通过派出一个子进程在后台负责创建RDB文件,服务器进程仍然可以继续处理请求,
RDB文件的载入工作在Redis启动的时候,只要Redis服务器在启动的时候检测到RDB的存在,就会自动载入RDB文件恢复内存数据。
如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库的信息,只要AOF持久化功能处于关闭状态的时候,服务器才会使用RDB文件来恢复数据库状态,默认使用的是RDB持久化。
SAVE命令创建RDB文件
当SAVE命令执行的时候,Redis服务器会被阻塞,所以当SAVE命令在执行的时候,客户端发送的所有命令请求都会被拒绝。
只有当SAVE命令执行完毕的时候,服务器才会接受和处理客户端发来的请求。
BGSAVE命令创建RDB
由于BGSAVE命令创建RDB文件是由子进程执行的,所以在子进程创建RDB文件的过程中,Redis仍然可以继续处理客户端的请求命令,但是如果在BGSAVE命令执行期间,是不会接受SAVE、BGSAVE命令的执行的。
自动间隔性保存
在我们实际应用中不可能时常通过SAVE和BGSAVE命令来将数据保存到RDB文件的,Redis为我们提供了便利,可以通过配置文件来让服务器执行BGSAVE命令。默认提供的配置信息如下:
daemonize yes # 守护进程执行,后台运行
bind 127.0.0.1 #redis绑定地址
port 6379 # 端口
requirepass 123 # 密码
logfile /data/6379/redis.log # 日志文件
dir /data/6379/ # 定义持久化文件存储位置
dbfilename dbmp.rdb # rdb持久化文件
save 300 10 # 如果300秒内有大于等于10次修改则进行一次持久化保存
save 900 1 # 服务器在900秒之内,对数据库进行了只是1次修改
save 300 10 # 服务器在300秒之内,对数据库进行了只是10次修改
save 60 10000 # 服务器在60秒之内,对数据库进行了只是10000次修改
注:如果写入持久化配置文件,那么我们启动时就不能直接使用redis-server。我们需要从写入配置的文件启动redis。redis-server /opt/xxx/xxx.conf
RDB:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
AOF
Redis提供的RDB持久化是将数据以二进制存储到后缀为rdb的文件中,AOF持久化则是通过将所有的对数据库写入操作的命令存储到aof文件中实现持久化。
实现原理
AOF持久化功能的实现可以分为命令追加/文件写入/文件同步三个步骤。
命令追加
当AOF持久化功能处于开启状态的时候,服务器在执行完一个写命令后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区中。
文件写入与同步
当命令追加到aof_buf缓冲区后,服务器就会调用flushAppendOnlyFile函数,根据配置的策略决定是否将缓冲区中的内容写入和保存到AOF文件中。具体策略如下:
daemonize yes # 守护进程执行,后台运行
bind 127.0.0.1 #redis绑定地址
port 6379 # 端口
requirepass 123 # 密码
logfile /data/6379/redis.log # 日志文件
dir /data/6379/ # 定义持久化文件存储位置
appendonly yes
appendfsync always # 总是修改类的操作
everysec # 每秒做一次持久化
no # 依赖于系统自带的缓存大小机制
Always:每次写操作完成都同步一次aof_buf数据到AOF文件
everysec:由线程负责,每秒同步一次aof_buf数据到AOF文件
no:什么时候同步aof_buf数据到AOF文件由操作系统控制
AOF文件的载入与数据还原
AOF持久化一旦开启,那么RDB持久化就失效。所以Redis在重启的时候,如果发现AOF持久化开启,就会读取AOF文件恢复数据状态,而忽略RDB文件。一开始就说过了AOF持久化是通过将数据库的写命令保存起来实现的,所以Redis只需要将AOF文件中的命令执行一遍就可以恢复数据库数据状态。
AOF重写
既然知道AOF是将写命令存储到AOF文件中实现持久化,那么就应该会想到AOF文件体积越来越大,一旦达到某个量级,重启Redis的时间必将严重增加。
为了解决这个问题,Redis提供了AOF文件重写功能。通过该功能,可以创建一个新的AOF文件替换现有的AOF文件,两个AOF文件的数据库数据一致,但是新的AOF文件不会包含浪费空间的冗余命令。而且提交会比旧的AOF文件小的多。
AOF重写实现原理
AOF文件重新并不需要对现有的AOF文件进行任何读取,分析或者写入操作,而是通过读取当前数据库的数据来完成的。简单总结就是:读取当前数据库中键现有的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。
AOF重写过程数据不一致
为什么会出现重写后AOF数据不一致的问题呢?我们可以这样思考:
1)Redis后台进程处理AOF重写。
2)对key1={"1", "2","3"}这个键值对完成了重写。
3)用户对key1这个键执行了删除3这个值。
4)重写完成。这样导致的原因是在AOF重写过程中,有用户对数据库重新执行了写操作,导致重新的AOF文件不一致。
针对这个问题,Redis服务器设置了一个AOF重写缓冲区,这个缓冲区在服务器创建子进程之后开始调用,当Redis服务器执行完一个写命令后,它会同时将这个命令发送给AOF缓冲区和AOF重写缓冲区。在AOF重写完成后,会执行AOF重写缓冲区的命令确保数据库数据的一致性。
AOF和RDB的区别
RDB
优点:基于快照的持久化,数据恢复速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能。
缺点:如果服务器宕机,可能会造成一段时间内的数据丢失。
AOF
优点:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog。
缺点:AOF生成的日志文件太大,即使通过重写,文件体积仍然很大。数据恢复速度比RDB慢。
rdb模式下的redis持久化,不重启切换为 aof模式
CONFIG set appendonly yes #开启AOF功能
CONFIG SET save "" #关闭RDB功能
注:执行完上述命令,还要更改配置文件为AOF模式,才是真的永久切换
参考:https://blog.csdn.net/sinat_32366329/article/details/81266568
Redis的持久化存储的更多相关文章
- mysql如何设置主从(读写分离),redis发布功能,以及redis的持久化存储(rdb,aof)
1 mysql基本命令 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroot -p -h 127.0.0.1 3.远程链接mysq ...
- 【laravel5.* + 钉钉实现WEB第三方登录】 使用redis 作为持久化存储
1.去钉钉开发者平台>自助者工具,创建扫码登录授权应用,填写名称.描述.授权页面logo地址(这个图片最后会出现在用户扫码设备中,建议使用压缩图片减少用户加载时间).回调域名(一般都是写一个子域 ...
- Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)
第1章 redis存储系统 1.1 redis概述 REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统.redis和大名鼎鼎的Mem ...
- Redis持久化存储(AOF与RDB两种模式)
Redis中数据存储模式有2种:cache-only,persistence; cache-only即只做为“缓存”服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在“数据恢复”的手段,是一 ...
- redis的发布订阅、持久化存储、redis的主从复制
redis的发布订阅 1. 创建redis配置文件 vim /opt/redis_conf/reids-6379.conf mkdir /data/6379 redis-server redis-6 ...
- Redis持久化存储(RDB和AOF)
参考了: https://blog.csdn.net/canot/article/details/52886923 和 https://www.cnblogs.com/zhangchao-letv/ ...
- Redis持久化存储详解(一)
> 为什么要做持久化存储? 持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存.我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成数据的 ...
- Part_three:Redis持久化存储
redis持久化存储 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. 1.RD ...
- redis多实例与主从同步及高级特性(数据过期机制,持久化存储)
redis多实例 创建redis的存储目录 vim /usr/local/redis/conf/redis.conf #修改redis的配置文件 dir /data/redis/ #将存储路径配置修改 ...
随机推荐
- Django【第19篇】:Django之extra
extra过滤 extra extra(select=None, where=None, params=None, tables=None, order_by=None, select_params= ...
- SpringBoot框架(4)-- 类装配及Bean装配监听器
1.普通方式装配类对象 (1)添加带有@Bean注解的方法 User.java(带@Component注解) package com.demo.boot.bootenable.beanDemo1 ...
- 2016.5.21【初中部 NOIP提高组】模拟赛A 总结
这次比赛的题目看上去好像不难,但当开始仔细想的时候才发现,并没有那么简单. T1旅行:刚开始看到k<=4的时候还以为有题可以AC了,不过呢,还是毫无思路. T3Pty爬山:雨天的尾巴最近打了几道 ...
- 解决json不能解析换行问题
今天遇到一个问题,当我读取数据库中某条带换行的数据时,解析错误. 解决方法是在存入数据库时对数据做处理,把换行换成其他字符.代码如下: remark = remark.replace(/\n/g,&q ...
- Vux的安装使用
1.Vux的安装 1.1.vue-cli的vux模板生成项目 可以直接使用 vue-cli 的模板生成一个 vux 项目 vue init airyland/vux2 projectName 由此可以 ...
- 【PowerOJ1742&网络流24题】试题库问题(最大流)
题意: 思路: [问题分析] 二分图多重匹配问题,用最大流解决. [建模方法] 建立二分图,每个类别为X集合中的顶点,每个题为Y集合中的顶点,增设附加源S和汇T. 1.从S向每个Xi连接一条容量为该类 ...
- B - Sumdiv(第三周)
B - Sumdiv 题目链接:https://vjudge.net/contest/154063#problem/B 题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题思路 ...
- 小程序封装wx.request,以及调用
1.新建一个api目录,与pages同级 2.在api目录下新建一个api.js文件 3.编写代码 const host = 'http://test.test.cn' const wxRequest ...
- bootstrap select下拉框模糊搜索和动态绑定数据解决方法
此方法适合后台一次性返回所有数据好了废话不多说直接上代码: <!DOCTYPE html><html><head> <title>Bootstrap-s ...
- Web开发系列【1】实用的网页布局(PC端)
在熟悉那些常用的软件.工具后,我们正式开始开发,在前期准备工作之后,我们要做的事情是写页面,也就是网页布局.在w3c.菜鸟.慕课网等等网站上都有基础的 HTML+CSS 知识讲解,在初期学习中,跟着教 ...