Redis3:持久化
http://www.cnblogs.com/xhan/archive/2011/02/07/1949640.html
http://www.cnblogs.com/huli/archive/2010/06/06/1752778.html
在看全量持久化的时候,可以顺便看下redis的数据结构,下面这个存储结构是比较有用的.
redis使用了两种文件格式:全量数据和增量请求。全量数据格式是把内存中的数据写入磁盘,
便于下次读取文件进行加载;增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
redis对interger根据值范围采用不同的编码存储,具体如下:
值范围 |
字节数(byte) |
编码格式 |
[0, 1 << 6 – 1] |
1 |
00 | value |
[1 << 6, 1 << 14 – 1] |
2 |
01 | (value >> 8) | value & oxFF |
[1 << 14, 1 << 31 – 1] |
5 |
10 000000 | htonl(value) |
redis对数值类的string object编码存储格式如下:
值范围 |
字节数(byte) |
编码格式 |
[-(1 << 7), 1 << 7 – 1] |
2 |
1100 0000 | value & 0xFF |
[-(1 << 15), 1 << 15 – 1] |
3 |
1100 0001 | (value >> 8) & 0xFF | value & oxFF |
[-(1 << 31)], 1 << 31 – 1] |
5 |
1100 0010 | value & oxFF | (value >> 8) & 0xFF | (value >> 16) & 0xFF | (value >> 24) & 0xFF |
redis支持字符串压缩存储,压缩的编码格式如下:
1100 0011 |
compl_len (压缩后的长度) |
orig_len (压缩前的长度) |
comp_value (压缩后的内容) |
2.6.1 data文件格式
2.6.2 append文件格式
RedisDb |
*2 |
$6 |
SELECT |
$length(index) |
index:long |
||||
entry |
*3 |
$3 |
SET |
$length(key) |
key |
$length(value) |
value |
||
entry |
*3 |
$5 |
RPUSH |
$length(key) |
key |
$length(value) |
value |
||
entry |
*3 |
$4 |
SADD |
$length(key) |
key |
$length(value) |
value |
||
entry |
*3 |
$4 |
ZADD |
$length(key) |
key |
$length(score) |
score:double |
$length(value) |
value |
entry |
… |
||||||||
RedisDb |
… |
||||||||
|
|||||||||
|
|||||||||
|
|||||||||
RedisDb |
… |
||||||||
entry |
|||||||||
entry |
|||||||||
entry |
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。下面分别介绍
Snapshotting
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久 化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
下面介绍详细的快照保存过程
1.redis调用fork,现在有了子进程和父进程。
2. 父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copy on write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数 据是fork时刻整个数据库的一个快照。
3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不 是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。
另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话,可以采用aof持久化方式。下面介绍
Append-only file
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)
appendonly yes //启用aof持久化方式
# appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no //完全依赖os,性能最好,持久化没保证
aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test命令100次,文件中必须保存全部的100条命令,其实有99条都是多余的。因为要恢复数据库的状态其实文件中保存一条set test 100就够了。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis将使用与快照类似的方式将内存中的数据 以命令的方式保存到临时文件中,最后替换原来的文件。具体过程如下
1. redis调用fork ,现在有父子两个进程
2. 子进程根据内存中的数据库快照,往临时文件中写入重建数据库状态的命令
3.父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
4.当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件。
5.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。
需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。
转载于:https://www.cnblogs.com/xuxm2007/archive/2011/11/28/2265894.html
Redis3:持久化相关推荐
- Redis3.0 配置文件说明
背景: 以前有篇文章已经结果过了,现在复习一下,对Redis3.0进行说明: 参数说明: #redis.conf # Redis configuration file example. # ./red ...
- Linux下Redis3.2的安装和部署
redis简介: redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(so ...
- 深入学习Redis持久化
一.Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义. 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常 ...
- java如何实现redis分片存储_面试官:你说一下Redis吧,怎么实现高可用,还有持久化怎么做的?...
前言 作为Java程序员,在面试过程中,缓存相关的问题是躲不掉的,肯定会问,例如缓存一致性问题,缓存雪崩.击穿.穿透等.说到缓存,那肯定少不了Redis,我在面试的时候也是被问了很多关于Redis相关 ...
- CentOS6.5安装Redis3.2.8版本
1. 下载及安装Redis 1.1 去Redis官网下载页面选择相应版本下载,我这边选择3.2.8版本. 1.2 将下载的压缩包放置在虚拟机的 /usr/local 目录下并使用 tar -zxvf ...
- Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透
Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存击穿,缓存穿透 简单介绍一个redis? redis是内存中的数据结构存储系统,一个key-value类型的非关系型数据库,可持久化的数据库 ...
- redis的持久化存储,RDB与AOF
redis持久化存储支持两种方式:RDB和AOF.RDB一定时间取存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用 没有持久化的redis和memcache一样,相当于一个纯内存的数据 ...
- redis3.0.2安装
1:下载http://download.redis.io/releases/redis-3.0.2.tar.gz [root@web02 jifeng]# wget http://download.r ...
- RedisRDB持久化机制
什么是Redis持久化 什么是Redis持久化,就是将内存数据保存到硬盘. Redis 持久化存储 (AOF 与 RDB 两种模式) RDB持久化 RDB 是以二进制文件,是在某个时间 点将数据写入一 ...
最新文章
- 鸿蒙系统比比安卓系统好么,鸿蒙系统与安卓系统的区别 鸿蒙系统与安卓系统哪个更好...
- C#调用ArcGIS REST服务
- STM32中FLASH_Status的5个状态各表示的含义详解
- redis将散裂中某个值自增_这些Redis命令你都掌握了没?
- 开源GIS(十九)——WKT、WKB与GeoJSON
- Js 日期 多少分钟前,多少秒前
- [NOI2003]文本编辑器
- 群晖linux怎么进入u盘,超级简单,群晖系统的U盘制作和安装指导,实现家庭云...
- 自制抖音去水印工具 java+微信小程序
- .woff2/svg/woff文件报404错误
- CNZZ是统计什么的
- 设置MFC对话框背景图片
- 搞数仓也得懂几个常用机器学习算法
- matlab在矿物加工中的应用,试述《矿物加工数学模型》在矿物加工中的作用
- linux基础-- 桌面系统如何切换命令窗口
- html5+植物大战僵尸,HTML5 Canvas植物大战僵尸 - 鳄梨射手
- 手机维修基础 常见故障分析㈢
- R语言建模收入不平等:分布函数拟合及洛伦兹曲线(Lorenz curve)
- Windows ❀ CMD中使用批量Ping网段命令教程
- 【大数据人工智能AI2.0】GPT-4 office 全家桶发布,打工人凛冬将至 :Microsoft 365 Copilot (副驾驶)简介
热门文章
- 7-5 顺序存储的二叉树的最近的公共祖先问题(25 分)
- 【深度学习入门到精通系列】Gamma变换(校正)
- python【蓝桥杯vip练习题库】ALGO-157 阶乘末尾(高精度)
- linux 网络监控指标,Linux监控一些指标
- linux yum yum gem,CentOS 7 gem 安装fluentd
- mybatis 创建session, 缓存, 执行SQL
- mysql-plus 动态修改全局sql, 进行数据隔离, 多租户, 多字段修改
- 网站建设特定操作流程了解一下不吃亏
- android从放弃到精通 第三天 我还活着
- Elias-Fano编码算法——倒排索引压缩用,本质上就是桶排序数据结构思路