redis配置文件详解

## Generated by install_server.sh ##

# Redis configuration file example.

#

#如果要让redis-server启动时加载该配置文件,需要在启动时

#带上该配置文件,如下:

# ./redis-server /path/to/redis.conf

# Note on units: 如果需要存储空间,将以 1k 5GB 4M 这样的形式书写,

# 如下换算公式:

# 1k => 1000 bytes

# 1kb => 1024 bytes

# 1m => 1000000 bytes

# 1mb => 1024*1024 bytes

# 1g => 1000000000 bytes

# 1gb => 1024*1024*1024 bytes

#

# 1GB 1Gb 1gB 代表相同的意思.

################################## INCLUDES ###################################

# 可以在这里引入多个配置文件.

# 如果使用模板配置所有的服务端,并且个别服务端需要定制

# 这部分功能将非常有用.

# 支持include嵌套.

#

# 但是要注意,include 是不能被 config rewrite 命令改写的

# 由于 redis 总是以最后的加工线作为一个配置指令值

# 所以你最好是把 include 放在这个文件的最前面,

# 以避免在运行时覆盖配置的改变,

# 相反,你就把它放在后面

#

# include /path/to/local.conf

# include /path/to/other.conf

################################## NETWORK #####################################

# 默认情况下,如果没有bind,redis将监听所有接入的访问

# 如果可能的话,监听一个或者多个指定的ip,在bind后面加上要监听的ip即可

#

# Examples:

#

# bind 192.168.1.100 10.0.0.1

# bind 127.0.0.1 ::1

#

# ~~~ WARNING ~~~ 如果Redis Server直接跑在公网上

# bind所有的接口是非常危险的一件事情.

# 所以默认情况下,我们只允许redis监听ipv4的本地回环(localhost)

# 这将意味着只能在同一台机器上的客户端才能接入redis server

#

# 如果你确定你的实例要监听所有的实例

# 只需打开下面的注释

# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

# bind 0.0.0.0

# Protected mode是一层避免外网访问和利用的保护

#

# 当protected mode处于on状态时并且如果:

#

# 1) 服务器不使用bind显式地绑定到一组地址

# 2) 没有配置密码.

#

# 服务器将只能接收localhost的访问

#

# 保护模式,默认开启。如果配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no。

protected-mode yes

# 在指定端口接收连接,默认为 6379 (IANA #815344).

# 如果port为0,这意味着redis将不监听任何端口

port 6379

# TCP listen() backlog.

#

# 在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。

# Linux 内核会一声不响的把这个值缩小成 /proc/sys/net/core/somaxconn 对应的值,

# 所以你要修改这两个值才能达到你的预期。

tcp-backlog 511

# Unix socket.

#指定Unix socket路径以用来监听进来的连接。

#该值没有默认值,如果不指定,redis将不监听socket

#

# unixsocket /tmp/redis.sock

# unixsocketperm 700

# 一个客户端空闲N秒后,将关闭与该客户端的连接 (N为0时将关闭该功能)

timeout 0

# TCP keepalive.(TCP心跳包)

#

# 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。

# 这个之所有有用,主要由两个原因:

#

# 1) 检测挂掉的对端

# 2) 降低中间设备出问题而导致网络看似连接却已经与对端端口的问题

# 1) 检测挂掉的对端。

# 2) 从网络设备的角度使通信在中间过程中alive.

#

# 如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中,设置了keepalive,redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。

#

# 自Redis3.2.1开始,推荐一个合理的值为300秒

#

tcp-keepalive 300

################################# GENERAL #####################################

# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。

# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。

daemonize yes

# 可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的。

# If you run Redis from upstart or systemd, Redis can interact with your

# supervision tree. Options:

#  supervised no      - no supervision interaction

#  supervised upstart - signal upstart by putting Redis into SIGSTOP mode

#  supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET

#  supervised auto    - detect upstart or systemd method based on

#                        UPSTART_JOB or NOTIFY_SOCKET environment variables

# Note: these supervision methods only signal "process is ready."

#      They do not enable continuous liveness pings back to your supervisor.

supervised no

# 如果制定了进程文件,redis将在开始的时候写入并在退出的时候删除该文件

#

# 如果没设置后台守护进程,且没指定pidfile,则没有pid文件被创建

# 如果设置了后台守护进程,则会创建/var/run/redis.pid

# 如果没设置后台守护进程,且指定了pidfile,则以pidfile为准

# 创建pid文件是尽力服务行为,如果创建失败,也并不会产生什么坏的影响,redis仍然会正常启动

# 意思就是如果没创建成功也无所谓不耽误Redis正常启动和运行

#

pidfile /var/run/redis_6379.pid

# 定义日志级别。

# 可以是下面的这些值:

# debug (适用于开发或测试阶段)

# verbose (比debug少点,但是也不少)

# notice (适用于生产环境)

# warning (仅仅一些重要的消息被记录)

loglevel notice

# 指定了记录日志的文件。

# 空字符串的话,日志会打印到标准输出设备。

# 后台运行的redis标准输出是/dev/null。

logfile /var/log/redis_6379.log

# 要想把日志记录到系统日志,就把它改成 yes,

# 也可以可选择性的更新其他的syslog 参数以达到你的要求

# syslog-enabled no

# 指定 syslog 的 identity.

# syslog-ident redis

# 设置syslog的facility,必须是USER或者是LOCAL0-LOCAL7之间的值。

# syslog-facility local0

# 设置数据库的数目。

# 默认数据库是DB0,你可以在每个连接上使用 select 命令选择一个不同的数据库

# 但是 dbid 必须是一个介于0到databasees -1之间的值

databases 16

################################ SNAPSHOTTING  ################################

#

# Save the DB on disk:

#

#  格式  save <间隔时间 (秒)> <写入次数>

#

# 根据给定的时间间隔和写入次数将数据保存到磁盘

#

# 下面的例子的意思是:

# 900 秒内如果至少有 1 个 key 的值变化,则保存

# 300 秒内如果至少有 10 个 key 的值变化,则保存

# 60 秒内如果至少有 10000 个 key 的值变化,则保存

#

# 注意:你可以注释掉所有的 save 行来停用保存功能。

# 也可以直接一个空字符串来实现停用:

#

# save ""

save 900 1

save 300 10

save 60 10000

# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,

# 这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,

# 否则就会没人注意到灾难的发生。

#

# 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。

#

# 然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。

stop-writes-on-bgsave-error yes

# 是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串

# 默认都设为 yes

# 如果你希望保存子进程节省点cpu,你就设置它为 no ,

# 不过这个数据集可能就会比较大

rdbcompression yes

# 是否校验rdb文件

# 从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。

# 这跟有利于文件的容错性,但是在保存rdb文件的时候

# 会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。

rdbchecksum yes

# 设置dump文件的名字

dbfilename dump.rdb

# 工作目录.

#

# 例如上面的 dbfilename 只指定了文件名,

# 但是它会写入到这个目录下。

#

# The Append Only File 也将被创建在这个目录下.

#

# 这个配置项一定是个目录,而不能是文件名。

dir /var/lib/redis/6379

################################# REPLICATION #################################

# 主从复制

# Master-Slave replication. Use slaveof to make a Redis instance a copy of

# another Redis server. A few things to understand ASAP about Redis replication.

#

# 1) Redis replication is asynchronous, but you can configure a master to

#    stop accepting writes if it appears to be not connected with at least

#    a given number of slaves.

# 2) Redis slaves are able to perform a partial resynchronization with the

#    master if the replication link is lost for a relatively small amount of

#    time. You may want to configure the replication backlog size (see the next

#    sections of this file) with a sensible value depending on your needs.

# 3) Replication is automatic and does not need user intervention. After a

#    network partition slaves automatically try to reconnect to masters

#    and resynchronize with them.

#

# 复制选项,slave复制对应的master。

# slaveof

# 如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。

#

# masterauth

# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:

# 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 重新同步数而言,据数据写入到 slave 会更容易被删除。

# 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。

#

# 从 redis 2.6 版起,默认 slaves 都是只读的。

#

#  注意:只读的 slaves 没有被设计成在 internet 上暴露给不受信任的客户端。

# 它仅仅是一个针对误用实例的一个保护层。

# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve

# security of read only slaves using 'rename-command' to shadow all the

# administrative / dangerous commands.

slave-read-only yes

# Replication SYNC strategy: disk or socket.

#

# -------------------------------------------------------

# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY

# -------------------------------------------------------

#

# 是否使用diskless方式复制数据。

# 目前redis复制提供两种方式,disk-back和diskless。

# 如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:

# disk-back方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。

# diskless方式是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。diskless的方式就的一个个slave顺序复制。

# 在磁盘速度缓慢,网速快的情况下推荐用diskless方式。

repl-diskless-sync no

#diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。

repl-diskless-sync-delay 5

# slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认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

# 是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。

# 如果选择no,数据复制到slave上的延迟将降低,但是这需要更高的带宽

# 默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。

repl-disable-tcp-nodelay no

# 设置主从复制容量大小。

# 这个 backlog 是一个用来在 slaves 被断开连接时用来保存最新复制的命令。

# 这样在slave离线的时候,不需要完全复制master的数据,

# 如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。

# 缓冲区的大小越大,slave离线的时间可以更长,

# 复制缓冲区只有在有slave连接的时候才分配内存。没有slave的

# 一段时间,内存会被释放出来,默认1m。

# repl-backlog-size 1mb

# master没有slave一段时间会释放复制缓冲区的内存,

# repl-backlog-ttl用来设置该时间长度。单位为秒。

# repl-backlog-ttl 3600

# 当master不可用,Sentinel会根据slave的优先级选举一个master。

# 优先级值越小的slave,当选master。而配置成0,永远不会被选举。

# 默认优先级为 100.

slave-priority 100

# redis提供了可以让master停止写入的方式,

# 如果配置了min-slaves-to-write,健康的slave的个数小于N,mater就禁止写入。

# master最少得有多少个健康的slave存活才能执行写命令。

# 这个配置虽然不能保证N个slave都一定能接收到master的写操作,

# 但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。

# 设置为0是关闭该功能。

#

# 例如至少需要三个slave 延迟小于等于10s才认为是一个健康的集群  如下设置:

#

# min-slaves-to-write 3

# min-slaves-max-lag 10

#

# 默认将min-slaves-to-write设置为 0 (关闭该功能) 并且将

# 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 ###################################

# requirepass配置可以让用户使用AUTH命令来认证密码,才能使用其他命令。

# 这让redis可以使用在不受信任的网络中。

# 为了保持向后的兼容性,可以注释该命令,因为大部分用户也不需要认证。

# 使用requirepass的时候需要注意,

# 因为redis太快了,每秒可以认证15w次密码,简单的密码很容易被攻破,

# 所以最好使用一个更复杂的密码。

# requirepass foobared

#

# 把危险的命令给修改成其他名称。

# 比如CONFIG命令可以重命名为一个很难被猜到的命令,

# 这样用户不能使用,而内部工具还能接着使用。

#

# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

#

# 设置成一个空的值,可以禁止一个命令

#

# rename-command CONFIG ""

#

#注意,修改命令的名字会被记录到AOF文件或者发送给slave,这可能会引发问题

#

################################### LIMITS ####################################

# 设置能连上redis的最大客户端连接数量。默认是10000个客户端连接。由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等,所以maxclients最小建议设置到32。如果超过了maxclients,redis会给新的连接发送’max number of clients reached’,并关闭连接。

# maxclients 10000

# redis配置的最大内存容量。如果你设置了这个值,当缓存的数据容量达到这个值, redis 将根据你选择的

# eviction 策略来移除一些 keys。

#

# 如果 redis 不能根据策略移除 keys ,或者是策略被设置为 ‘noeviction’,

# redis 将开始响应错误给命令,如 set,lpush 等等,

# 并继续响应只读的命令,如 get

#当内存满了,需要配合maxmemory-policy策略进行处理。注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完,建议设置的maxmemory需要更小一些。

# maxmemory

# MAXMEMORY POLICY: 内存容量超过maxmemory后缓存移除策略(五个)

# how Redis will select what to remove when maxmemory

# is reached. You can select among five behaviors:

#

#volatile-lru:利用LRU算法移除设置过过期时间的key。

#volatile-random:随机移除设置过过期时间的key。

#volatile-ttl:移除即将过期的key,根据最近过期时间来删除(辅以TTL)

#allkeys-lru:利用LRU算法移除任何key。

#allkeys-random:随机移除任何key。

#noeviction:不移除任何key,只是返回一个写错误。

#上面的这些驱逐策略,如果redis没有合适的key驱逐,对于写命令,还是会返回错误。redis将不再接收写请求,只接收get请求。写命令包括:set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。

#

# 默认是:

#

# maxmemory-policy noeviction

#lru检测的样本数。使用lru或者ttl淘汰算法,从需要淘汰的列表中随机选择sample个key,选出闲置时间最长的key移除。

#

# 关于LRU算法:

# 5产生的结果足够好。10的结果最真实但是需要付出更多的CPU作为成本。

# 3非常快,但是结果非常不准去

#

# maxmemory-samples 5

############################## APPEND ONLY MODE ###############################

#默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。

appendonly no

# aof文件名

appendfilename "appendonly.aof"

#aof持久化策略的配置

#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。

#always表示每次写入都执行fsync,以保证数据同步到磁盘。

#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。dis-persistence-demystified.html

#

# 如果不确定,选择"everysec".

# appendfsync always

appendfsync everysec

# appendfsync no

# 在aof重写或者写入aof文件的时候,会执行大量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)时,自动启动新的日志重写过程。

# 如果将百分比指定为0,则表示关闭该功能

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  ###############################

# 如果达到最大时间限制(毫秒),redis会记个log,然后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀。

lua-time-limit 5000

################################ REDIS CLUSTER  ###############################

#

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however

# in order to mark it as "mature" we need to wait for a non trivial percentage

# of users to deploy it in production.

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#

# 集群开关,默认是不开启集群模式。

#

# cluster-enabled yes

#集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突

#

# cluster-config-file nodes-6379.conf

# 节点互连超时的阀值。集群节点超时毫秒数

#

# cluster-node-timeout 15000

#在进行故障转移的时候,全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了,导致数据过于陈旧,这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是:

#比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period

#如果节点超时时间为三十秒, 并且slave-validity-factor为10,假设默认的repl-ping-slave-period是10秒,即如果超过310秒slave将不会尝试进行故障转移

# cluster-slave-validity-factor 10

#master的slave数量大于该值,slave才能迁移到其他孤立master上,如这个参数若被设为2,那么只有当一个主节点拥有2 个可工作的从节点时,它的一个从节点会尝试迁移。

#

# cluster-migration-barrier 1

# 默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。

# cluster-require-full-coverage yes

################################## SLOW LOG ###################################

# slog log是用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slog log保存在内存中,所以没有IO操作。

# 执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。

slowlog-log-slower-than 10000

# 慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。

slowlog-max-len 128

################################ LATENCY MONITOR ##############################

# 延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。单位毫秒。

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

#

# 比如想订阅key的过期通知,就设成Ex,E表示key的事件,x表示key过期事件

# 默认情况下键空间通知都是关闭因为用户通常不需要这项功能

#  并且这项功能将产生额外开销

# 注意在使用的时候至少带上K或者E,否则事件将不会被报告

notify-keyspace-events ""

############################### ADVANCED CONFIG ###############################

# 数据量小于等于hash-max-ziplist-entries的用ziplist

# 大于hash-max-ziplist-entries用hash

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

# 为了节省存储空间,Lists也用一种特别的方式进行编码

# 每个内部列表节点允许的条目数可以指定为一个固定的最大大小或最大数量的元素。

# 对于一个固定的最大大小,使用- 5 - -1 ,表示:

# -5: max size: 64 Kb  <-- 不推荐用于正常工作负载

# -4: max size: 32 Kb  <-- 不推荐

# -3: max size: 16 Kb  <-- 不推荐

# -2: max size: 8 Kb  <-- good

# -1: max size: 4 Kb  <-- good

# 正数意味着每列节点元素能够最多存储_exactly_个

# 最高表现的选项通常是- 2(8 KB大小)或- 1(4 KB大小)

# 但如果您的用例是唯一的,调整设置必要。

list-max-ziplist-size -2

# 这个参数表示一个quicklist两端不被压缩的节点个数。

# 列表也可以被压缩

#在quicklist的源码中提到了一个LZF的压缩算法,该算法用于对quicklist的节点进行压缩操作。

# list的设计目的是能够存放很长的数据列表,当列表很长时,必然会占用很高的内存空间,

# 且list中最容易访问的是两端的数据,中间的数据访问率较低,

# 于是就可以从这个出发点来进一步节省内存用于其他操作:

# 0 特殊值,表示不压缩

# 1 表示quicklist两端各有一个节点不压缩,中间的节点压缩

# 2 表示quicklist两端各有两个节点不压缩,中间的节点压缩

# 3 表示quicklist两端各有三个节点不压缩,中间的节点压缩

# 以此类推。

# 由于0是个特殊值,很容易看出quicklist的头节点和尾节点总是不被压缩的,以便于在表的两端进行快速存取。

list-compress-depth 0

# 数据量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。

set-max-intset-entries 512

# 数据量小于等于zset-max-ziplist-entries用ziplist,大于zset-max-ziplist-entries用zset。

zset-max-ziplist-entries 128

# value大小小于等于zset-max-ziplist-value用ziplist,大于zset-max-ziplist-value用zset。

zset-max-ziplist-value 64

#value大小小于等于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

#对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。

#对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。

client-output-buffer-limit normal 0 0 0

#对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。

client-output-buffer-limit slave 256mb 64mb 60

# 对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。

client-output-buffer-limit pubsub 32mb 8mb 60

# redis会调用一些内部功能来做一些后台任务,比如关闭超时的客户端连接,清理过期的key等等

# 并不是所有的任务都以相同的频率被执行,redis通过hz的值为频率检查任务的执行

# redis执行任务的周期为1s除以hz。

# 频率范围为1~500,但是一般来讲100以上就不推荐。大多数用户用户应该使用默认值10

# 100以上一般是在非常低延迟的环境中使用

hz 10

# 在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,

# 系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。

aof-rewrite-incremental-fsync yes

推荐阅读更多精彩内容