`
lionlx
  • 浏览: 286220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)nginx+redis+lua 共享内存

 
阅读更多
转自:http://blog.sina.com.cn/s/blog_6f67b91d0101664g.html

环境:nginx + redis
起因:项目中有些接口是需要客户端轮询去访问的,这样所造成的后果就是这些接口一直占用redis内存,造成其他接口效率的降低(如果此时正好赶上JOB运行,redis的消耗就会变得更高),此时考虑将这些问题接口的数据放到nginx共享内存里去,将redis的内存解放出来,然后当这些问题接口的数据发生变化时我们去手动刷新共享内存中的值,具体的使用 nginx + lua

lua的安装这里不做说明,网上很多教程,可以参考下面的两篇文章去实现。
具体实现:我这里一共分成三个部分 取,增加,减少(增加和减少 暂未做合并)
主要配置文件 nginx.conf 和三个lua文件(做主要的业务处理)

我这里的调用方式的url方式。和调用接口一样

1.nginx.conf server节点下新建
location /msg/get.json {
            content_by_lua_file /xx/xx/lua/msg_get.lua;
        }
location /msg/add.json {
            content_by_lua_file /xx/xx/lua/msg_add.lua;
        }
        location /msg/reduce.json {
            content_by_lua_file /xx/xx/lua/msg_reduce.lua;
        }
2.取 msg_get.lua
ngx.header.content_type = "application/json; charset=UTF-8";
local redisEnv = require "resty.redis";
--redis对象,请参考redis命令
local redis = redisEnv:new();
--声明共享内存config
local config = ngx.shared.config;
local uid=ngx.var.arg_uid
--业务上的验证
local ok, err = redis:connect('10.xxx.xx5.1xx', 'xx79');
if not ok then
    ngx.log(ngx.ERR, err);
    ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end
--得到url中的参数uid
local uid=ngx.var.arg_uid
--业务  验证是否登录
local redistoken=redis:get(uid.."utoken");
if redistoken~=ngx.var.arg_token then
        ngx.say("not login");
        ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end
--从共享内存中取数据
local msg2 = config:get("BPF"..uid)
if not msg2 then
msg2 = redis:llen("BPF"..uid)
if not msg2 then
msg2=0
end
--写入共享内存
config:set("BPF"..uid, msg2);
end
--拼接json
local cjson = require "cjson"
local data = {}
    data.message= "ok";
    data.status=200;
    data.attachment={}
    data.attachment["102"]=msg2
redis:set_keepalive(1000,1024);
local json=cjson.encode(data);
ngx.say(json);#ngx.say 是 lua 显露給模块的接口
ngx.exit(ngx.HTTP_OK);
3.增加 msg_add.lua
ngx.header.content_type = "application/json; charset=UTF-8";
local redisEnv = require "resty.redis";
local redis = redisEnv:new();
--声明共享内存
local config = ngx.shared.config;
--得到请求参数 key
local key=ngx.var.arg_key
local oldNum=config:get(key)
if not oldNum then
oldNum=redis:llen(key)
if not oldNum then
oldNum=0
end
end
--写入共享内存  我这里是每次加1,根据需要可以将变化的值已参数形式传递过来
config:set(key, oldNum+1);
ngx.say("ok");
ngx.exit(ngx.HTTP_OK);
4.减少 msg_reduce.lua
ngx.header.content_type = "application/json; charset=UTF-8";
local redisEnv = require "resty.redis";
local redis = redisEnv:new();
--声明共享内存
local config = ngx.shared.config;
--得到请求参数 key
local key=ngx.var.arg_key
local oldNum=config:get(key)
if not oldNum then
oldNum=redis:llen(key)
if not oldNum then
oldNum=0
end
end
if oldNum>0 then
--写入共享内存
config:set(key, oldNum-1);
end
ngx.say("ok");
ngx.exit(ngx.HTTP_OK);
5.重启nginx  nginx -s reload
6.测试
取: http://12.1x1.1x1.72/msg/get.json?uid=123
增加:http://12.1x1.1x1.72/msg/add.json?key=BPF123
减少:http://12.1x1.1x1.72/msg/reduce.json?key=BPF123

PS:参考 :http://huoding.com/2012/08/31/156
          http://www.udpwork.com/item/8177.html这两篇文章
分享到:
评论

相关推荐

    nginx+lua+redis 集群 连接插件和脚本

    在这个“nginx+lua+redis集群”解决方案中,提供的连接插件可能是指Nginx与Redis之间的通信模块,例如lua-redis-pconnector,这个插件允许Nginx通过Lua脚本直接与Redis进行交互。而脚本部分可能包括了处理业务逻辑、...

    nginx+lua+redis通过匹配客户端ip进行灰度发布

    nginx+lua+redis通过匹配客户端ip进行灰度发布 本文将讲述如何使用nginx、lua和redis来实现灰度发布,通过匹配客户端IP来实现灰度发布。灰度发布是一种常见的软件发布方式,它允许开发者在生产环境中发布新的版本,...

    nginx+lua+redis实现token验证

    本文将深入探讨如何利用`nginx+lua+redis`来实现`token`验证,以确保只有经过授权的用户才能访问受保护的资源。 首先,让我们理解`token`验证的基本原理。`token`验证是一种身份验证机制,它允许客户端通过提供一个...

    nginx+redis实现session共享

    为了实现单点登录(Single Sign-On, SSO)以及跨应用的session共享,我们可以结合使用Nginx作为反向代理服务器,以及Redis作为持久化内存数据库来存储session数据。下面将详细解释这个解决方案的各个方面。 首先,...

    linux 实现nginx+Lua 访问redis集群

    最近有个需求是需要用nginx播放服务器的视频,考虑安全问题,需要在nginx加个lua去取redis的token进行验证,刚开始访问测试环境单机还挺好用,可是要访问生产的是集群环境,找了多了资料趟了数不尽的坑,最终形成这...

    Nginx+Lua+Redis+Json

    "Nginx、Lua、Redis 和 Json 的结合应用" Nginx 是一个高性能的 Web 服务器, Lua 是一种轻量级的脚本语言,而 Redis 是一个高性能的 NoSQL 数据库, Json 是一种轻量级的数据交换格式。通过结合使用这些技术,可以...

    nginx+lua+redis黑名单加载

    为了减少对`redis`的频繁访问,可以考虑在`nginx`内存中缓存一部分最近访问过的黑名单IP,或者使用`lua_shared_dict`共享内存字典存储部分数据。 综上所述,"nginx+lua+redis黑名单加载"是一种有效的网络安全策略...

    【Redis开发】lua脚本开发nginx 与 redis 模块

    【Redis开发】lua脚本开发nginx 与 redis 模块 (Lua script development nginx and Redis modules) 文件列表: lua_files (0, 2017-05-21) lua_files\access_control.lua ...nginx(lua+1.11.2与 1.12.0) docker imag

    lua+redis+nginx

    总结起来,`Lua+Redis+Nginx` 构建的服务器架构具有以下优点: 1. 高性能:`Nginx` 的非阻塞I/O模型和 `Lua` 的快速执行使得系统能处理大量并发请求。 2. 扩展性:通过 `Lua` 实现动态逻辑,减少对后端应用的压力,...

    Nginx+Lua+Redis构建高并发Web应用

    总结起来,Nginx+Lua+Redis的组合提供了一种强大的工具集,能够有效地处理高并发Web应用的需求。通过在Nginx中集成Lua,我们可以处理复杂的业务逻辑,而Redis则作为快速数据存储和访问的后端。这种架构不仅提高了...

    nginx+lua+redis.rar

    《构建高性能Web服务:Nginx、Lua与Redis的整合应用》 在现代Web服务的构建中,Nginx、Lua和Redis已经成为一种高效的组合,它们各自承担着不同的角色,共同构建出高并发、低延迟的系统。Nginx作为前端服务器,负责...

    Nginx利用Lua+Redis实现动态封禁IP的方法

    本文给大家介绍的是Nginx利用Lua+Redis实现动态封禁IP的方法,下面话不多说了,来一起看看详细的介绍吧 二、架构 实现 IP 黑名单的功能有很多途径: 1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求; 2...

    docker+nginx+redis部署前后端分离项目!!!.doc

    docker+nginx+redis部署前后端分离项目 一、Docker 介绍 Docker 是一个容器化平台,允许开发者将应用...Nginx 提供了负载均衡、内容缓存、URL重写和 SSL 等功能,而 Redis 提供了数据持久化、事务、Lua脚本等功能。

    基于CentOS 7 web服务环境搭建(包含JDK+Nginx+Tomcat+Mysql+Redis)-附件资源

    基于CentOS 7 web服务环境搭建(包含JDK+Nginx+Tomcat+Mysql+Redis)-附件资源

    nginx+lua+php+redis实现单业务排队系统架构.zip

    软件开发设计:应用软件开发、系统...云计算与大数据:包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    nginx 整合redis以及lua语言

    本文将深入探讨如何整合Nginx与Redis,并利用Lua语言增强Nginx的功能。我们将介绍相关工具和模块,以便更好地理解和实现这个集成过程。 首先,Nginx是一款高性能的HTTP和反向代理服务器,以其轻量级、高效的并发...

    2 OpenResty+Lua+Redis 高性能后端接口.docx

    OpenResty+Lua+Redis 高性能后端接口 OpenResty 是基于 Nginx 的高性能 web 服务器,它使用 Lua 语言作为脚本语言来实现动态内容生成和处理。 Lua 是一种轻量级的脚本语言,广泛应用于游戏、嵌入式系统和 web 开发...

    高并发Nginx+lua是如何抗住的

    提到高并发或者抗压力,有这种高qps经验的同学第一反应大都是Nginx+lua+Redis,网上也满天非那种高并发架构方案大都是这种,但是Nginx+lua来做接入层到底是怎么抗住压力的呢?本篇顺序:1、Nginx如何抗住的高并发,...

Global site tag (gtag.js) - Google Analytics