redis-配置文件详解

单位

1k=1000 bytes
1kb=1024 bytes
1m= 1000000 bytes
1mb= 10241024 bytes
1g= 1000000000 bytes
1gb= 1024
1024*1024 bytes

大小写不敏感,1GB 1Gb 1b是相同的。

包含

包含文件可以包含其他文件。

include选项不能被“config rewrite”命令重写。因为最后一个配置文件的配置胜出,所以最好把包含文件放在开头,避免被重写;

如果习惯用包含文件来重写配置,那最好把配置文件放在最后一排。

include /path/to/local.conf
include /path/to/other.conf

模块

启动时启用模块。如果服务器不能启动模块,就会终止。可以使用多个loadmodule指令。

loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so

网络

服务的地址是多少?

默认情况下,如果不指定bind指令,redis监听来自所有服务器可用的网络接口。可以使用bind指令接一个或多个IP来指定一个或多个网络接口。

bind 192.168.1.100 10.0.0.1
bind 127.0.0.1 ::1

警告:如果运行着的redis直接暴露在公网上,绑定到所有的网络接口是很危险的,并把该实例开放给了网络上的所有人。所以默认取消注释下面这条bind指令,迫使redis只监听IPv4回环接口地址(表明只接受相同电脑的连接)。

如果确定监听所有的网络接口,注释掉下面这行:

bind 127.0.0.1

是否开启保护模式?

保护模式是一层安全保护,为了避免redis实例直接暴露在网*问和利用:

如果保护模式开启并且假设:

  1. 服务器没有用bind指令显示绑定一些地址。
  2. 没有配置密码。

服务器只接受IPv4和IPv6回环地址127.0.0.1,::1和Unix域socket。

保护模式默认是开启的。只有在允许其他主机的客户端连接Redis,即使没有授权和显示使用bind指令指定一些接口的情况下,才应该禁用它。

protected-mode no

服务的端口是多少?

在指定端口接收连接,默认是6379。如果端口为0则Redis不会监听TCP套接字。

port 6379

TCP连接队列设置为多少合适?

在高QPS环境中,需要一个大的连接队列来避免慢客户端的连接问题。注意Linux内核会悄悄地把它截断为/proc/sys/net/core/somaxconn的值,所以确保同时提高了somaxconn和tcp_max_syn_backlog来达到预期效果。

tcp-backlog 511(注:2^9-1)

真的需要监听Uninx套接字?

指定Unix用来监听入站连接的套接字路径。没有默认值,所以Redis在没有指定时不会监听unix套接字。

unixsocket /tmp/redis.sock
unixsocketperm 700(注:权限)

多长时间不联系,就关闭客户端?

在客户端N秒处于闲置状态时关闭连接(0表示禁用该功能)

timeout 0

确认客户端是否在线的心跳间隔是多少?

如果非0,在缺乏通信时,使用SO_KEEPALIVE来发送TCP ACKs给客户端。有下列两个方面的好处:

  1. 检测挂掉的主机
  2. 从中间网络设备的角度激活连接

在Linux中,这个指定的值(单位秒)是用来发送ACKs的间隔。注意,关闭连接需要两倍的这个时间。其他内核上面,这个间隔取决于内核配置。

一般的设定是300秒,这是版本3.2.1开始Redis启动时的默认值。

tcp-keepalive 300

常用

服务是个守护进程吗?

Redis默认不以守护进程运行。如果需要设置为"yes"。注意Redis已守护方式启动时会写入一个pid文件/var/run/redis.pid

daemonize no

以何种方法监控服务运行状态?

如果Redis从upstart或systemd运行,Redis可以和监控树交互。选项:

  • no 没有监控交互
  • upstart 通过放入Redis到SIGSTOP模式来通知upstart
  • systemd 通过写入READY=1到$NOTIFY_SOCKET来通知systemd
  • auto 根据环境变量UPSTART_JOB或NOTIFY_SOCKET来判断时upstart还是systemd方法

注意:这些监控方法仅通知"进程已经准备好"。它们不能通知连续的活跃度ping到监控者。

supervised no

进程文件应该放在何处?

如果不指定pid文件时,Redis启动时指定一个并在退出时删除。

当服务器以非守护模式运行时,如果没有配置pid文件,将不会创建pid文件。当服务器以守护模式启动时,即使没有指定pid文件,也会创建一个,默认是"/var/run/redis.pid"。

最好创建一个pid文件:如果Redis不能创建这个文件,也不会怎么样,如武器也会正常启动和运行。

pidfile /var/run/redis_6379.pid

打印什么级别的日志?

指定服务器日志级别。
可以是以下的一个:

  • debug(最多)
  • verbose
  • notice
  • warning(最少)
loglevel notice

日志文件名是什么?

指定log文件名称。空字符串可以迫使Redis打印日志到标准输出。注意如果使用标准输出日志并且守护化,日志会被发送到/dev/null。

logfile ""

日志需要打印到系统?

开启日志到系统打印器,只需设置"syslog-enabled"为yes,然后配置其他syslog参数来满足需求。

syslog-enabled no

打印到系统日志的身份是什么?

指定syslog身份

syslog-ident redis

系统日志的设施是什么?

指定syslog设施。必须是USER或LOCAL0-LOCAL7之间。

syslog-facility local0

有几个数据库合适呢?

设置数据库的数量。默认数据库是DB 0,可以使用SELECT <dbid>在一个连接上选择不同的数据库,其中dbid的值在0和’databases’-1之间。

databases 16

真的要打印logo吗?

默认情况下,Redis只有在打印日志到标准输出并且标准输出是TTY时才显示ASCII艺术logo。总的来说这意味着正常情况下只有在交互会话中才显示logo。

然而,可以强制4.0以前的版本有这个行为,通过设置下面的选项为yes,使Redis总是在启动日志中显示ASCII艺术logo。

always-show-logo yes

快照

需要保存快照吗?如果需要,以什么频率保存呢?

保存DB到磁盘:

save <seconds> <changes>

当给定的秒数和给定的写入操作数同时发生时,保存DB。
下面的例子,这些行为会触发保存:

  • 900s(15min)之内有1个key改变
  • 300s(5min)之内有10个key改变
  • 60s之内至少有10000个key改变

可以通过注释所有的save行来完全禁用所有的保存操作。

也可以通过添加一个保存指令接单个空字符串参数来移除之前所有的save点。比如下面这个例子:

save “”

save 900 1
save 300 10
save 60 10000

如果保存快照出了问题,是否停止服务呢?

默认情况下,Redis会停止接收写入,如果RDB快照开启(至少有一个保存点)并且最近的后台保存失败了。这会让用户意识到数据没有正确地持久化,否则没有人意识到改变(redis停止接收),灾难将会发生。

如果后台保存进程再次开始工作,Redis将会自动地允许写入。

然而,如果已经建立了合适的Redis服务器监控和序列化,可以禁止这个特征,让Redis能够照常工作,即使磁盘,权限等出了问题。

stop-writes-on-bgsave-error yes

需不需要压缩快照呢?

是否在保存.rdb数据库时使用LZF算法压缩字符串对象?

默认设置为yes因为这总是好的。

如果想在保存时节省一些CPU,把它设置为no,但这样数据库将会比较大,如果有一些可压缩的值或键的情况。

rdbcompression yes

要校验快照文件么?

版本5开始,RDB文件末尾会放置一个CRC64校验。使得该格式更能抵抗中断,但是在保存和加载RDB文件时会有性能消耗(大约10%),但是可以禁用这个功能来获取最大的性能。

校验禁用时创建的RDB文件有一个0的检验,表示加载程序跳过校验。

rdbchecksum yes

快照起个什么名好呢?

保存DB的文件名

dbfilename dump.rdb

快照放在什么地方合适呢?

工作目录

DB文件会写到这个目录,文件名有上面的dbfilename指令指定。

一个只能增加的文件在这个目录创建。

注意必须指定一个目录,而不是文件名。

dir ./

复制

我是不是一个复制?

主从复制。使用replicaof指令使一个Redis实例作为另一个Redis服务的复制。理解关于Redis复制的ASAP的一些点。

  1. Redis复制是异步的,但是可以设置一个主服务器停止接收写入,如果没有足够给定数量的从服务器连接。
  2. Redis从服务器可能在短时间和主服务器断开后进行部分再同步。可以配置从服务器的backlog大小为一个合理的值以满足需要。
  3. 复制过程是自动的并且不需要用户干预。网络分区后,从服务器自动重连主服务器并且再同步。
replicaof <masterip> <masterport>

如果主服务器有密码保护,需要告诉从服务器来复制同步之前先验证,否则主服务器会拒绝从服务器请求。

母体的密码是多少?

masterauth <master-password>

如果复制出错,应该继续用老数据服务吗?

当从服务器断开了和主服务器的连接,或复制还在进行,从服务器有两种方式的行为:

  1. 如果replica-serve-stale-data设置为’yes’(默认),从服务器继续应答客户端请求,可能是过期数据,或空数据集如果是第一次同步的话。
  2. 如果replica-serve-stale-data设置为’no’,对于大部分命令,从服务器应答错误“正在进行和主服务器同步”,除了INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB,
    COMMAND, POST, HOST 和 LATENCY。
replica-serve-stale-data yes

只读还是可写?

可配置从服务器实例接收写入还是不接收写入。写入一些短暂的数据到从服务器是有用的(因为写入从服务器的数据在和主服务器同步后容易检测出来),但可能导致问题如果客户端由于错误配置而写入数据。

所以Redis2.6之后,从服务器默认只读。

注意:只读从服务器并不是设计来暴露给互联网上不信任的客户端。它是防止错用从服务器的保护层。同时从服务器默认暴露所以管理命令,比如CONFIG, DEBUG, 和其他。可使用’rename-command’来隐蔽管理/危险命令,提高从服务器的安全程度。

replica-read-only yes

应该以什么方式复制呢?

复制SYNC策略:磁盘还是套接字

警告:去磁盘复制目前在实验阶段。

新的或重连的从服务器不能继续只接受改变的进程,而需要进行“完全同步”。一个RDB文件从主服务器传输到从服务器。传输可通过两种方式进行:

  1. 磁盘支持:主服务器创建一个新的进程写入RDB文件到磁盘。然后,文件通过父进程逐渐传输给从服务器。
  2. 去磁盘:主服务器创建一个新进程直接写入RDB文件到从服务器套接字,无须磁盘参与。

采用磁盘支持复制时,一旦开始生成RDB文件,更多的从服务器可以加入队列,只要产生RDB文件的子进程一完成它的工作,就开始传输RDB文件。采用去磁盘复制时,一旦传输开始,新到达的从服务器会放入队列,当前传输结束时,才开始新的传输。

采用去磁盘复制时,主服务器在开始传输前,等待一个可配置的时间(单位s),希望多个从服务器到达,并行传输。

在慢磁盘和快(高带宽)网络环境中,去磁盘复制表现更好。

repl-diskless-sync no

应该等待多长时间,才开始复制呢?

开启采用去磁盘复制后,可以配置服务器等待通过socket传输RDB文件到从服务器的子进程开始的延迟时间。

这非常重要,因为一旦传输开始,将不能服务新来的从服务器,服务器被加入到下次传输的队列,所以服务器等待一个延迟是为了让更多从服务器到来。

这个延迟的单位是秒,默认是5s。禁用这个功能只需把它设置为0,传输就会尽快进行。

repl-diskless-sync-delay 5

应该多长时间发送一次PING?

从服务器以预定义间隔发送PING到服务器。通过repl_ping_replica_period选项改变这个间隔。默认值是10s。

repl-ping-replica-period 10

多长时间不联系就超时了?

下面的选项为服务器设置超时:

  1. 从服务器同步时大容量传输I/O
  2. 从服务器看主服务器的超时(数据,ping)
  3. 主服务器看从服务器的超时(replconf ack ping)

一定要确保这个值比repl-ping-replica-period要大,否则的话,每次网络慢时都会检测到一个超时。

repl-timeout 60

允许带延迟发送数据吗?

在同步之后禁用从服务器套接字的TCP_NODELAY?

如果选择yes,Redis会使用更少数量的TCP包和更少的带宽来发送数据到从服务器。但是这会增加数据到达从服务器的延迟,最高40毫秒,根据Linux内核的默认配置。

如果选择no,数据到达从服务器的延迟会减少,但是复制会使用更多的带宽。

默认情况下,我们优化低延迟,但是在极高的流量情况下或主服务器和从服务器有太多跳数(经过的路由器个数)时,置为yes可能是个好主意。

repl-disable-tcp-nodelay no

连接队列多大合适呢?

设置复制backlog大小。backlog是一个收集断开连接的从服务器的缓冲,所以当一个从服务器再次重连时,通常不需要完整的再同步,但是部分再同步是必须的,只需传递从服务器断开连接时的部分数据即可。

复制backlog的值越大,从服务器断开连接和之后进行部分再同步的时间越长。

backlog只在最少有一个从服务器连接时分配。

repl-backlog-size 1mb

多长时间不连接主服务器,主服务器的连接队列就释放了呢?

当主服务器一段时间没有从服务器连接时,backlog会被释放。下面的选项配置了释放backlog缓冲所需时间的秒数,从最后一个从服务器断开连接时开始计算。

注意从服务器不会因为超时而释放backlog,因为它们后面可能被提升为主服务器,并且能够正确地部分再同步从服务器,所以它们应该总是积累backlog。

0代表永远不会释放backlog。

repl-backlog-ttl 3600

是否有更高的优先级变成主服务器呢?

从服务器优先级,用来给哨兵选择主服务器。值越小优先级越高。为0时永远不会被选为主服务器。默认是100。

replica-priority 100

具备什么条件才能接收写入?

控制主服务器停止接收写入的条件:少于N个从服务器连接,在小于或等于M秒的间隔内。N个从服务器必须在线。间隔的单位为秒,必须<=M,从最后一次ping收到算起,一般ping每秒发送一次。

min-replicas-to-write 3
min-replicas-max-lag 10

设置任一个为0表示禁用这个功能。

默认min-replicas-to-write为0(功能禁用)并且min-replicas-max-lag设置为10。

对外的主机和端口是多少呢?

主节点可以列出关联的从服务器的地址和端口,比如“INFO replication”,“ROLE”命令。默认情况下IP和端口可以通过下面方式获取:

  1. IP:检测socket用于连接主服务器的地址
  2. 端口:从服务器用来建立复制握手的端口,通常也被用来监听连接

然而,当使用NAT,从服务器会通过其他的IP和端口来访问。下列两个选项可以指定从服务器报告给主服务器的IP和端口,同时INFO和ROLE也能报告这些值。

replica-announce-ip 5.5.5.5
replica-announce-port 1234

安全

我的密码?

requirepass foobared

如何重命名命令?

rename-command CONFIG ""

客户端

最多多少客户端能连接我?

maxclients 10000

内存管理

我能占用最多多少内存?

maxmemory <bytes>

如果内存不够了,该怎么办?

  • volatile-lru 使用近似LRU移除有过期时间的键
  • allkeys-lru 使用近似LRU移除键
  • volatile-lfu 使用近似LFU移除有过期时间的键
  • allkeys-lfu 使用近似LFU移除键
  • volatile-random 随机移除一个有过期时间的键
  • allkeys-random 随机移除一个键
  • volatile-ttl 移除即将过期的键
  • noeviction 不移除任何键,在写入时返回一个错误

LRU=Least Recently Used
LFU=Least Frequently Used

maxmemory-policy noeviction

该采集多少样本来应用算法?

maxmemory-samples 5

是否忽略最大内存限制?
默认情况下,先在主服务器移除键,然后同步到从服务器,所以默认为yes。

replica-ignore-maxmemory yes

惰性释放

用户有两种方式移除键:

  • DEL(同步)
  • UNLINK、FLUSHALL和FLUSHDB(ASYNC)(异步)

非用户移除键的情景(默认同步):

  1. 内存限制
  2. 过期
  3. RENAME、SET覆盖原有的键
  4. 和主服务器同步数据时先删除整个数据库

上述情景默认是同步的(类似DEL),可以配置成异步的(类似UNLINK):

lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no

只增模式

打开只增模式?
如果开启AOF,Redis开启时会加载AOF文件,该文件有更好的持久化保证。

appendonly no

只增文件的名称是什么?

appendfilename "appendonly.aof"

是否强制同步?

  • no 不强制同步,OS决定flush时刻。更快
  • always 每次都写到文件。慢但安全
  • everysec 每秒一次。折中
appendfsync everysec

当BGSAVE或BGREWRITEAOF运行时,是否阻止fsync()进行?
当保存子进程运行时,等效于"appendfsync no"。
如果有延迟方面的问题,置为yes。但从持久化的角度看,置为no是最安全的。

no-appendfsync-on-rewrite no

是否自动重写AOF?
Redis记住上次重写后的AOF文件大小(如果没有重写过,就是启动时AOF的大小),把当前大小和基本大小比较,如果超过指定的百分比,就开始重写。同样需要指定一个最小重写大小,避免百分比到达之后,文件依然很小。

把百分比指定为0禁用AOF自动重写功能。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

发现AOF截断之后是报错退出还是尽可能加载更多数据?

通常Redis运行崩溃会发生AOF截断。

如果设置为yes,服务器启动时加载截断的AOF,并发送通知给用户。如果设置为no,服务器启动时报错退出,用户需要用“redis-check-aof”修复AOF才能启动。

如果程序运行过程中发现截断,程序依然会报错退出。该选项只在加载AOF时发现异常才起作用。

aof-load-truncated yes

是否使用RDB前言?

AOF文件中的RDB前言用于更快的写入和恢复。

选项打开后,AOF文件分为两部分:【RDB file】【AOF tail】

加载时发现AOF文件以“REDIS”开头,加载前置RDB文件,然后继续加载AOF结尾。

aof-use-rdb-preamble yes

LUA脚本

Lua脚本的大部分执行时间是毫秒级的。

如果超过最大脚本执行时间,会应答错误。

如果脚本执行超过最大执行时间,有两种处理方式:

  • SCRIPT KILL 用于未调用写入命令
  • SHUTDOWN NOSAVE 用于关闭服务器,即使有写入命令

设置为0或负数表示无限制执行时间,不发出警告。

lua-time-limit 5000

集群

是否是集群节点?

通常Redis实例不能成为集群的一部分,那些以集群节点启动的除外。

cluster-enabled yes

集群配置文件名称是什么?

每个集群节点有一个集群配置文件。给节点自己用的,不用于手动编辑。每个集群节点需要一个不同配置文件。确保没有和系统其他集群配置文件冲突。

cluster-config-file nodes-6379.conf

不可用超时时间是多少?

超过这个时间不可用,是失败状态。

很多其他内部时间限制是这个时间的几倍。

cluster-node-timeout 15000

故障转移的有效因子

如果数据太旧,失败主服务器的从服务器避免开始故障转移。

检测数据年龄没有简单的办法,所以会进行下面两个检查:

  1. 如果有多个从服务器要故障转移,它们会交换消息以确认最佳复制偏移(同步更多主服务器数据)的从服务器。从服务器根据它们的偏移分等级,并把开始故障转移的延迟比例作用于它们的级别。
  2. 每个从服务器计算最后和主服务器交互的时间。可以是最后一次ping或命令(主服务器依然处于连接状态),也可以是从主服务器断开连接到现在的时间间隔(如果复制连接最近挂掉的话)。如果最后的交互太旧的话,从服务器将不会尝试故障转移。

第二点可以由用户调整。特别地,从服务器不会进行故障转移,如果从最后一次和主服务器交互而流逝的时间大于:

(node-timeout * replica-validity-factor) + repl-ping-replica-period

比如如果node-timeout是30s,replica-validity-factor是10,并假设默认的repl-ping-replica-period是10s,从服务器不会尝试故障转移如果它超过310s不能和主服务器交流。

太大的replica-validity-factor会使携带太旧数据的从服务器故障转移到主服务器,而太小的值会阻止集群选举一个从服务器。

为了最大的可用性,可以把replica-validity-factor设置为0,这意味着,从服务器总是会故障转移到主服务,不论最后一次和主服务器交互的时间是多少。(然而,从服务器总是会作用一个延迟比例到它们的偏移等级)。

0是唯一保证所有分区恢复后集群能继续运行的值。

cluster-replica-validity-factor 10

至少有几个从服务器才能进行故障转移?

集群从服务器可以转移到孤儿主服务器上,就是那些没有从服务器的主服务器。这提高了集群抵抗失败的能力,因为如果没有从服务器的话,一个孤儿主服务器不能故障转移。

从服务器转移到孤儿主服务器时,要至少有给定数量的从服务器才行。这个给定数量就是“转移障碍”。转移障碍为1意味着从服务器所连的主服务器至少有一个其他的从服务器才会转移,以此类推。它通常反映了一个集群中每个主服务器的从服务器数量。

默认是1(从服务器只有当主服务器至少保留一个从服务器才转移)。要禁用转移,把它设置为很大的值就好了。0只有在调试时才有用,生产环境很危险。

cluster-migration-barrier 1

如果有插槽不可用,集群是否继续服务?

默认集群节点如果检测到有一个插槽不可用(没有节点服务它),会停止接收查询。这样的话,如果集群部分挂掉(比如一系列插槽不可用),整个集群最终也不可用。只要所有的插槽恢复可用,集群将自动可用。

然而,有些时候集群部分工作时依然能够继续接收查询,因为核心插槽还可用。为了这么做,把cluster-require-full-coverage选项设置为no。

cluster-require-full-coverage yes

主服务器挂掉之后,从服务器是否进行故障转移?

该选项设置为yes时,会阻止主服务器挂掉之后,从服务器进行故障转移。然后,主服务器依然可以进行手动故障转移,如果强制这么做的话。

这在不同的场景中有用,尤其是多个数据中心的情况下,如果不是完整的DC失败,一边永远不会被晋升。

cluster-replica-no-failover no

集群DOCKER/NAT支持

某些场景下,Redis集群节点地址发现失败,因为地址时NAT过的或端口转发了(典型的例子是Docker和其他容器)。

为了让集群在这些场景工作,静态配置让每个节点知道它的公网地址是必须的。下面的选项用在这个场景中:

  • cluster-announce-ip
  • cluster-announce-port
  • cluster-announce-bus-port

指定了节点的地址,客户端端口和集群消息总线端口。这些信息发布到总线消息包的头部,以便于其他的节点能够修正映射该节点的信息。

如果上面的选项没有使用,正常的Redis集群自动检测就会使用。

重新映射端口时,总线端口比客户端端口有个固定偏移+10000,所以可以指定任何端口和总线端口,取决于它们是怎么映射的。如果总线端口没有设置,通常会使用10000的固定偏移。

cluster-announce-ip 10.1.1.5
cluster-announce-port 6379
cluster-announce-bus-port 6380

慢日志

Redis慢日志是一个打印执行时间超出特定值的命令的系统。这个执行时间不包括I/O操作,比如和客户端交互,发送应答等等,仅仅指实际执行命令的时间(这是唯一线程会阻塞并且不能应答请求的阶段)。

可以配置慢日志的两个参数:一个告诉Redis的执行时间,单位i微秒,超出后打印命令;另一个是慢日志的长度。当打印了一个新日志时,最老的日志从日志命令队列中移除。

下面的时间用微秒表示,所以1000000等价于1秒。注意一个负值禁用慢日志,而0迫使打印每个命令。

slowlog-log-slower-than 10000

目前还没有长度限制。要记住这会消耗内存。可以使用SLOWLOG RESET来重新声明内存。

slowlog-max-len 128

延迟监控

Redis延迟监控子系统在运行时采集不同的操作样本,来收集Redis实例的可能延迟源。

用户通过LATENCY命令来打印图标和获取报告。

系统只打印执行时间等于或大于由latency-monitor-threshold配置指令指定的以毫秒为单位的时间的操作。但它被设置为0时,延迟监控将关闭。

默认情况下延迟监控是禁用的,因为如果没有延迟问题的话,大部分情况是不需要的,收集数据会有性能影响,尽管非常小,但是高负载时将是可观的。如果需要的话,延迟监控可以轻松地使用命令“CONFIG SET latency-monitor-threshold <milliseconds>”打开。

latency-monitor-threshold 0

事件通知

Redis可以通知Pub/Sub客户端在键空间发生的事件。这个特性记录在http://redis.io/topics/notifications中。

如果实例打开了键空间事件通知,客户端对Database 0的“foo”键执行了DEL操作。两个消息将会通过Pub/Sub发布:

  • PUBLISH keyspace@0:foo del
  • PUBLISH keyevent@0:del foo

可以选择Redis通知的事件类型。每个类型通过一个单个字符区分:

  • K 键空间事件,以__keyspace@__开头
  • E 键事件事件,以__keyevent@__开头
  • g 一般命令(没有指定类型)比如DEL, EXPIRE, RENAME, …
  • $ 字符串命令
  • l 列表命令
  • s 集合命令
  • h 哈希命令
  • z 有序哈希命令
  • x 过期事件(每次键到期时产生)
  • e 移除事件(由于最大内存限制有键移除时产生)
  • A g$lshzxe的别名,所以“AKE”代表所有的事件

notify-keyspace-events可携带一个字符串参数,由0个或多个字符串组成。空字符串意味着禁止通知。

例1:开启列表和一般命令事件,从事件名称的角度,使用:

notify-keyspace-events Elg

例2:获取订阅到通道名为__keyevent@0__:expired的过期键的流,使用:

notify-keyspace-events Ex

默认情况下,所有的通知都是禁用的,因为大部分用户不需要这个特性,并且这个特性有一些开销。注意至少指定一个K或E,否则没有事件会发布。

notify-keyspace-events ""

高级配置

哈希可以存放多少入口?最大入口又是多少?

哈希使用内存高效数据结构编码,当入口数量较小,并且最大入口不超出给定的阈值时。这些阈值可以使用下面的指令配置。

hash-max-ziplist-entries 512
hash-max-ziplist-value 64

列表节点的数量是多少?

列表使用特殊的方法编码以节省很多空间。允许每个内部列表节点设置固定最大大小或最大元素数量。

对于固定最大大小,可以使用-5到-1,表示:

-5:最大大小:64Kb 不推荐作为正常工作量
-4:最大大小:32Kb 不推荐
-3:最大大小:16Kb 或许不推荐
-2:最大大小:8Kb 好
-1:最大大小:4Kb 好

正数表示每个列表节点存储【刚好】那个数量的元素

最常用的选择是-2(8Kb大小)或-1(4Kb大小),但是如果情况不同的话,可以按需调整。

list-max-ziplist-size -2

列表哪些节点不压缩?

列表也能压缩。

压缩深度是一个快速列表的压缩列表每边不包含的节点数量(注:晦涩难懂,看例子)。为了快速push/pop操作,列表的头和尾通常不压缩。设置是:
0:禁用所有列表压缩
1:深度1表示“不开始压缩直到1个节点加入列表,无论从头还是从末尾”
所以:[head]->node->node->…->node->[tail]
[head], [tail]总是不被压缩;内部节点会压缩
2: [head]->[next]->node->node->…->node->[prev]->[tail]
这里的2表示:不压缩head或head->next或tail->prev或tail,但是压缩中间的节点。
3:[head]->[next]->[next]->node->node->…->node->[prev]->[prev]->[tail]
以此类推

list-compress-depth 0

如果集合中是整数字符串,最多可以放多少个?

集合在一种情况下才特殊编码:当集合仅由范围在64位有符号整数的10进制字符串组成时。

下列配置设置指定了集合的大小限制,以便能使用特殊内存保存编码。

set-max-intset-entries 512

为了触发特殊编码,有序集合的元素数量和元素最大大小又有哪些限制?

类似哈希和列表,有序集合也特殊编码以便节省很多空间。这种编码只有在有序集合的长度和元素低于下列限制时使用。

zset-max-ziplist-entries 128
zset-max-ziplist-value 64

稀疏编码的字节大小限制是多少?

HyperLogLog稀疏表征字节限制。这个限制包含16位头部。当HyperLogLog使用的稀疏表征越过这个限制,它就转变成密集表征。

超过16000的值是完全没有意义的,因为在那个点,密集表征更加内存有效。

建议的值是~3000,以便获得空间效率编码的好处而不会拉低太多的PFADD,稀疏编码的复杂度是O(N)。这个值可以提高到~10000,当CPU不是问题,而空间是,并且数据集合包含了很多范围在0 - 15000之间的HyperLogLogs。

hll-sparse-max-bytes 3000

【准备中】

活跃碎片整理

警告这个特性还处于实验阶段。然而,这个功能已经被高度测试即使在生产环境中,并且被多个工程师手动测试过一段时间。

什么是活跃碎片整理?

上一篇:Redis配置文件说明【转】


下一篇:Elasticsearch系列---Elasticsearch的基本概念及工作原理