我这有一个memcache的例子
通过对key做hash找到对应的mc服务器地址,然后链接如果
local memc_server = {{"127.0.0.1", 11211}, {"127.0.0.1", 11212}}
local memcached_timeout = 1000
function get_memc_server(key)
local idx = ngx.crc32_short(key) % #memc_server
local conf = memc_server[idx + 1]
local memc, err = memcached:new()
if not memc then
return nil, err
end
-- timeout 1s
memc:set_timeout(memcached_timeout)
local ok, err = memc:connect(conf[1], conf[2])
if not ok then
-- log error
ngx.log(ngx.ERR, string.format("connect memcached error:%s:%s",conf[1], conf[2]))
return nil, err
end
return memc
end
在使用完这个memc后set_keepalive
在 2012年10月17日 上午10:24,drings
<drin...@gmail.com>写道:
在 2012年10月16日星期二UTC+8下午5时23分12秒,drings写道:有三台redis服务器,通过使用HttpRedis2Module模块来操作redis,
upstream redis_cluster {
server 192.168.2.10:6379;
server 192.168.2.11:6379;
server 192.168.2.12:6379;
keepalive 2048 single;
}
location /redis_set {
set_unescape_uri $key $arg_key;
set_unescape_uri $val $arg_val;
redis2_query set $key $val;
redis2_pass redis_pool;
}
location /redis_get {
redis2_next_upstream error timeout invalid_response;
set_unescape_uri $key $arg_key;
redis2_query get $key;
redis2_pass redis_pool;
}
这样子的话,通过redis_set只能在三中服务器中的一台上插入key,取key值的时候不知道在哪台服务器取。需要怎么写才可以达到要求key在哪台服务器上插入就在哪台服务器上取值呢?
感谢回复!
由于对lua语言不熟悉,所以暂时没打算用lua-resty-redis 来实现。经过你的提醒,用以下方式实现了,但不知道性能怎么样,以下哪些地方需要进一步优化?请指出。谢谢!
upstream redis_1 {
upstream_list redis redis_a redis_b redis_c;
location /redis_get {
set_unescape_uri $key $arg_key;
redis2_query get $key;
set_hashed_upstream $backend redis $key;
redis2_pass $backend;
}
location /redis_set {
set_unescape_uri $key $arg_key;
set_unescape_uri $val $arg_val;
redis2_query set $key $val;
set_hashed_upstream $backend redis $key;
redis2_pass $backend;
}
测试几次都是正常的。
--
Azure.Wang