php的高并发一般分为2种:
1、让流量尽量限制在上游的层面,不要一下子涌入后端服务
2、读写分离,对请求做缓存,写请求尽量入队列分批透给数据库。
当请求进入php的生命周期时,io就是它的瓶颈了,因为每个php进程在请求io的时候是同步阻塞的,等待结果返回才退出脚本。但是lua不同,背靠nginx,利用了 epoll 的特性,提高了请求的吞吐量。
Lua是什么?
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
设计目的?
为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
应用场景?
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
nginx+lua+redis构建高并发应用
利用nginx+lua+redis自定义分流客户端条件,后端db物理隔离
思路:ngx_lua将lua嵌入到nginx,让nginx执行lua脚本,高并发,非阻塞的处理各种请求。url请求nginx服务器,然后lua查询redis,返回json数据。
- 安装lua,nginx,lua-redis-parser,json,redis-lua
- 配置nginx
events {
worker_connections 1024;
use epoll;
}
http {
upstream redis_pool {
server 192.168.1.39:6379;
keepalive 1024 single; // 定义连接池大小,当连接数达到此数后,后续的连接为短连接
}
server {
listen 80;
server_name 192.168.1.211;
location /get_redis{
set_unescape_uri $key $arg_key;
redis2_query hgetall $key;
redis2_pass redis_pool;
}
location /json {
content_by_lua_file conf/test.lua;
}
}
}
- 编辑test.lua文件
local json = require("json")
local parser = require("redis.parser")
local res = ngx.location.capture("/get_redis",{
args = { key = ngx.var.arg_key }
})
if res.status == 200 then
reply = parser.parse_reply(res.body)
value = json.encode(reply)
ngx.say(value)
a = json.decode(value)
ngx.say(a[2])
end
- 测试
curl ‘http://192.168.1.211/json?key=test’