Redis 参数详解:

 

使用config get * 获得所有的配置项的key
#daemonize no  默认情况下, redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes
daemonize yes
#  当 redis 在后台运行的时候, Redis 默认会把 pid 文件放在 /var/run/redis.pid ,你可以配置到其他地址。
#  当运行多个 redis 服务时,需要指定不同的 pid 文件和端口
pidfile /var/run/redis_6379.pid
#  指定 redis 运行的端口,默认是 6379
port 6379
#  在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志
此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度, 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,然后在终端中执行sysctl -p。
tcp-backlog 511
#  指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1
#  设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
# 0 是关闭此设置
timeout 0
# TCP keepalive
#  在 Linux 上,指定值(秒)用于发送 ACKs 的时间。注意关闭连接需要双倍的时间。默认为 0 。
tcp-keepalive 0
#  指定日志记录级别,生产环境推荐 notice
# Redis 总共支持四个级别: debug 、 verbose 、 notice 、 warning ,默认为 verbose
# debug     记录很多信息,用于开发和测试
# varbose   有用的信息,不像 debug 会记录那么多
# notice    普通的 verbose ,常用于生产环境
# warning   只有非常重要或者严重的信息会记录到日志
loglevel notice
#  配置 log 文件地址
#  默认值为 stdout ,标准输出,若后台模式会输出到 /dev/null 。
logfile /var/log/redis/redis.log
#  可用数据库数
#  默认值为 16 ,默认数据库为 0 ,数据库范围在 0- ( database-1 )之间
databases 16
################################ 快照#################################
#  保存数据到磁盘,格式如下 :
#   save <seconds> <changes>
#    指出在多长时间内,有多少次更新操作,就将数据同步到数据文件 rdb 。
#    相当于条件触发抓取快照,这个可以多个条件配合
#    比如默认配置文件中的设置,就设置了三个条件
#   save 900 1  900 秒内至少有 1 个 key 被改变
#   save 300 10  300 秒内至少有 300 个 key 被改变
#   save 60 10000  60 秒内至少有 10000 个 key 被改变
# save 900 1
# save 300 10
# save 60 10000
#  后台存储错误停止写。
stop-writes-on-bgsave-error yes
#  存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompression yes
# RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
#  工作目录
#  数据库镜像备份的文件放置的路径。
#  这里的路径跟文件名要分开配置是因为 redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成,
#  再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
# AOF 文件也会存放在这个目录下面
#  注意这里必须制定一个目录而不是文件
dir /var/lib/redis/
################################# 复制 #################################
#  主从复制 . 设置该数据库为其他数据库的从数据库 .
#  设置当本机为 slav 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动从 master 进行数据同步
# slaveof <masterip><masterport>
#  当 master 服务设置了密码保护时 ( 用 requirepass 制定的密码 )
# slave 服务连接 master 的密码
# masterauth <master-password>
#  当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
# 1)  如果 slave-serve-stale-data 设置为 yes( 默认设置 ) ,从库会继续响应客户端的请求
# 2)  如果 slave-serve-stale-data 是指为 no ,出去 INFO 和 SLAVOF 命令之外的任何请求都会返回一个
#     错误 "SYNC with master in progress"
slave-serve-stale-data yes
#  配置 slave 实例是否接受写。写 slave 对存储短暂数据(在同 master 数据同步后可以很容易地被删除)是有用的,但未配置的情况下,客户端写可能会发送问题。
#  从 Redis2.6 后,默认 slave 为 read-only
slaveread-only yes
#  从库会按照一个时间间隔向主库发送 PINGs. 可以通过 repl-ping-slave-period 设置这个时间间隔,默认是 10 秒
# repl-ping-slave-period 10
# repl-timeout  设置主库批量数据传输时间或者 ping 回复时间间隔,默认值是 60 秒
#  一定要确保 repl-timeout 大于 repl-ping-slave-period
# repl-timeout 60
#  在 slave socket 的 SYNC 后禁用 TCP_NODELAY
#  如果选择“ yes ” ,Redis 将使用一个较小的数字 TCP 数据包和更少的带宽将数据发送到 slave , 但是这可能导致数据发送到 slave 端会有延迟 , 如果是 Linux kernel 的默认配置,会达到 40 毫秒 .
#  如果选择 "no" ,则发送数据到 slave 端的延迟会降低,但将使用更多的带宽用于复制 .
repl-disable-tcp-nodelay no
#  设置复制的后台日志大小。
#  复制的后台日志越大, slave 断开连接及后来可能执行部分复制花的时间就越长。
#  后台日志在至少有一个 slave 连接时,仅仅分配一次。
# repl-backlog-size 1mb
#  在 master 不再连接 slave 后,后台日志将被释放。下面的配置定义从最后一个 slave 断开连接后需要释放的时间(秒)。
# 0 意味着从不释放后台日志
# repl-backlog-ttl 3600
#  如果 master 不能再正常工作,那么会在多个 slave 中,选择优先值最小的一个 slave 提升为 master ,优先值为 0 表示不能提升为 master 。
slave-priority 100
#  如果少于 N 个 slave 连接,且延迟时间 <=M 秒,则 master 可配置停止接受写操作。
#  例如需要至少 3 个 slave 连接,且延迟 <=10 秒的配置:
# min-slaves-to-write 3
# min-slaves-max-lag 10
#  设置 0 为禁用
#   默认 min-slaves-to-write 为 0 (禁用), min-slaves-max-lag 为 10
################################## 安全 ###################################
#  设置客户端连接后进行任何其他指定前需要使用的密码。
#  警告:因为 redis 速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行 150K 次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解
# requirepass foobared
#  命令重命名 .
#  在一个共享环境下可以重命名相对危险的命令。比如把 CONFIG 重名为一个不容易猜测的字符。
#  举例 :
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#  如果想删除一个命令,直接把它重命名为一个空字符 "" 即可,如下:
# rename-command CONFIG ""
###################################约束###################################
#设置同一时间最大客户端连接数,默认无限制, 
#Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,
#如果设置  maxclients 0 ,表示不作限制。
#当客户端连接数到达限制时, Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
# maxclients 10000
#  指定 Redis 最大内存限制, Redis 在启动时会把数据加载到内存中,达到最大内存后, Redis 会按照清除策略尝试清除已到期的 Key
#  如果 Redis 依照策略清除后无法提供足够空间,或者策略设置为 ”noeviction” ,则使用更多空间的命令将会报错,例如 SET, LPUSH 等。但仍然可以进行读取操作
#  注意: Redis 新的 vm 机制,会把 Key 存放内存, Value 会存放在 swap 区
#  该选项对 LRU 策略很有用。
# maxmemory 的设置比较适合于把 redis 当作于类似 memcached 的缓存来使用,而不适合当做一个真实的 DB 。
#  当把 Redis 当做一个真实的数据库使用的时候,内存使用将是一个很大的开销
# maxmemory <bytes>
#  当内存达到最大值的时候 Redis 会选择删除哪些数据?有五种方式可供选择
# volatile-lru ->  利用 LRU 算法移除设置过过期时间的 key (LRU: 最近使用  Least RecentlyUsed )
# allkeys-lru ->  利用 LRU 算法移除任何 key
# volatile-random ->  移除设置过过期时间的随机 key
# allkeys->random -> remove a randomkey, any key
# volatile-ttl ->  移除即将过期的 key(minor TTL)
# noeviction ->  不移除任何可以,只是返回一个写错误
#  注意:对于上面的策略,如果没有合适的 key 可以移除,当写的时候 Redis 会返回一个错误
#  默认是 :  volatile-lru
# maxmemory-policy volatile-lru  
# LRU  和  minimal TTL 算法都不是精准的算法,但是相对精确的算法 ( 为了节省内存 ) ,随意你可以选择样本大小进行检测。
# Redis 默认的灰选择 3 个样本进行检测,你可以通过 maxmemory-samples 进行设置
# maxmemory-samples 3
############################## AOF###############################
#  默认情况下, redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。
#  所以 redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。
#  开启 append only 模式之后, redis 会把所接收到的每一次写操作请求都追加到 appendonly.aof 文件中,当 redis 重新启动时,会从该文件恢复出之前的状态。
#  但是这样会造成 appendonly.aof 文件过大,所以 redis 还支持了 BGREWRITEAOF 指令,对 appendonly.aof 进行重新整理。
#  你可以同时开启 asynchronous dumps 和  AOF
appendonly no
# AOF 文件名称  ( 默认 : "appendonly.aof")
# appendfilename appendonly.aof
# Redis 支持三种同步 AOF 文件的策略 :
# no:  不进行同步,系统去操作  . Faster.
# always: always 表示每次有写操作都进行同步 . Slow, Safest.
# everysec:  表示对写操作进行累积,每秒同步一次 . Compromise.
#  默认是 "everysec" ,按照速度和安全折中这是最好的。
#  如果想让 Redis 能更高效的运行,你也可以设置为 "no" ,让操作系统决定什么时候去执行
#  或者相反想让数据更安全你也可以设置为 "always"
#  如果不确定就用  "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 策略设置为 always 或者 everysec 时,后台处理进程 ( 后台保存或者 AOF 日志重写 ) 会执行大量的 I/O 操作
#  在某些 Linux 配置中会阻止过长的 fsync() 请求。注意现在没有任何修复,即使 fsync 在另外一个线程进行处理
#  为了减缓这个问题,可以设置下面这个参数 no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
# AOF  自动重写
#  当 AOF 文件增长到一定大小的时候 Redis 能够调用  BGREWRITEAOF  对日志文件进行重写
#  它是这样工作的: Redis 会记住上次进行些日志后文件的大小 ( 如果从开机以来还没进行过重写,那日子大小在开机的时候确定 )
#  基础大小会同现在的大小进行比较。如果现在的大小比基础大小大制定的百分比,重写功能将启动
#  同时需要指定一个最小大小用于 AOF 重写,这个用于阻止即使文件很小但是增长幅度很大也去重写 AOF 文件的情况
#  设置  percentage 为 0 就关闭这个特性
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
################################ LUASCRIPTING #############################
# 一个 Lua 脚本最长的执行时间为 5000 毫秒( 5 秒),如果为 0 或负数表示无限执行时间。
lua-time-limit 5000
################################LOW LOG################################
# Redis Slow Log  记录超过特定执行时间的命令。执行时间不包括 I/O 计算比如连接客户端,返回结果等,只是命令执行时间
#  可以通过两个参数设置 slow log :一个是告诉 Redis 执行超过多少时间被记录的参数 slowlog-log-slower-than( 微妙 ) ,
#  另一个是 slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除
#  下面的时间以微妙为单位,因此 1000000 代表一秒。
#  注意指定一个负数将关闭慢日志,而设置为 0 将强制每个命令都会记录
slowlog-log-slower-than 10000
#  对日志长度没有限制,只是要注意它会消耗内存
#  可以通过  SLOWLOG RESET 回收被慢日志消耗的内存
#  推荐使用默认值 128 ,当慢日志超过 128 时,最先进入队列的记录会被踢出
slowlog-max-len 128
################################  事件通知  #############################
#  当事件发生时, Redis 可以通知 Pub/Sub 客户端。
#  可以在下表中选择 Redis 要通知的事件类型。事件类型由单个字符来标识:
# K     Keyspace 事件,以 _keyspace@<db>_ 的前缀方式发布
# E     Keyevent 事件,以 _keysevent@<db>_ 的前缀方式发布
# g     通用事件(不指定类型),像 DEL, EXPIRE, RENAME, …
# $     String 命令
# s     Set 命令
# h     Hash 命令
# z     有序集合命令
# x     过期事件(每次 key 过期时生成)
# e     清除事件(当 key 在内存被清除时生成)
# A     g$lshzxe 的别称,因此 ”AKE” 意味着所有的事件
# notify-keyspace-events 带一个由 0 到多个字符组成的字符串参数。空字符串意思是通知被禁用。
#  例子:启用 list 和通用事件:
# notify-keyspace-events Elg
#  默认所用的通知被禁用,因为用户通常不需要改特性,并且该特性会有性能损耗。
#  注意如果你不指定至少 K 或 E 之一,不会发送任何事件。
notify-keyspace-events “”
##############################  高级配置  ###############################
#  当 hash 中包含超过指定元素个数并且最大的元素没有超过临界时,
# hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
# Redis Hash 对应 Value 内部实际就是一个 HashMap ,实际这里会有 2 种不同实现,
#  这个 Hash 的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的 HashMap 结构,对应的 valueredisObject 的 encoding 为 zipmap,
#  当成员数量增大时会自动转成真正的 HashMap, 此时 encoding 为 ht 。
hash-max-zipmap-entries 512
hash-max-zipmap-value 64  
#  和 Hash 一样,多个小的 list 以特定的方式编码来节省空间。
# list 数据类型节点值大小小于多少字节会采用紧凑存储格式。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# set 数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
set-max-intset-entries 512
#  和 hashe 和 list 一样 , 排序的 set 在指定的长度内以指定编码方式存储以节省空间
# zsort 数据类型节点值大小小于多少字节会采用紧凑存储格式。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# Redis 将在每 100 毫秒时使用 1 毫秒的 CPU 时间来对 redis 的 hash 表进行重新 hash ,可以降低内存的使用
#  当你的使用场景中,有非常严格的实时性需要,不能够接受 Redis 时不时的对请求有 2 毫秒的延迟的话,把这项配置为 no 。
#  如果没有这么严格的实时性要求,可以设置为 yes ,以便能够尽可能快的释放内存
activerehashing yes
# 客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,
# 可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
#  可以三种不同客户端的方式进行设置:
# normal ->  正常客户端
# slave  -> slave 和 MONITOR 客户端
# pubsub ->  至少订阅了一个 pubsub channel 或 pattern 的客户端
#  每个 client-output-buffer-limit 语法 :
# client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
#  一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
#  例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开
#  如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。
#  默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
#  只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
#  把硬限制和软限制都设置为 0 来禁用该特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb60
client-output-buffer-limit pubsub 32mb 8mb60
# Redis 调用内部函数来执行许多后台任务,如关闭客户端超时的连接,清除过期的 Key ,等等。
#  不是所有的任务都以相同的频率执行,但 Redis 依照指定的“ Hz ”值来执行检查任务。
#  默认情况下,“ Hz ”的被设定为 10 。
#  提高该值将在 Redis 空闲时使用更多的 CPU 时,但同时当有多个 key 同时到期会使 Redis 的反应更灵敏,以及超时可以更精确地处理。
#  范围是 1 到 500 之间,但是值超过 100 通常不是一个好主意。
#  大多数用户应该使用 10 这个预设值,只有在非常低的延迟的情况下有必要提高最大到 100 。
hz 10  
#  当一个子节点重写 AOF 文件时,如果启用下面的选项,则文件每生成 32M 数据进行同步。
aof-rewrite-incremental-fsync yes
1.3 	Redis常用命令
Redis缓存服务器命令行中常用命令如下:
Redis  CONFIG 命令格式如下:
redis 127.0.0.1:6379> CONFIG  GET|SET CONFIG_SETTING_NAME
CONFIG  GET * 获取Redis服务器所有配置信息;
接受单个参数 parameter 作为搜索关键字,查找所有匹配的配置参数,
比如执行 CONFIG GET s* 命令,服务器就会返回所有以 s 开头的配置参数及参数的值:
CONFIG  SET  loglevel  "notice"   设置Redis服务器日志级别;
指定日志级别,Redis日志有4个级别:debug、verbose、notice、warning
# debug(详细信息,在development/testing环境使用)
# verbose (有用的信息,不像debug会记录那么多)
# notice (常用于生产环境)
# warning (只有非常重要或者严重的信息会记录到日志)
loglevel notice
CONFIG  SET  requirepass  "jfedu"   命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启
AUTH   jfedu  AUTH 命令给定的密码 password 和配置文件中的密码相符的话,服务器会返回 OK 并开始接受命令输入。另一方面,假如密码不匹配的话,服务器将返回一个错误,并要求客户端需重新输入密码。
redis-cli  -h host  -p  port  -a  password 远程连接redis数据库;
CLIENT GETNAME 			获取连接的名称; 如果连接没有设置名字,那么返回空白回复;如果有设置名字,那么返回名字。
CLIENT SETNAME 			设置当前连接的名称;  这个名字会显示在 CLIENT LIST 命令的结果中, 用于识别当前正在与服务器进行连接的客户端。
CLUSTER SLOTS 			获取集群节点的映射数组;
COMMAND 					获取Redis命令详情数组;
COMMAND COUNT 		    获取 Redis 命令总数;
COMMAND GETKEYS 		获取给定命令的所有键;
TIME 						返回当前服务器时间;
CONFIG GET parameter 		获取指定配置参数的值;
CONFIG SET parameter value	修改redis 配置参数,无需重启;
CONFIG RESETSTAT 			重置 INFO 命令中的某些统计数据;
重置 INFO 命令中的某些统计数据,包括:
Keyspace hits (键空间命中次数)
Keyspace misses (键空间不命中次数)
Number of commands processed (执行命令的次数)
Number of connections received (连接服务器的次数)
Number of expired keys (过期key的数量)
Number of rejected connections (被拒绝的连接数量)
Latest fork(2) time(最后执行 fork(2) 的时间)
The aof_delayed_fsync counter(aof_delayed_fsync 计数器的值)
DBSIZE 					返回当前数据库的 key 的数量;
DEBUG OBJECT key 			获取 key 的调试信息; 当 key 存在时,返回有关信息。当 key 不存在时,返回一个错误。
DEBUG SEGFAULT 			让Redis服务崩溃;
FLUSHALL 					删除所有数据库的所有key; 清空整个 Redis 服务器的数据
FLUSHDB 					删除当前数据库的所有key;
DBSIZE                     查看所有的库
Select                      切换库
ROLE 						返回主从实例所属的角色;
SAVE 						异步保存数据到硬盘;执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘
SHUTDOWN 			    异步保存数据到硬盘,并关闭服务器;
SLOWLOG  					管理 redis 的慢日志; 用来记录查询执行时间的日志系统。
SET  keys  values			设置key为jfedu,值为123;
DEL  jfedu  				    删除key及值;
INFO  CPU   				查看服务器CPU占用信息;
KEYS  jfedu  				查看是存在jfedu的key;
KEYS  *     				查看Redis所有的KEY;
CONFIG REWRITE 			启动 Redis时所指定的redis.conf 配置文件进行改写;
INFO [section] 				获取Redis服务器的各种信息和统计数值;
SYNC 						用于复制功能(replication)的内部命令;
SLAVEOF host port 			指定服务器的从属服务器(slave server);
MONITOR 					实时打印出Redis服务器接收到的命令,调试用;
LASTSAVE 					返回最近一次Redis成功将数据保存到磁盘上的时间;;
CLIENT PAUSE timeout		指定时间内终止运行来自客户端的命令;
BGREWRITEAOF 		    异步执行一个 AOF(AppendOnly File) 文件重写操作; 执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。
BGSAVE 				    后台异步保存当前数据库的数据到磁盘。
1.4 	Redis数据备份与恢复
Redis所有数据都是保存在内存中,Redis数据备份可以定期的通过异步方式保存到磁盘上,该方式称为半持久化模式,如果每一次数据变化都写入aof文件里面,则称为全持久化模式。同时还可以基于Redis主从复制实现Redis备份与恢复。
1.4.1  半持久化RDB模式
半持久化RDB模式也是Redis备份默认方式,是通过快照(snapshotting)完成的,当符合在Redis.conf配置文件中设置的条件时Redis会自动将内存中的所有数据进行快照并存储在硬盘上,完成数据备份。
Redis进行RDB快照的条件由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被更改的键的个数大于指定的数值时就会进行快照。在配置文件中已经预置了3个条件:
save 		900 	1     	  #900秒内有至少1个键被更改则进行快照;
save 		300 	10    	  #300秒内有至少10个键被更改则进行快照;
save 		60  	10000  	  #60秒内有至少10000个键被更改则进行快照。
save        60      10000    #表示每隔60秒如果有10000个key变化就会生成一次快照,并且新的快照会覆盖原来的快照
默认可以存在多个条件,条件之间是“或”的关系,只要满足其中一个条件,就会进行快照。 如果想要禁用自动快照,只需要将所有的save参数删除即可。Redis默认会将快照文件存储在Redis数据目录,默认文件名为:dump.rdb文件,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。也可以在Redis命令行执行config  get  dir获取Redis数据保存路径,如图12-15(a)、12-15(b)所示:
 图12-15(a) 获取Redis数据目录
 图12-15(b) Redis数据目录及dump.rdb文件

Redis Rdb模式恢复
配置参数如下
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis
################################ 快照#################################
#  保存数据到磁盘,格式如下 :
#   save <seconds> <changes>
#    指出在多长时间内,有多少次更新操作,就将数据同步到数据文件 rdb 。
#    相当于条件触发抓取快照,这个可以多个条件配合
#    比如默认配置文件中的设置,就设置了三个条件
#   save 900 1  900 秒内至少有 1 个 key 被改变
#   save 300 10  300 秒内至少有 300 个 key 被改变
#   save 60 10000  60 秒内至少有 10000 个 key 被改变
# save 900 1
# save 300 10
# save 60 10000
#  后台存储错误停止写。
stop-writes-on-bgsave-error yes
#  存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes
rdbcompression yes
# RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
#  本地持久化数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
#  工作目录
#  数据库镜像备份的文件放置的路径。
#  这里的路径跟文件名要分开配置是因为 redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成,
#  再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
# AOF 文件也会存放在这个目录下面
#  注意这里必须制定一个目录而不是文件
dir /usr/local/redis/
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。获取 redis 目录可以使用 CONFIG 命令,如下所示:
redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis "
恢复数据的时候把Redis主从关闭
1)	配置脚本测试数据写入master数据
#!/bin/bash
REDISCLI="redis-cli -a slavepass -n 1 SET"
ID=1
while(($ID<50001))
do
  INSTANCE_NAME="i-2-$ID-VM"
  UUID=`cat /proc/sys/kernel/random/uuid`
  PRIVATE_IP_ADDRESS=10.`echo "$RANDOM % 255 + 1" | bc`.`echo "$RANDOM % 255 + 1" | bc`.`echo "$RANDOM % 255 + 1" | bc`\
  CREATED=`date "+%Y-%m-%d %H:%M:%S"`
  $REDISCLI vm_instance:$ID:instance_name "$INSTANCE_NAME"
  $REDISCLI vm_instance:$ID:uuid "$UUID"
  $REDISCLI vm_instance:$ID:private_ip_address "$PRIVATE_IP_ADDRESS"
  $REDISCLI vm_instance:$ID:created "$CREATED"
  $REDISCLI vm_instance:$INSTANCE_NAME:id "$ID"
  ID=$(($ID+1))
done
2)	将数据写入到新的实例中
 
Keyspace
redis是支持多个实例的默认最多16个,可以修改配置文件来支持更多!
使用INFO命令查看!
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db0 :这个可以理解为命名空间。最多支持16个,使用SELECT 去切换
192.168.0.201:6379> SELECT 1
OK
尝试添加一个key-value
SET db1 hehe
然后在使用INFO看下
# Keyspace
db0:keys=1,expires=0,avg_ttl=0
db1:keys=1,expires=0,avg_ttl=0
使用save命令将配置存储在快照中,使用快照进行还原,然后要将快照文件备份到其他目录中
 
cp /usr/local/redis/dump.rdb /tmp/
#复制备份
3)	测试删除快照,重新恢复文件
 
重启redis服务,发现数据丢失
 
4)	则需要重新将dump.rdb备份文件复制放到dir主目录中,重启redis数据可以直接进行恢复。
cp /tmp/dump.rdb  /usr/local/redis/
#重新启动  nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
 
Redis实现快照的过程,Redis使用fork函数复制一份当前进程(父进程)的副本(子进程),父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件,当子进程写入完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
执行fork的时操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据。
Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实 现Redis数据库备份。
RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。除了自动快照,还可以手动发送SAVE和BGSAVE命令让Redis执行快照,两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。 
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,根据数据量大小与结构和服务器性能不同,通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需花费20~30秒钟。 
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。此时需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围。
1.4.2  半持久化AOF模式
如果数据很重要无法承受任何损失,可以考虑使用AOF方式进行持久化,默认Redis没有开启AOF(append only file)方式的全持久化模式。
在启动时Redis会逐个执行AOF文件中的命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些,开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改该名称。
Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少,可以在redis.conf中通过appendonly参数开启Redis AOF全持久化模式:
appendonly  yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb
appendfsync always   
#appendfsync everysec
#appendfsync no
Redis AOF持久化参数配置详解:
appendonly  yes						#开启AOF持久化功能;
appendfilename appendonly.aof  		    #AOF持久化保存文件名;
appendfsync always   				    #每次执行写入都会执行同步,最安全也最慢;
#appendfsync everysec 				    #每秒执行一次同步操作;
#appendfsync no       				#不主动进行同步操作,而是完全交由操作系统来做,每30秒一次,最快也最不安全;
auto-aof-rewrite-percentage  100  	    #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;
auto-aof-rewrite-min-size    64mb   	#允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存的机制。
从 aof 中恢复数据
1 打开以下配置
appendonly yes
appendfilename appendonly.aof
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb
appendfsync always  
dir /usr/local/redis
 
2 拷贝 AOF 文件到 Redis 的数据目录
cp appendonly.aof /usr/local/redis
 
3 启动 redis-server
Nohup  /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &

1.4.3  Redis主从复制备份
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。
为了避免单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使只有一台服务器出现故障其他服务器依然可以继续提供服务,这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上,Redis提供了复制(replication)功能可以自动实现同步的过程。通过配置文件在Redis从数据库中配置文件中加入slaveof  master-ip  master-port即可,主数据库无需配置。
Redis主从复制优点及应用场景, WEB应用程序可以基于主从同步实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率一般比较大,当单机Redis无法应付大量的读请求时,可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作,还可以基于LVS+keepalived+Redis对Redis实现均和高可用。
从数据库持久化持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。
当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVE  OF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。
1.4.4  REDIS 恢复
当redis宕机后,导致当前数据丢失。需要拿最新备份数据恢复到redis,如果rdb和aof都打开的情况下,要注意一下几点。
1、拷贝dump.rdb文件到redis 数据文件夹下
2、启动redis,此时如果redis同时开启了aof生成策略,redis会先加载aof,如果没有则生成一个aof
3、此时如果get key获取rdb中的备份数据会发现并没有获取到,这是由于redis启动时,基于新的内存重新生成了一个新的rdb文件,覆盖了备份的rdb文件
4、遇到这种情况应该先把aof生成策略先关闭,即把redis.conf文件中的appendonly 改为 no,然后重启redis
5、此时发现可以获取备份中的数据了,确认数据恢复后,这个时候要打开aof必须动态的打开,方法是进入客户端后,输入命令config set appendonly yes
6、确认设置是否成功,config get appendonly,返回yes ,说明已经设置成功,在此确认数据是否恢复,如果已经恢复,再次停止redis
7、然后修改配置文件,把redis.conf文件中的appendonly 改为yes,然后重启redis.
8、启动后,再次确认数据是否已经恢复,发