章哥你好!
使用resty.memcached客户端时遇到如下问题:
之前的使用方法是
function get_memcached()
local memcached = require "memcached"
local memc, err = memcached:new()
memc:set_timeout(2000)
if not memc then
ngx.log(ngx.ERR, "failed to instantiate memc: " .. err)
ngx.status = 500
ngx.exit(ngx.HTTP_OK)
return nil
end
local ok, err = memc:connect(_memcached_host, _memcached_port)
if not ok then
for i = 1,3,1 do
ok, err = memc:connect(_memcached_host, _memcached_port)
if ok then
break
end
end
if not ok then
ngx.log(ngx.ERR, "failed to connect: " .. err)
ngx.status = 500
ngx.exit(ngx.HTTP_OK)
end
end
return memc
end
通过get_memcached获得的memcached对象后就进行get set gets cas delete等操作
随着用户量大之后,就出现“unread data in buffer”的错误
后来在每次进行了get set gets cas delete等操作后加入set_keepalive(160000, 10240)后又出现数据错乱的问题。
错乱现象是:
memc:gets的时候使用的是key1,但是取到了其他key的数据,此数据可能是当前其他memcached对象的正在获取的数据。
而且更加诡异的现象是:
data1 = memc:gets(key1)
data2 = memc:gets(key2)
这样的话,data1是正常的,data2不正常,如果我把执行的顺序换了一下
data2 = memc:gets(key2)
data1 = memc:gets(key1)
这样的话,data2正常,但是data1不正常
这里的错乱并不是仅仅的交换了data1和data2的数据,而是取得到了memcached server中其他完全和key1 key2完全不相干的数据。
另外,我使用telnet登陆进入memcached server确认过数据是正常的,所以不存在memcached的bug。