# redis 配置文件示例

# 当你需要为某个配置项指定内存大小的时候,必须要带上单位,
# 通常的格式就是 1k 5gb 4m 等酱紫:
#
# 1k  => 1000 bytes
# 1kb => 1024 bytes
# 1m  => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g  => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# 单位是不区分大小写的,你写 1K 5GB 4M 也行

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

# 假如说你有一个可用于所有的 redis server 的标准配置模板,
# 但针对某些 server 又需要一些个性化的设置,
# 你可以使用 include 来包含一些其他的配置文件,这对你来说是非常有用的。
#
# 但是要注意哦,include 是不能被 config rewrite 命令改写的
# 由于 redis 总是以最后的加工线作为一个配置指令值,所以你最好是把 include 放在这个文件的最前面,
# 以避免在运行时覆盖配置的改变,相反,你就把它放在后面(外国人真啰嗦)。
#
# include /path/to/local.conf
# include /path/to/other.conf

################################ 常用 #####################################

# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
# 当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
daemonize no

# 当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面,
# 但是你可以在这里自己制定它的文件位置。
pidfile /var/run/redis.pid

# 监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
port 6379

# TCP 监听的最大容纳数量
#
# 在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。
# Linux 内核会一声不响的把这个值缩小成 /proc/sys/net/core/somaxconn 对应的值,
# 所以你要修改这两个值才能达到你的预期。
tcp-backlog 511

# 默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。
# 你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。
#
# 示例,多个IP用空格隔开:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1

# 指定 unix socket 的路径。
#
# unixsocket /tmp/redis.sock
# unixsocketperm 755

# 指定在一个 client 空闲多少秒之后关闭连接(0 就是不管它)
timeout 0

# tcp 心跳包。
#
# 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。
# 这个之所有有用,主要由两个原因:
#
# 1) 防止死的 peers
# 2) Take the connection alive from the point of view of network
#    equipment in the middle.
#
# On Linux, the specified value (in seconds) is the period used to send ACKs.
# Note that to close the connection the double of the time is needed.
# On other kernels the period depends on the kernel configuration.
#
# A reasonable value for this option is 60 seconds.
# 推荐一个合理的值就是60秒
tcp-keepalive 0

# 定义日志级别。
# 可以是下面的这些值:
# debug (适用于开发或测试阶段)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (适用于生产环境)
# warning (仅仅一些重要的消息被记录)
loglevel notice

# 指定日志文件的位置
logfile ""

# 要想把日志记录到系统日志,就把它改成 yes,
# 也可以可选择性的更新其他的syslog 参数以达到你的要求
# syslog-enabled no

# 设置 syslog 的 identity。
# syslog-ident redis

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

# 设置数据库的数目。
# 默认数据库是 DB 0,你可以在每个连接上使用 select <dbid> 命令选择一个不同的数据库,
# 但是 dbid 必须是一个介于 0 到 databasees - 1 之间的值
databases 16

################################ 快照 ################################
#
# 存 DB 到磁盘:
#
#   格式: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文件
rdbchecksum yes

# 设置 dump 的文件位置
dbfilename dump.rdb

# 工作目录
# 例如上面的 dbfilename 只指定了文件名,
# 但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。
dir ./

################################# 主从复制 #################################

# 主从复制。使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本。
# 注意这个只需要在 slave 上配置。
#
# slaveof <masterip> <masterport>

# 如果 master 需要密码认证,就在这里设置
# masterauth <master-password>

# 当一个 slave 与 master 失去联系,或者复制正在进行的时候,
# slave 可能会有两种表现:
#
# 1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,
#    或者数据可能是空的在第一次同步的时候
#
# 2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,
#    slave 都将返回一个 "SYNC with master in progress" 的错误,
#
slave-serve-stale-data yes

# 你可以配置一个 slave 实体是否接受写入操作。
# 通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的,
# 因为相对从 master 重新同步数而言,据数据写入到 slave 会更容易被删除。
# 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。
#
# 从 redis 2.6 版起,默认 slaves 都是只读的。
#
# 注意:只读的 slaves 没有被设计成在 internet 上暴露给不受信任的客户端。
# 它仅仅是一个针对误用实例的一个保护层。
#
slave-read-only yes

# Slaves 在一个预定义的时间间隔内发送 ping 命令到 server 。
# 你可以改变这个时间间隔。默认为 10 秒。
#
repl-ping-slave-period 10

# 设置主从复制超时时间
#
# 这个值一定要比 repl-ping-slave-period 大
#
repl-timeout 60

# Disable TCP_NODELAY on the slave socket after SYNC?
#
# 如果选择“是”,Redis将使用更少的TCP数据包和更少的带宽向从属服务器发送数据。
# 但这会增加数据在从机端显示的延迟,对于使用默认配置的Linux内核,延迟可达40毫秒。
#
# 如果选择“否”,则从机端显示数据的延迟将减少,但复制将使用更多带宽
#
# 默认情况下,我们会优化低延迟,但在流量非常大的情况下,或者当主节点和从节点之间有很多跳时,将此选项改为“是”可能是个好主意
#
repl-disable-tcp-nodelay no

# 设置主从复制容量大小。这个 backlog 是一个用来在 slaves 被断开连接时
# 存放 slave 数据的 buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步,
# 只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。
#
# 这个值越大,salve 可以断开连接的时间就越长。
#
repl-backlog-size 1mb

# 在某些时候,master 不再连接 slaves,backlog 将被释放。
#
# 如果设置为 0 ,意味着绝不释放 backlog 。
#
# repl-backlog-ttl 3600

# 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,
# 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。
#
# 默认优先级为 100。
slave-priority 100

# 如果连接的从属设备少于N个,且滞后时间小于或等于M秒,则主设备可以停止接受写入。
#
# N个从节点需要处于“在线”状态。
#
# 滞后时间(秒)必须小于等于指定值,根据从机接收的最后一次ping(通常每秒发送一次)计算得出。
#
# 此选项不保证N个复制副本将接受写入,但将在没有足够的从属可用时将丢失写入的曝光窗口限制在指定的秒数内
#
# 例如,要求至少3个滞后时间小于等于10秒的从属设备使用:
#
# min-slaves-to-write 3
# min-slaves-max-lag 10
#
# 将任意一个设置为0将禁用该功能。
#
# 默认情况下,要写入的最小从属对象设置为0(功能已禁用),最小从属对象最大滞后设置为10


################################## 安全 ###################################

# 设置认证密码
# 警告: 由于Redis速度非常快,外部用户可以在一个好的服务器上每秒尝试多达150k个密码。
# 这意味着您应该使用非常强的密码,否则很容易被破解。
#
# requirepass password

# 命令重命名,可以在共享环境中更改危险命令的名称。
# 例如,CONFIG命令可能会被重命名为难以猜测的内容,
# 因此它仍然可以用于内部使用工具,但不可用于普通客户端.
#
# Example:
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# 通过将命令重命名为空字符串,也可以完全终止命令:
# rename-command CONFIG ""
#
# 请注意,重命名命令会导致AOF文件或传输到从属服务器的命令的名称出现问题。
#
rename-command CONFIG ""
rename-command KEYS ""

################################### 限制 ####################################

#
# 最大并发数,受操作系统的文件描述符限制
#
maxclients 10000

# 如果你设置了这个值,当缓存的数据容量达到这个值, redis 将根据你选择的
# eviction 策略来移除一些 keys。
#
# 如果 redis 不能根据策略移除 keys ,或者是策略被设置为 ‘noeviction’,
# redis 将开始响应错误给命令,如 set,lpush 等等,
# 并继续响应只读的命令,如 get
#
# This option is usually useful when using Redis as an LRU cache, or to set
# a hard memory limit for an instance (using the 'noeviction' policy).
#
# WARNING: If you have slaves attached to an instance with maxmemory on,
# the size of the output buffers needed to feed the slaves are subtracted
# from the used memory count, so that network problems / resyncs will
# not trigger a loop where keys are evicted, and in turn the output
# buffer of slaves is full with DELs of keys evicted triggering the deletion
# of more keys, and so forth until the database is completely emptied.
#
# In short... if you have slaves attached it is suggested that you set a lower
# limit for maxmemory so that there is some free RAM on the system for slave
# output buffers (but this is not needed if the policy is 'noeviction').
#
# 最大使用内存
maxmemory 5GB

# 最大内存策略
# 1.noeviction:直接返回错误,不淘汰任何已经存在的redis键
# 2.allkeys-lru:所有的键使用lru算法进行淘汰
# 3.volatile-lru:有过期时间的使用lru算法进行淘汰
# 4.allkeys-random:随机删除redis键
# 5.volatile-random:随机删除有过期时间的redis键
# 6.volatile-ttl:删除快过期的redis键
# 7.volatile-lfu:根据lfu算法从有过期时间的键删除
# 8.allkeys-lfu:根据lfu算法从所有键删除
#
maxmemory-policy volatile-ttl

# 随机采样数
# 默认值为5会产生足够好的结果。10非常接近真实的LRU,但需要更多的CPU。3很快,但不是很准确。
#
maxmemory-samples 5

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

# AOF开关

appendonly no

# AOF文件名 (default: "appendonly.aof")

appendfilename "appendonly.aof"

# AOF频率
# everysec:每秒记录一次
# always:每个命令记录一次,数据安全性最高
#
# appendfsync always
# appendfsync no
appendfsync everysec

# 防止在进行BGSAVE或BGREWRITEAOF时在主进程中调用fsync
#
no-appendfsync-on-rewrite no

# AOF文件重写的条件:达到配置的百分比或配置的绝对值
#
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

################################ LUA SCRIPTING  ###############################

# LUA脚本执行的最大时间限制
#
lua-time-limit 5000

################################ REDIS 集群  ###############################
#
# 启用或停用集群
cluster-enabled yes

# 每个群集节点都有一个群集配置文件。此文件不可手动编辑。
# 它由Redis节点创建和更新。每个Redis群集节点都需要不同的群集配置文件。
# 确保在同一系统中运行的实例没有重叠的群集配置文件名
#
cluster-config-file nodes-6379.conf

# Cluster node timeout是节点必须无法访问才能被视为处于故障状态的毫秒数。
#
cluster-node-timeout 15000


# 如果发生故障的主设备的从属设备的数据看起来太旧,它将避免启动故障转移。
#
# 1) 如果有多个从属设备能够进行故障切换,则它们会交换消息,
# 以便尝试以最佳复制偏移量(处理来自主设备的更多数据)为从属设备提供优势。
# 从属服务器将尝试按偏移量获取其等级,并在故障切换开始时应用与其等级成比例的延迟
#
# 2) 每个从机计算最后一次与其主机交互的时间。这可以是最后一次收到的ping或命令(如果主机仍处于“已连接”状态),
# 也可以是自与主机断开连接以来经过的时间(如果复制链路当前已关闭)。
# 如果最后一次交互太旧,从机根本不会尝试故障切换
#
#   (node-timeout * slave-validity-factor) + repl-ping-slave-period
#
# 因此,例如,如果节点超时时间为30秒,从机有效性系数为10,
# 并且假设默认的repl-ping从机周期为10秒,
# 那么如果从机无法与主机通信的时间超过310秒,它将不会尝试故障切换。
#
# 较大的从属有效性系数可能允许数据太旧的从属设备故障切换到主设备,而太小的值可能会阻止集群选择从属设备
#
# 为了获得最大可用性,可以将从属有效性因子设置为0,这意味着从属设备将始终尝试故障切换主设备,
# 而不管它们上次与主设备交互的时间。(但是,他们总是尝试应用与偏移量等级成比例的延迟)
#
# 零是唯一能够保证当所有分区恢复时集群始终能够继续的值
#
cluster-slave-validity-factor 0

# 集群中每个主节点所需的从属节点数量。
#
cluster-migration-barrier 1

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

# 可以使用两个参数配置慢速日志:
# 一个参数告诉Redis为了记录命令要超过的执行时间(以微秒为单位),
# 另一个参数是慢速日志的长度。记录新命令时,将从记录的命令队列中删除最旧的命令。

# 以下时间以微秒表示,因此1000000相当于1秒。请注意,负数将禁用慢速日志,而零值将强制记录每个命令。
slowlog-log-slower-than 10000

# 这个长度没有限制。请注意,它将消耗内存。您可以使用SLOWLOG RESET回收慢速日志使用的内存。
slowlog-max-len 128

############################# Event notification ##############################

# Redis can notify Pub/Sub clients about events happening in the key space.
# This feature is documented at http://redis.io/topics/keyspace-events
#
# For instance if keyspace events notification is enabled, and a client
# performs a DEL operation on key "foo" stored in the Database 0, two
# messages will be published via Pub/Sub:
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# It is possible to select the events that Redis will notify among a set
# of classes. Every class is identified by a single character:
#
#  K     Keyspace events, published with __keyspace@<db>__ prefix.
#  E     Keyevent events, published with __keyevent@<db>__ prefix.
#  g     Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...
#  $     String commands
#  l     List commands
#  s     Set commands
#  h     Hash commands
#  z     Sorted set commands
#  x     Expired events (events generated every time a key expires)
#  e     Evicted events (events generated when a key is evicted for maxmemory)
#  A     Alias for g$lshzxe, so that the "AKE" string means all the events.
#
#  The "notify-keyspace-events" takes as argument a string that is composed
#  by zero or multiple characters. The empty string means that notifications
#  are disabled at all.
#
#  Example: to enable list and generic events, from the point of view of the
#           event name, use:
#
#  notify-keyspace-events Elg
#
#  Example 2: to get the stream of the expired keys subscribing to channel
#             name __keyevent@0__:expired use:
#
#  notify-keyspace-events Ex
#
#  默认情况下,所有通知都被禁用,因为大多数用户不需要此功能,而且此功能有一些开销。
# 请注意,如果不指定K或E中的至少一个,则不会传递任何事件。
notify-keyspace-events ""

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

# 当Hashes有少量条目,且最大条目不超过给定阈值时,使用内存有效的数据结构对其进行编码。
# 可以使用以下指令配置这些阈值。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

# 与散列类似,小列表也以特殊方式编码,以节省大量空间。
# 仅当您处于以下限制条件下时,才使用特殊编码:
list-max-ziplist-entries 512
list-max-ziplist-value 64

# 当集合由恰好是基数为10的64位有符号整数范围内的整数的字符串组成时。
# 以下配置设置设置集合大小的限制,以便使用此特殊的内存节省编码。
set-max-intset-entries 512

# 与哈希和列表类似,排序集也经过特殊编码以节省大量空间。
# 此编码仅在排序集的长度和元素低于以下限制时使用:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# 一个HyperLogLog实际占用的空间大约是 13684 * 6bit / 8 = 12k 字节。
# 但是在计数比较小的时候,大多数桶的计数值都是零。
# 如果 12k 字节里面太多的字节都是零,那么这个空间是可以适当节约一下的。
# Redis 在计数值比较小的情况下采用了稀疏存储,稀疏存储的空间占用远远小于 12k 字节。
# 相对于稀疏存储的就是密集存储,密集存储会恒定占用 12k 字节。
# 时间换空间的权衡,建议值为~3000
# 但CPU资源充足,但内存紧张时,可以提高到~10000
#
hll-sparse-max-bytes 3000

# 默认情况下,每秒使用此毫秒10次,以便主动重新设置主词典,尽可能释放内存。
# 如果您有硬性延迟要求(2ms内),请使用“activerehashing no”。
# 如果您没有这样严格的要求,但希望尽快释放内存,请使用“activerehashing yes”。
#
activerehashing yes

# 客户端输出缓冲区限制可用于强制断开由于某种原因从服务器读取数据速度不够快的客户端的连接
# (一个常见原因是发布/订阅客户端不能像发布服务器生成消息那样快地使用消息)。
# normal -> normal clients
# slave  -> slave clients and MONITOR clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern
#
# The syntax of every client-output-buffer-limit directive is the following:
#
# 因此,例如,如果硬限制为32兆字节,软限制为16兆字节/10秒,
# 则如果输出缓冲区的大小达到32兆字节,客户端将立即断开连接,
# 但如果客户端达到16兆字节并连续超过限制10秒,客户端也将断开连接
# 默认情况下,普通客户端不受限制,因为它们不会在没有请求的情况下(以推送方式)接收数据,
# 而是在请求之后接收数据,因此只有异步客户端可能会创建这样一种场景,
# 即请求数据的速度快于读取数据的速度。
# 相反,pubsub和从属客户端有一个默认限制,因为订阅者和从属客户端以推送方式接收数据
# 硬限制或软限制都可以通过将其设置为零来禁用。
#
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

# 使用一个内部程序来处理后台任务,例如关闭超时的client连接,清除过期的key等等。
# 它并不会同时处理所有的任务,redis通过指定的hz参数去检查和执行任务。
# hz默认设为10,提高它的值将会占用更多的cpu,当然相应的redis将会更快的处理同时到期的许多key,以及更精确的去处理超时。
# hz的取值范围是1~500,通常不建议超过100,只有在请求延时非常低的情况下可以将值提升到100。
#
hz 10

# 当重写AOF文件时,如果启用以下选项,则文件将每生成32 MB的数据进行fsync同步。
# 这对于以增量的方式将文件提交到磁盘和避免较大的延迟峰值非常有用。
#
aof-rewrite-incremental-fsync yes


Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐