本次redis版本 4.0
redis的优化
通常对一个中间件优化的策略是对中间件外部环境和内部参数进行优化。外部环境优化一般为服务器优化涉及IO,内存等系统级的参数。内部参数一般用于定义一些算法的阈值。相对于外部参数而言。内部参数是考虑优化的第一步。
redis的参数
参数来自于aliyun 4.0版本配置文件配置
参数名称 | 参数解释 | 默认值 |
---|---|---|
appendonly | 开启 aof 持久化模式 | yes |
zset-max-ziplist-value | 类似于哈希(Hash)和列表(List)类型的数据,有序集合(Sorted Sets)也采用特殊的编码,以优化内存空间。 | 128 |
zset-max-ziplist-entries | 类似于哈希(Hash)和列表(List)类型的数据,有序集合(Sorted Sets)也采用特殊的编码,以优化内存空间。 | 64 |
client-output-buffer-limit | 发布订阅客户端写缓冲区,如果实例大版本是4.0及以上的用户可以指定单位设置,例如,32mb 8mb 60;实例大版本是2.8的,则无法指定单位,必须用全数字进行设置,单位为字节,例如33554432 8388608 60。 | 33554432 8388608 60 |
hash-max-ziplist-entries | 如果哈希(Hash)字段数量少于该参数值,Hash 字段长度小于 hash-max-ziplist-value 参数的值,则采用压缩列表(ziplist)数据结构。 | 512 |
hash-max-ziplist-value | 如果哈希(Hash)字段数量少于 hash-max-ziplist-entries 参数的值,Hash 字段长度小于该参数值,则采用压缩列表(ziplist)数据结构。 | 64 |
hz | 设置 Redis 后台任务执行频率,比如清除过期键任务,设置范围为1到500,默认为10。数值越大 CPU 消耗越大,延迟越小,建议不要超过100。 | 10 |
lazyfree-lazy-eviction | 驱逐数据时,是否启用 Lazyfree。 | no |
lazyfree-lazy-expire | 淘汰数据时,是否启用 Lazyfree。 | yes |
lazyfree-lazy-server-del | 隐式删除服务器数据时,是否启用 Lazyfree。 | yes |
list-compress-depth | 列表两端未压缩的数据条数 | 0 |
timeout | 客户端空闲时间达到该设置值后,关闭客户端的连接。参数值 0 表示关闭该功能。 | 0 |
list-max-ziplist-value | 快速列表(quicklist)中压缩列表(ziplist)的最大长度。 | -2 |
maxmemory-policy | 设置当占用内存达到最大内存大小(maxmemory)参数设置值时采用的数据驱逐策略。下列策略可供选择:volatile-lru、allkeys-lru、volatile-lfu、allkeys-lfu、volatile-random、allkeys-random、volatile-ttl、noeviction。 | volatile-lru |
notify-keyspace-events | 键空间通知功能 | |
set-max-intset-entries | 设置适合采用 intset 编码时最大数据条数。当集合仅包含64位带符号整数或以10为基数的整数,且数据条数不大于该参数值时,则采用 intset 编码,以优化内存存储。 | 512 |
slowlog-log-slower-than | 单位:微秒。参数值1000000表示1秒。注意,只有超过参数值的命令操作会被记录慢日志。 | 20000 (20ms) |
slowlog-max-len | 最大慢查询日志的条数。 | 1024 |
当然更多参数参考源码:src/config.c
appendonly
Redis 持久化方式分为两种,Rdb和aof持久化,这是大多数中间件内存持久化或者备份间同步的主要方式。
aof 即 记录增删改的log,来保留日志的持久化。
相关源代码:src/aof.c
相关大致调用路径: processCommand(server.c)
-> call(server.c)
-> propagate(server.c)
->
feedAppendOnlyFile(aof.c)
serverCron(server.c)
appendonly
是否打开,为true代表开启aof
config_set_special_field("appendonly") {
int enable = yesnotoi(o->ptr);
if (enable == -1) goto badfmt;
if (enable == 0 && server.aof_state != AOF_OFF) {
stopAppendOnly();
} else if (enable && server.aof_state == AOF_OFF) {
if (startAppendOnly() == C_ERR) {
addReplyError(c,
"Unable to turn on AOF. Check server logs.");
return;
}
}
}
/* Called when the user switches from "appendonly no" to "appendonly yes"
* at runtime using the CONFIG command. */
int startAppendOnly(void) {
char cwd[MAXPATHLEN]; /* Current working dir path for error messages. */
int newfd;
newfd = open(server.aof_filename,O_WRONLY|O_APPEND|O_CREAT,0644);
serverAssert(server.aof_state == AOF_OFF);
if (newfd == -1) {
char *cwdp = getcwd(cwd,MAXPATHLEN);
serverLog(LL_WARNING,
"Redis needs to enable the AOF but can't open the "
"append only file %s (in server root dir %s): %s",
server.aof_filename,
cwdp ? cwdp : "unknown",
strerror(errno));
return C_ERR;
}
if