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)的方式。下面分别介绍
需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。