Ngx+Lua+Redis 快速存储POST数据

系统几万台设备有windows有安卓还有linux系统,每个设备三分钟就会向服务器post设备的硬件信息,数据格式json,后台管理界面只需要最新的数据,不需要历史数据,业务逻辑非常简单,PHP代码就几行,已经优化到极致了,但是架不住频率太高了。服务器负载就被这个的简单逻辑给耗尽。历史原因客户端已经不可能修改,只能在服务端进行优化了。

做法也很简单就是不用php-fpm,nginx接收到数据,直接把post数据存储到redis里面,供管理后台直接使用。

ngx如何连接redis请参考我的另一篇文件
Ngx+Lua+Redis 实时IP黑名单系统https://blog.csdn.net/hangbobo/article/details/142763400在这里我只接上代码

复制代码
local my_cache = ngx.shared.my_cache
local redis_connect=loadstring(my_cache:get("redis_connect"))
local red=redis_connect()
red:hincrby('store_ip:02','hardware',1)

local auth_header = ngx.req.get_headers()["Authorization"]
if string.len(auth_header) > 8 then
    local token = string.sub(auth_header,8)
    if string.len(token) > 0 then
        ngx.req.read_body() 
        
        local data = ngx.req.get_body_data()
        local cjson = require "cjson.safe"
        local obj = cjson.decode(data)
        obj.time=os.date("%Y-%m-%d %H:%M:%S", ngx.time())
        data=cjson.encode(obj)
        red:hset('hardware',token,data)
        ngx.say('{"msg":"succeed","status_code":200,"data":['..data..']}')
        ngx.exit(200)
    end
end
ngx.exit(404)

解析json代码并增加当前时间这个是非必须的,只是为了验证数据是不是最新提交的。

我的设备唯id是,通过header头的"Authorization" 传递的,你需要结合你你的实际代码。

代码存储为 /www/server/nginx/conf/hardware.lua

nginx配置

复制代码
lua_shared_dict my_cache 10m;
server
{
    listen 80;
    listen 443 ssl;
    http2 on;
    ...........
    
    default_type 'application/json';    
    access_by_lua_file /www/server/nginx/conf/access.lua; 

    location /boxs/hardware {
        access_by_lua_file /www/server/nginx/conf/hardware.lua;
    }

    ...........
}
相关推荐
豆浆whisky11 小时前
Go并发模式选择指南:找到最适合你项目的并发方案|Go语言进阶(19)
开发语言·后端·golang
草莓熊Lotso11 小时前
《算法闯关指南:动态规划算法--斐波拉契数列模型》--01.第N个泰波拉契数,02.三步问题
开发语言·c++·经验分享·笔记·其他·算法·动态规划
胖咕噜的稞达鸭12 小时前
自定义shell命令行解释器自制
java·开发语言
草莓熊Lotso12 小时前
Git 分支管理:从基础操作到协作流程(本地篇)
大数据·服务器·开发语言·c++·人工智能·git·sql
报错小能手12 小时前
C++异常处理 终极及总结
开发语言·c++
tobebetter952718 小时前
How to manage python versions on windows
开发语言·windows·python
9***P33419 小时前
PHP代码覆盖率
开发语言·php·代码覆盖率
CoderYanger19 小时前
优选算法-栈:67.基本计算器Ⅱ
java·开发语言·算法·leetcode·职场和发展·1024程序员节
jllllyuz19 小时前
Matlab实现基于Matrix Pencil算法实现声源信号角度和时间估计
开发语言·算法·matlab
多多*19 小时前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven