标签归档:redis

Redis返回(nil)在lua里是boolean类型而非nil

Redis里执行gethget不存在的key或field时返回值在终端显式的是”(nil)”

127.0.0.1:6379> get notexist
(nil)

当使用lua脚本执行逻辑时,如果要判断这个值,很容易让人迷惑以为它是nil,从而导致判断不成立,实际它是一个boolean的值

127.0.0.1:6379> eval "local v=redis.call('get',KEYS[1]); return type(v)" 1 notexist
"boolean"

所以在脚本里判断获取的结果不为空,正确的方式还有判断false的情况:

local v=redis.call('hget',KEYS[1], ARGV[1]); 
if (v ~= nil or (type(v) == 'boolean' and v)) then 
    return 'not-empty'; 
end

执行quit命令codis返回结果缺失数据的问题

记录一下codis遇到的这个情况,在客户端连接销毁时如果执行quit命令,有较高概率返回的数据不完整,导致客户端解析出错。具体的说是缺少了”+OK”这几个字符,在redis里执行quit命令返回的结果里会有”+OK”:

$ telnet redis-server 6379
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.
quit
+OK
Connection closed by foreign host.

而在codis上有时返回的数据缺乏“+OK”

$ telnet codis-server 19000
Trying yyy.yyy.yyy.yyy...
Connected to yyy.yyy.yyy.yyy.
Escape character is '^]'.
quit
Connection closed by foreign host.

还没有去查codis服务器端,先做个记录。