4. Security配置
若redis实例可能会接收来自不受自己控制的客户端的命令时(如来自第三方的访问),可以考虑启用密码保护(即客户端必须先通过认证(通过AUTH <passwd>)才能执行其它命令),也可以通过rename-command来禁用某些会危及Redis正常运行的危险命令。
1) requirepass <passwd>
指定访问密码
2) rename-command <normal-cmd> <new-cmd>
重命名命令。如rename-command CONFIG randomcommand或rename-command CONFIG "",其中后者会完全禁用CONFIG命令。
注意:Changing the name of commands that are logged into the AOF file or transmitted to slaves may cause problems. 即若某些会写入aof文件或同步给从库的命令被rename后,可能会引起问题:aof文件回放时,redis实例未必会识别出被rename后的命令;类似地,master实例中被配置了rename的命令,同步到slave实例执行时,后者可能无法识别这些非官方支持的"自定义"命令。
5. Limit配置
1) maxclients
客户端的并发连接数,默认10000。当redis实例无法更改系统fd限制时,会以系统限制数n减去32作为Redis支持的最大连接数(减32是因为Redis保留32个fd供内部逻辑使用)。当达到Redis支持的最大连接数后,新连接会被close,对应的client会收到"max number of clients reached"的出错提示。
2) maxmemory
配置Redis Server可占用的最大内存值,单位byte。如果达到该阈值,根据用户配置的淘汰策略,Redis会尝试删除符合淘汰条件的key。假如用户配置了永不淘汰(noeviction)的策略,则Redis不会删除现有的key,此时,来自客户端的所有写入或排序等需要使用更多内存的命令都会报错,而读取命令可以正常执行。
在Redis被用来作为LRU缓存时,该配置项会很有用。
特别注意:在主从部署下,master在配置了淘汰策略的前提下,配置maxmemory时,需要配置一个比机器可用物理存储器数量小一些的阈值,因为主从同步需要为slave保留output buffer。若master的maxmemory配置成与机器Physical Memory很接近的值,可能会引起master的key全部被淘汰的严重后果!
具体的触发过程:在Redis Server实际使用的内存达到阈值后,开始根据淘汰策略删除master的key,同时会通过DEL命令同步删除slave的key,此时,master需要申请output buffer用于存放发往slave的命令,这会使master尝试使用更多内存,从而加剧内存超限的严重程度。于是,master只能通过删除更多的keys以便尝试降低内存使用,而这些keys的DELs命令同样需要同步至slaves,意味着master需要申请更大的output buffer用于存放同步命令或数据。典型的"雪崩效应",最坏的结果是master会把所有的key都删干净。
而若maxmemory配置成比机器Physical Memory小一些的值(如配成后者的90%),当Redis实际使用内存达到配置阈值后,开始淘汰key,发给slave的同步命令存到output buffer,此时Redis实际使用的内存可能会继续增长,由于目前系统还有大约10%的存储器资源可供使用,因此output buffer会从这些free的memory中借用资源(从Redis 2.4开始,master会认为这个增长是暂时的,同步完成后即可释放内存),从而避免master通过删除更多的keys为output buffer腾空间。
关于这个问题的更详细讨论以及Redis作者的实现策略,可以参考这里。
总之,要谨记:若系统以主从方式部署且master配置了淘汰策略,那么,master的maxmemory务必要配置一个合理的值(与用户可以为Redis提供的最大物理内存相比),以避免Redis实际使用的内存达到阈值后发生所有的key被完全删除的情况发生!
3) maxmemory-policy
配置Redis的淘汰策略,默认为volatile-lru。目前支持6种策略:
a. volatile-lru => remove the key with an expire set using an LRU algorithm;
b. allkeys-lru -> remove any key accordingly to the LRU algorithm
c. volatile-random -> remove a random key with an expire set
d. allkeys-random -> remove a random key, any key
e. volatile-ttl -> remove the key with the nearest expire time (minor TTL)
f. noeviction -> don't expire at all, just return an error on write operations
4) maxmemory-samples
配置key淘汰算法运行时的采样数,默认为3。之所以存在这个配置项,是由于redis为节省内存,采用了近似的淘汰算法,这个配置项可以用来调节淘汰算法的精度:当需要淘汰key时(如内存达到阈值),Redis会在符合淘汰条件(由maxmemory-policy指定)的key set中,随机采样n个key并将其中符合LRU的那个key删掉。默认情况下n取3,如果要提高淘汰算法的精度,n可以调大(代价是增加CPU运算时间)。