分析原因Redis设置无效(redis设置不进去)
分析原因:Redis设置无效
最近在使用Redis时,遇到了一些问题,发现设置某些参数时无效。通过一番调研,终于找到了问题所在。
我们要提供一些代码供读者参考。以下是我使用的Redis配置文件:
# Redis配置文件
daemonize yespidfile /var/run/redis.pid
port 6379tcp-backlog 511
timeout 0tcp-keepalive 300
loglevel noticelogfile /var/log/redis/redis.log
databases 16save 900 1
save 300 10save 60 10000
stop-writes-on-bgsave-error yesrdbcompression yes
rdbchecksum yesdbfilename dump.rdb
dir ./slave-serve-stale-data yes
slave-read-only yesrepl-disable-tcp-nodelay no
slave-priority 100appendonly no
appendfilename "appendonly.aof"appendfsync everysec
no-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mblua-time-limit 5000
slowlog-log-slower-than 10000slowlog-max-len 64
notify-keyspace-events ""hash-max-ziplist-entries 512
hash-max-ziplist-value 64list-max-ziplist-entries 512
list-max-ziplist-value 64set-max-intset-entries 512
zset-max-ziplist-entries 128zset-max-ziplist-value 64
activerehashing yesclient-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60
以上配置文件是Redis自带的默认配置,但是我并不想使用默认配置,我想改变一些参数。比如,我想将keepalive的值改为600,我可以在配置文件中这样写:
tcp-keepalive 600
但是当我启动Redis后,使用info命令查看配置参数时,发现tcp-keepalive的值仍是300,并没有生效。
这是为什么呢?原来Redis有一种机制,叫做硬编码。硬编码是指程序中某些参数已经被写死了,而不是通过配置文件动态设置。
在Redis源码中,我们可以找到一些硬编码的参数。比如,tcp-keepalive的值就被写死了:
#define CONFIG_TCP_KEEPALIVE 300
所以,无论我们在配置文件中怎么设置tcp-keepalive的值,最终都会被替换成300。
那么,有没有办法绕过这个问题呢?答案是肯定的。我们可以通过修改源码,将一些硬编码的参数改为动态生成。
比如,我们可以这样修改Redis源码中tcp-keepalive的值:
#define CONFIG_TCP_KEEPALIVE defaultTcpKeepalive
static int defaultTcpKeepalive = 300;
这样,我们就可以在Redis启动时通过命令行参数动态设置tcp-keepalive的值:
redis-server --tcp-keepalive 600
这个方法虽然有些麻烦,但是却可以解决Redis设置无效的问题。希望对大家有所帮助。