今天才知道,Redis
从2.8.12
版本开始支持“ROLE
”命令了。通过“ROLE
”命令,可以得到当前Redis
的角色是“master
”,“slave
”或者“sentinel
”。回想我们一年前做Redis
监控程序时,还要通过“info
”命令得到整个Redis
状态,然后再解析“Role
”这个关键字,才能得到是什么角色,实在有点麻烦。如果有机会,应该升级一下监控程序,一旦发现是2.8.12
版本,就直接用“ROLE
”命令好了。
标签:redis
监控redis的内存使用情况
redis可以配置使用内存的最大值,配置项是maxmemory。如果不设置的话,64位程序默认内存没有限制,而32位程序的默认值为3G。相关代码如下:
if (server.arch_bits == 32 && server.maxmemory == 0) { redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3 GB maxmemory limit with 'noeviction' policy now."); server.maxmemory = 3072LL*(1024*1024); /* 3 GB */ server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION; }
redis使用zmalloc去做内存的分配和释放工作,这样便于统计当前redis进程消耗了多少内存。
通过“info”命令,我们可以得到当前redis已使用的内存值:used_memory字段;通过“config get maxmemory”命令可以得到redis可使用内存的最大值。这样一旦监控程序发现redis使用的内存超过一个百分比(例如:80%),就可以通知我们,进而让我们采取相应的措施。
参考资料:
(1)When would one use malloc over zmalloc?
在Solaris上编译redis(2.8.13)
最近由于工作需要,又要做redis相关的工作。正好今天早上redis发布了最新的2.8.13版本,于是就下载了最新的版本并试着在Solaris上编译了一下,还是发现了一些问题。于是在此记录下来,说不定对其他人会有帮助。
(1)Solaris 9
我先选了一台Solaris 9,结果一开始编译就遇到“IPV6_V6ONLY”未定义错误。上网查了一下,发现Solaris不支持这个socket选项。我改了一点代码,绕过去这个问题,结果再编译遇到了没有stdint.h文件这个错误。于是果断决定放弃Solaris 9,转投Solaris 10。
(2)Solaris 10
Solaris 10上的编译过程还是比较顺利的,但是链接时出了两个问题:
a)nanosleep函数没有定义:Solaris上调用nanosleep,需要链接“rt library”,即在Makefile里加上“-lrt”。我把这个patch报给了redis(https://github.com/NanXiao/redis/commit/232d77938add77d95c91a714462389e62e2bf126),不过不确定redis会不会采纳。
b)isinf没有定义,需要在调用make命令时传入MISSING_ISINF宏定义,即“make “CFLAGS+=-DMISSING_ISINF” ”。