php与redis并发大了,反应有点迟钝。。。。

geminiblue 发布于 2014/10/04 18:02
阅读 15K+
收藏 8

Serverless 架构就不要服务器了?>>>

网站前期采用php+java后端弄的,中间采用http通信,java输出的json

后来需求增加了,有活动出现,这个时候并发只有300左右,继续采用同步的话,java后端处理的时候,php端需要等待java的返回结果。。。那个速度相当夸张了说,curl超时设置到了5秒了还不见结果返回,同时java端压力倍增。

后来采用redis当队列来使用,活动也就是相当于秒杀这种类型的,一个礼品队列,一个领取结果队列,外加一个领取人的hash。。。java端每分钟从结果队列中取值,起初还能应对一下需求,后来并发800的时候,php端基本出现无响应的情况,php端用的时候predis类库。

php5.4版本的,opcache等都打开的,sessionhandle也改存到redis了

这两天要优化了,想到了几个方式:

1.php端换phpredis扩展,看了下有pconnect方法,领取,入结果列,入hash用lua来写,redis->eval来调用

没测试过。。。。

2.nginx+lua来操作redis,然后php以http方式去请求,在本上,用ab简单的压测了下,2000并发还扛得住,测试环境:openrestry1.7+redis2,跑在一个radxa(arm4核,2g存,16g的tf卡,redis,ng都装卡上的),没敢加-k参数。。。板子有点弱小。。。

测试就一个set,get,lpush跟rpop,ng连接redis弄了个upstream,keepalive设置到1024,然后content_by_lua_file了,

local parser = require "redis.parser"
local reqs = {
    {"set", "foo", "hello world"},
    {"get", "foo"},
    {"lpush","act1","{'user':1}"},
    {"rpop","act1"}
}

local raw_reqs = {}
for i, req in ipairs(reqs) do
    table.insert(raw_reqs, parser.build_query(req))
end

local res = ngx.location.capture("/redis?" .. #reqs,
    { body = table.concat(raw_reqs, "") })

if res.status ~= 200 or not res.body then
    ngx.log(ngx.ERR, "failed to query redis")
    ngx.say(ngx.ERR)
end

local replies = parser.parse_replies(res.body, #reqs)
for i, reply in ipairs(replies) do
    ngx.say(reply[1])
end



upstream redisbackend {
                server 127.0.0.1:6379;
                keepalive 1024;
}
server{
location = /redis {
    internal;
    redis2_raw_queries $args $echo_request_body;
    redis2_pass redisbackend;
}
location = /luatest {
    content_by_lua_file /data/websoft/nginx/conf/test.lua;
}
}



不知道大家还有什么好的方法没?第一种处理方式的话,不知道有木有哪位试过的?

加载中
0
卖红薯
卖红薯
php+redis读写轻松过万,你现在的并发问题应该在其它方面
0
seanlin138
seanlin138
之前测过phpredis-2.2.5,connect到800左右就到顶了
0
技术揣摩
技术揣摩

引用来自“seanlin138”的评论

之前测过phpredis-2.2.5,connect到800左右就到顶了
那是到你机器的顶了
返回顶部
顶部