# redis启动时后面跟上本实例对应的属性配置文件进行启动
./redis-server /path/to/redis.conf
# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:
#
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
################################## INCLUDES(外部文件引入) ###################################
#引入其它配置文件,在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用
include /path/to/local.conf
include /path/to/other.conf
################################## NETWORK ##############################################
#默认情况下,如果没有bind配置指令指定,Redis监听所有网络接口的服务器上可用的连接。
#使用bind配置指令只使用一个或多个IP地址。如果计算机运行redis是直接暴露在互联网上,结合所有的接口是危险的。
#所以我们采用以下默认绑定指令,这将迫使Redis只听到IPv4回望接口地址
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
bind 127.0.0.1
#当保护模式打开时,如果:
#1)服务器不使用bind指令显式地绑定到一组地址。
#2)没有配置密码。
#开启该参数后,redis只会本地进行访问,拒绝外部访问。
#要是配置了密码 和bind,可以开启。否则最好关闭,设置为no。
protected-mode yes
#接受指定的监听端口连接,默认值是6379(IANA 815344)。如果端口是0则Redis不会监听一个TCP套接字。
port 6380
#TCP完成三次握手之后会将接受的连接放入队列中,此参数确定了队列的大小,当然此值必须不大于Linux系统定
#义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。
#当系统并发量大并且客户端速度缓慢的时候,对于负载很大的服务程序来说大大的不够,可以将这二个参数一起参考设定。
#一般会将它修改为2048或者更大。使用命令: echo 511 > /proc/sys/net/core/somaxconn
或者在/etc/sysctl.conf中添加:net.core.somaxconn = 2048,2048由实际需要而定,然后在终端中执行sysctl -p。
tcp-backlog 511
#配置unix socket来让redis支持监听本地连接。
unixsocket /tmp/redis.sock
#配置unix socket使用文件的权限
unixsocketperm 700
#在客户端空闲了N秒后服务端会断开连接,为0则服务端不会主动断开连接,不能小于0
timeout 0
#Redis默认从Redis 3.2.1版本开始,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,
#避免服务器一直阻塞,建议值是60s,单位是秒,如果设置为0,则不会周期性的检测.
tcp-keepalive 300
################################# GENERAL #####################################
#是否将redis设置为守护进程,如果是的话将pid写入到/var/run/redis.pid文件中 (yes/no)
daemonize no
#可以通过upstart和systemd管理Redis守护进程
#选项:
# supervised no - 没有监督互动
# supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
# supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
# supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
supervised no
#如果将redis设置为守护进程方式运行,redis默认会将pid写入该文件
pidfile /var/run/redis_6380.pid
#指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
# debug (记录大量日志信息,适用于开发、测试阶段)
# verbose (较多日志信息)
# notice (适量日志信息,使用于生产环境)
# warning (仅有部分重要、关键信息才会被记录)
loglevel notice
#指定日志文件名。也可以使用空字符串强制使用登录标准输出。
#注意如果你使用标准输出日志,日志将被发送到/dev/null
logfile ""
#设置为yes则启用系统日志,和可选的更新其他系统参数以适合你的需要。
syslog-enabled no
#制定日志的身份
syslog-ident redis
#指定syslog。必须是用户或local0-local7之间。
syslog-facility local0
#设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
################################ SNAPSHOTTING(数据保存频率) ################################
#多长时间内有多少此更新操作,则将数据同步到数据文件,以下默认为
#900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改
save 900 1
save 300 10
save 60 10000
#在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,
#Redis则会停止接受更新操作。这样会让用户了解到数据没有被正确的存储到磁盘上。
#否则没人会注意到这个问题,可能会造成灾难。如果后台存储(持久化)操作进程再次工作,
#Redis会自动允许更新操作。
#然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。
#如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。
stop-writes-on-bgsave-error yes
#指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,会消耗CPU资源
#如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
#从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。
#这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降,
#所以,为了达到性能的最大化,你可以关掉这个配置项。
#没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。
rdbchecksum yes
#数据库文件名称,可自定义,通常按照规范命名
dbfilename dump_6380.rdb
#redis数据库文件存放路径,配合dbfilename一起使用
dir /opt/redis/redis-3.2.11/dbfile/
################################# REPLICATION(主从复制) #################################
#设置从属的主服务IP以及端口
slaveof 127.0.0.1 6379
#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。
#masterauth就是用来配置master的密码,这样可以在连上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
#作为从节点,默认是只读的,如果改为no,则可以写,但是不建议这么做
slave-read-only yes
#目前redis复制提供两种方式,disk(保存到磁盘)和socket(无磁盘复制)。如果新的slave连上来或者重
#连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:
#disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。
#socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。
#disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。
#socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。
#是否使用无磁盘方式复制数据,默认关闭。
repl-diskless-sync no
#diskless复制的延迟时间,防止设置为0。一旦复制开始,主节点不会再接收新slave的复制请求
#必须等待下一次rdb传输。所以最好等待一段时间,等更多的slave到复制队列中来,单位为秒。
repl-diskless-sync-delay 5
#主从节点在建立复制后,它们之间会维护着长连接并彼此发送心跳命令,主节点根据指定的时间间隔向服务器发送ping请求。时间间隔默认10秒。
repl-ping-slave-period 10#复制连接超时时间。master和slave都有超时时间的设置。
#master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。
#slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。
#需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。
repl-timeout 60
#主从节点同步(发送psync/sync命令)的网络延迟,默认是no,即使用tcp nodelay网络延迟。
#如果master设置了yes来禁止网络延迟,在把数据复制给slave的时候,会合并较小的TCP数据包来减少包的数量和更小的网络带宽。
#但是这也可能带来数据的延迟,延迟间隔取决与系统内核,默认为40毫秒,默认我们推荐更小的延迟来保证性能.
#但是在数据量传输很大的场景下,建议选择yes,来保证数据的一致性。
repl-disable-tcp-nodelay no
#设置backlog的大小,backlog是一个缓冲区,在slave端失连时Master端存放要同步到slave的数据,
#因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。
#backlog设置的越大,slave可以失连的时间就越长.
repl-backlog-size 1mb
#如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
repl-backlog-ttl 3600
#当master不可用,哨兵会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。
slave-priority 100
#设置当一个master端的可用slave少于(min-slaves-to-write)N个,延迟时间大于(min-slaves-max-lag)M秒时,不接收写操作。
min-slaves-to-write 3
min-slaves-max-lag 10
#Redis master能够以不同的方式列出所连接slave的地址和端口。
# 例如,“INFO replication”部分提供此信息,除了其他工具之外,Redis Sentinel还使用该信息来发现slave实例。
# 此信息可用的另一个地方在masterser的“ROLE”命令的输出中。
# 通常由slave报告的列出的IP和地址,通过以下方式获得:
# IP:通过检查slave与master连接使用的套接字的对等体地址自动检测地址。
# 端口:端口在复制握手期间由slavet通信,并且通常是slave正在使用列出连接的端口。
# 然而,当使用端口转发或网络地址转换(NAT)时,slave实际上可以通过(不同的IP和端口对)来到达。
#slave可以使用以下两个选项,以便向master报告一组特定的IP和端口,
# 以便INFO和ROLE将报告这些值。
# 如果你需要仅覆盖端口或IP地址,则没必要使用这两个选项
#
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################## SECURITY ###################################
#设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通
#过AUTH <password>命令提供密码,默认关闭
requirepass foobared
#只读模式下的slave节点将会拒绝一切写命令,因此,也不会出现因为错误操作在slave中写入数据的可能。
#但是,这不是说,我们可以将一个slave节点暴露给互联网或者不信任的网络客户端,因为,
#管理类的命令如DEBUG,CONFIG命令仍然是可以使用的。但是,我们可以禁用rename-command命令,来提升只读slave节点的安全性。
rename-command CONFIG ""
################################### LIMITS ####################################
#同一时间内最大clients连接的数量,超过数量的连接会返回一个错误信息
maxclients 10000
#配置redis最大使用内存,单位为字节
maxmemory 104857600
#当内存使用达到最大值时,redis使用的数据清除策略。有以下几种可以选择:
1)volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
2)allkeys-lru 利用LRU算法移除任何key
3)volatile-random 移除设置过过期时间的随机key
4)allkeys-random 移除随机ke
5)volatile-ttl 移除即将过期的key(minor TTL)
6)noeviction noeviction 不移除任何key,只是返回一个写错误
# 默认是 maxmemory-policy noeviction
maxmemory-policy volatile-lru
#LRU算法检查的keys个数
maxmemory-samples 5
############################## APPEND ONLY MODE(数据持久化方式) ###############################
#默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。
#但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,
#Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收
#后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件
appendonly no
#aof持久化文件名称,默认是appendonly.aof
appendfilename "appendonly.aof"
#aof持久化向磁盘进行数据刷写的频率,有3个选项
#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
#always表示每次写入都执行fsync,以保证数据同步到磁盘。
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
# appendfsync always
appendfsync everysec
# appendfsync no
#在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,
#执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。
#如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。
#设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。
#Linux的默认fsync策略是30秒。可能丢失30秒数据
no-appendfsync-on-rewrite no
#aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,
#即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。
#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程
auto-aof-rewrite-percentage 100
#设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
auto-aof-rewrite-min-size 64mb
#aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。
#重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加
#上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,
#可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,
#会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以
aof-load-truncated yes
################################ LUA SCRIPTING(Lua脚本) ###############################
#如果达到最大时间限制(毫秒),redis会记个log,然后返回error。当一个脚本超过了最大时限。
#只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀。
lua-time-limit 5000
################################ REDIS CLUSTER(redis 集群) ###############################
#一个正常的redis实例是不能做为一个redis集群的节点的,除非它是以一个集群节点的方式进行启动
#配置redis做为一个集群节点来启动
cluster-enabled yes
#每个集群节点都有一个集群配置文件,这个文件不需要编辑,它由redis节点来创建和更新。每个redis节点的集群配置文件不可以相同。
cluster-config-file nodes-6379.conf
#置集群节点超时时间,如果超过了指定的超时时间后仍不可达,则节点被认为是失败状态,单位为毫秒。
cluster-node-timeout 15000
#一个属于失效的master端的slave,如果它的数据较旧,将不会启动failover。
#现在来讲并没有一个简单的方法去解决如何判定一个slave端的数据的时效性问题,所以可以执行以下两个选择:
#1)、如果有多个slave可用于failover,它们会交换信息以便选出一个最优的进行主从复制的offset,slave端会尝试依据offset去获
#取每个slave的rank,这样在启动failover时对每个slave的利用就与slave端的rank成正比。
#2)、每个slave端和它的master端进行最后交互的时间,这可能是最近的ping或指令接收时间,或自与master端失连的过时时间。
#如果最近的交互时间太久,slave就不会尝试去进行failover。
#第2点可以由用户来进行调整,明确一个slave不会进行failover。自最近一次与master端进行交互,过时时间有一个计算公式:
(node-timeout * slave-validity-factor)+repl-ping-slave-period
#一个比较大的slave-validity-factor参数能够允许slave端使用比较旧的数据去failover它的master端,而一个比较小的值可能会阻止集群去选择slave端。
#为获得最大的可用性,可以设置slave-validity-factor的值为0,这表示slave端将会一直去尝试failover它的master端而不管它与master端的最后交互时间。
cluster-slave-validity-factor 10
# 集群中的slave可以迁移到那些没有可用slave的master端,这提升了集群处理故障的能力。
#毕竟一个没有slave的master端如果发生了故障是没有办法去进行failover的。
#要将一个slave迁移到别的master,必须这个slave的原master端有至少给定数目的可用slave才可以进行迁移,
#这个给定的数目由migration barrier参数来进行设置,默认值为1,表示这个要进行迁移的slave的原master端
#应该至少还有1个可用的slave才允许其进行迁移,要禁用这个功能只需要将此参数设置为一个非常大的值
cluster-migration-barrier 1
# 默认情况下当redis集群节点发现有至少一个hashslot未被covered时将会停止接收查询。
#这种情况下如果有一部份的集群down掉了,那整个集群将变得不可用。
#集群将会在所有的slot重新covered之后自动恢复可用。
#若想要设置集群在部份key space没有cover完成时继续去接收查询,就将参数设置为no
cluster-require-full-coverage yes
################################## SLOW LOG(慢查询日志) ###################################
#慢查询预设阀值,也就是多长时间为慢查询,单位是微妙,这里默认配置为1S
slowlog-log-slower-than 10000
#慢查询日志记录最多存储条数,实际这个慢查询日志是redis使用一个列表记录在内存中
slowlog-max-len 128
################################ LATENCY MONITOR(延迟监控) ##############################
#延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。
#只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIGSET命令动态设置。
latency-monitor-threshold 0
############################# EVENT NOTIFICATION(键空间通知) ##############################
#键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了Redis 数据集的事件。
#因为开启键空间通知功能需要消耗一些 CPU ,所以在默认配置下,该功能处于关闭状态。
#notify-keyspace-events的参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:
#K 键空间通知,所有通知以 __keyspace@__ 为前缀
#E 键事件通知,所有通知以 __keyevent@__ 为前缀
#g DEL 、 EXPIRE 、RENAME 等类型无关的通用命令的通知
#$ 字符串命令的通知
#l 列表命令的通知
#s 集合命令的通知
#h 哈希命令的通知
#z 有序集合命令的通知
#x 过期事件:每当有过期键被删除时发送
#e 驱逐(evict)事件:每当有键因为 maxmemory 政策而被删除时发送
#A 参数 g$lshzxe 的别名
#输入的参数中至少要有一个 K 或者 E,否则的话,不管其余的参数是什么,都不会有任何 通知被分发。
#详细使用可以参考http://redis.io/topics/notifications
notify-keyspace-events ""
############################### ADVANCED CONFIG(内部编码实现) ###############################
#当哈希类型元素个数小于(hash-max-ziplist-entries)512,同时所有值都小于(hash-max-ziplist-value)64时,
#redis使用ziplist作为哈希的内部实现,否则以hashtable实现,ziplist使用更加紧凑结构实现多个元素的连续存储比hashtable节省内存.
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
#列表还以特殊的方式编码,以节省大量的空间。
#当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。
#比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。
#当取负值的时候,表示按照占用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5这五个值,每个值含义如下:
# -5: 每个quicklist节点上的ziplist大小不能超过64 Kb。(注:1kb => 1024 bytes)
# -4: 每个quicklist节点上的ziplist大小不能超过32 Kb。
# -3: 每个quicklist节点上的ziplist大小不能超过16 Kb。
# -2: 每个quicklist节点上的ziplist大小不能超过8 Kb。(-2是Redis给出的默认值)
# -1: 每个quicklist节点上的ziplist大小不能超过4 Kb。
list-max-ziplist-size -2
#这个参数表示一个quicklist两端不被压缩的节点个数。
#注:这里的节点个数是指quicklist双向链表的节点个数,而不是指ziplist里面的数据项个数。
#实际上,一个quicklist节点上的ziplist,如果被压缩,就是整体被压缩的。
#参数list-compress-depth的取值含义如下:
0: 是个特殊值,表示都不压缩。这是Redis的默认值。
1: 表示quicklist两端各有1个节点不压缩,中间的节点压缩。
2: 表示quicklist两端各有2个节点不压缩,中间的节点压缩。
3: 表示quicklist两端各有3个节点不压缩,中间的节点压缩。
依此类推…
#由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。
list-compress-depth 0
#当集合中的元素都是整数且元素个数小于(set-max-intset-entries)52时,redis会使用intset来作为集合的内部实现,否则使用hashtable实现.
set-max-intset-entries 512
#当有序集合的元素个数小于(zset-max-ziplist-entries)128个同时每个元素的值都小于(zset-max-ziplist-value)64时,
#redis会使用ziplist来作为有序集合的内部实现以减少内存消耗,否则使用skiplist实现.
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
#HyperLogLog的值大小小于等于hll-sparse-max-bytes使用稀疏数据结构(sparse),大于hll-sparse-max-bytes使用稠密的数据结构(dense)。
#一个比16000大的value是几乎没用的,建议的value大概为3000。如果对CPU要求不高,对空间要求较高的,建议设置到10000左右
hll-sparse-max-bytes 3000
#Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。
#当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。
#如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes
#客户端类型class有三种:
# normal -> 普通客户端
# slave -> 从客户端,用于复制
# pubsub -> 发布订阅客户端
# 客户端输出缓冲区对应配置规则:
#client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
# hard limit ->客户端使用的输出缓冲区大于hard limit,客户端会被立即关闭
# soft limit ->客户端使用的输出缓冲区大于soft limit 并且持续了soft seconds秒,客户端被立即关闭
# soft seconds->持续时间秒数
#客户端输出缓冲区
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#redis使用一个内部程序来处理后台任务,例如关闭超时的client连接,清除过期的key等等。
#它并不会同时处理所有的任务,redis通过指定的hz参数去检查和执行任务。
#hz默认设为10,提高它的值将会占用更多的cpu,当然相应的redis将会更快的处理同时到期的许多key,以及更精确的去处理超时。
#hz的取值范围是1~500,通常不建议超过100,只有在请求延时非常低的情况下可以将值提升到100。
hz 10
# 当一个子进程要改写AOF文件,如果以下选项启用,那文件将会在每产生32MB数据时进行同步,
#这样提交增量文件到磁盘时可以避免出现比较大的延迟。
aof-rewrite-incremental-fsync yes