Redis 提供了多种不同级别的持久化方式:
数据集
的时间点快照(point-in-time snapshot)。记录
服务器执行的所有写操作命令
,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。RDB 持久化和 AOF 持久化之间的异同,查看 http://doc.redisfans.com/topic/persistence.html
在默认情况下, Redis 将数据库快照保存在名字为 dump.rdb
(var/lib/redis) 的二进制文件中。
你可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。
你也可以通过调用 SAVE 或者 BGSAVE , 手动让 Redis 进行数据集保存操作。
比如说, 以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
save 60 1000
在redis.conf中的默认设置
# Save the DB on disk:
#
# save
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after 900 sec (15 min) if at least 1 key changed
# after 300 sec (5 min) if at least 10 keys changed
# after 60 sec if at least 10000 keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save ""
save 900 1
save 300 10
save 60 10000
这种持久化方式被称为快照(snapshot)。
当 Redis 需要保存 dump.rdb 文件时, 服务器执行以下操作:
这种工作方式使得 Redis 可以从写时复制(copy-on-write)机制中获益。
快照功能并不是非常耐久(durable): 如果 Redis 因为某些原因而造成故障停机, 那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。
尽管对于某些程序来说, 数据的耐久性并不是最重要的考虑因素, 但是对于那些追求完全耐久能力(full durability)的程序来说, 快照功能就不太适用了。
你可以通过修改配置文件来打开 AOF 功能:
appendonly yes
从现在开始, 每当 Redis 执行一个改变数据集的命令时(比如 SET), 这个命令就会被追加到 AOF 文件(默认appendonly.aof)的末尾。
这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
因为 AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大。
举个例子, 如果你对一个计数器调用了 100 次 INCR , 那么仅仅是为了保存这个计数器的当前值, AOF 文件就需要使用 100 条记录(entry)。
然而在实际上, 只使用一条 SET 命令已经足以保存计数器的当前值了, 其余 99 条记录实际上都是多余的。
为了处理这种情况, Redis 支持一种有趣的特性: 可以在不打断服务客户端的情况下, 对 AOF 文件进行重建(rebuild)。
执行 BGREWRITEAOF
命令, Redis 将生成一个新的 AOF 文件, 这个文件包含重建当前数据集所需的最少命令。
你可以配置 Redis 多久才将数据 fsync 到磁盘一次。
有三个选项:
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
redis-cli> CONFIG SET appendonly yes
redis-cli> CONFIG SET save ""
执行CONFIG SET save ""
会关闭 RDB 功能。 这一步是可选的,如果你愿意的话,也可以同时使用 RDB 和 AOF 这两种持久化功能。当 Redis 启动时, 如果 RDB 持久化和 AOF 持久化都被打开了, 那么程序会优先使用 AOF 文件来恢复数据集, 因为 AOF 文件所保存的数据通常是最完整的。
Redis 对于数据备份是非常友好的, 因为你可以在服务器运行的时候对 RDB 文件进行复制: RDB 文件一旦被创建, 就不会进行任何修改。 当服务器要创建一个新的 RDB 文件时, 它先将文件的内容保存在一个临时文件里面, 当临时文件写入完毕时, 程序才使用 rename(2) 原子地用临时文件替换原来的 RDB 文件。
建议:
使用RedisDump进行数据的导入和导出。
查看可选项:
ulysses@ulysses-KPL-W0X:~$ redis-dump -h
Try: /usr/local/bin/redis-dump show-commands
Usage: /usr/local/bin/redis-dump [global options] COMMAND [command options]
-u, --uri=S Redis URI (e.g. redis://hostname[:port])
-d, --database=S Redis database (e.g. -d 15)
-a, --password=S Redis password (e.g. -a 'my@pass/word')
-s, --sleep=S Sleep for S seconds after dumping (for debugging)
-c, --count=S Chunk size (default: 10000)
-f, --filter=S Filter selected keys (passed directly to redis' KEYS command)
-b, --base64 Encode key values as base64 (useful for binary values)
-O, --without_optimizations Disable run time optimizations
-V, --version Display version
-D, --debug
--nosafe
-d表示数据库代号,-s表示导出之后的休眠时间, -c代表分块大小,默认10000, -f代表导出时的过滤器, -O表示禁用运行时优化, -V用于显示版本
将本地redis数据库的数据导出:
ulysses@ulysses-KPL-W0X:~$ redis-dump -u :password@localhost:6379
{"db":0,"key":"l1","ttl":-1,"type":"list","value":["5","4","3","2","1"],"size":5}
{"db":0,"key":"zs1","ttl":-1,"type":"zset","value":[["a",1.0],["b",2.0],["d",2.1],["c",3.0]],"size":16}
{"db":0,"key":"h1","ttl":-1,"type":"hash","value":{"name":"jack","id":"002"},"size":13}
{"db":0,"key":"s1","ttl":-1,"type":"set","value":["c","d","b","a"],"size":4}
{"db":0,"key":"name1","ttl":-1,"type":"string","value":"杰克","size":2}
{"db":0,"key":"name","ttl":-1,"type":"string","value":"bob","size":3}
将数据导出到json文件:
redis-dump -u :password@localhost:6379 -d 0 > /home/ulysses/data/redis/db0.json
使用redis-load可恢复redis数据库数据
ulysses@ulysses-KPL-W0X:~$ redis-load -h
Try: /usr/local/bin/redis-load show-commands
Usage: /usr/local/bin/redis-load [global options] COMMAND [command options]
-u, --uri=S Redis URI (e.g. redis://hostname[:port])
-d, --database=S Redis database (e.g. -d 15)
-a, --password=S Redis password (e.g. -a 'my@pass/word')
-s, --sleep=S Sleep for S seconds after dumping (for debugging)
-b, --base64 Decode key values from base64 (used with redis-dump -b)
-n, --no_check_utf8
-V, --version Display version
-D, --debug
--nosafe
清除当前数据库:
127.0.0.1:6379> dbsize
(integer) 6
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> dbsize
(integer) 0
将json文件中的数据导入数据库中
ulysses@ulysses-KPL-W0X:~$ < /home/ulysses/data/redis/db0.json redis-load -u :password@localhost:6379 -d 0
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> dbsize
(integer) 6
127.0.0.1:6379>