1. lua模块demo(redis,http,mysql,cjson,本地缓存)

1.1. 配置

  1. 在nginx.conf中设置lua_shared_dict my_cache 128m; 开启nginx本地缓存,放到http{} 层
  2. location配置
location /redis-get{
resolver 8.8.8.8;
default_type text/html;
content_by_lua_file /usr/local/openresty/lua/redis-get.lua;
}
  1. 这里推荐个工具,使用notepad++,下载个插件NppFtp,效果如下图,可以直接对liunx上的文件进行编辑保存

1.2. http

  1. 远程调用可以使用该模块 https://github.com/ledgetech/lua-resty-http
  2. 把lib包里的两个文件复制到 /usr/local/openresty/lualib/resty
  3. 通过require("resty.http") 调用

1.3. mysql

  1. 连接工具
local connectMysqlUtil = {}

local mysql = require "resty.mysql"
-- connect to mysql;
function connectMysqlUtil.connect()
local db, err = mysql:new()
if not db then
return false
end
db:set_timeout(1000) local ok, err, errno, sqlstate = db:connect{
host = "127.0.0.1",
port = 8083,
database = "test",
user = "dev",
password = "1234",
max_packet_size = 1024 * 1024 } if not ok then
ngx.say("connect mysql failed")
return false
end
return db
end return connectMysqlUtil

参考 https://www.cnblogs.com/zhuzi91/p/7879956.html

1.4. string工具

local stringEx = {}

function stringEx.ToStringEx(value)
if type(value)=='table' then
return stringEx.TableToStr(value)
elseif type(value)=='string' then
return "\'"..value.."\'"
else
return tostring(value)
end
end function stringEx.TableToStr(t)
if t == nil then return "" end
local retstr= "{" local i = 1
for key,value in pairs(t) do
local signal = ","
if i==1 then
signal = ""
end if key == i then
retstr = retstr..signal..stringEx.ToStringEx(value)
else
if type(key)=='number' or type(key) == 'string' then
retstr = retstr..signal..'['..stringEx.ToStringEx(key).."]="..stringEx.ToStringEx(value)
else
if type(key)=='userdata' then
retstr = retstr..signal.."*s"..stringEx.TableToStr(getmetatable(key)).."*e".."="..stringEx.ToStringEx(value)
else
retstr = retstr..signal..key.."="..stringEx.ToStringEx(value)
end
end
end i = i+1
end retstr = retstr.."}"
return retstr
end function stringEx.StrToTable(str)
if str == nil or type(str) ~= "string" then
return
end return loadstring("return " .. str)()
end return stringEx

1.5. 整合redis+本地缓存

-- 自定义的字符串转换工具
local stringEx = require("stringExt") -- 本地缓存
local local_cache = ngx.shared.my_cache -- redis连接池,设置连接空闲时间
local function close_redis(red)
if not red then
return
end
local pool_max_idle_time = 10000
local pool_size = 100
local ok,err = red:set_keepalive(pool_max_idle_time,pool_size)
if not ok then
ngx.say("set keepalive fail ",err)
end
end -- 读redis缓存
local function read_redis(key)
local redis = require("resty.redis")
local red = redis.new();
local ok,err = red:connect("127.0.0.1",8084)
if not ok then
ngx.say("connect fail ",err)
return close_redis(red)
end
red:set_timeout(1000) local count,err = red:get_reused_times()
if 0==count then
ok,err = red:auth("123456")
if not ok then
ngx.say("auth fail ",err)
return close_redis(red)
end
elseif err then
ngx.say("fail to get reused times")
return close_redis(red)
end local res,err = red:get(key)
if not res then
ngx.say("get msg fail ",err)
return close_redis(red)
elseif res then
ngx.say(" set expire 10000 ")
red:expire(key,10)
end
local_cache:set(key,res,5)
ngx.say("read from redis ")
ngx.say(res)
close_redis(red)
end -- http请求参数
local args = ngx.req.get_uri_args()
local key = args["key"]
if not key then
ngx.say("key must be exist")
return
end local keyCache = local_cache:get(key)
if not keyCache then
local res = read_redis(key)
if not res then
ngx.say("redis is null")
end
else
ngx.say("read from localCache ")
ngx.say(keyCache)
end -- http调用工具,需要额外下载,地址:https://github.com/ledgetech/lua-resty-http 说明:https://blog.csdn.net/xiejunna/article/details/53445342
local http = require("resty.http")
local httpc = http.new();
if not httpc then
ngx.say("\n\r httpc new fail")
end
httpc:set_timeout(8000)
-- keepalive参数不写可能导致报错
local res,err = httpc:request_uri("http://www.xxx.com",{
method="POST",
path="/xxx/rpc.api",
body = 'a=1&b=2',
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
},
keepalive_timeout = 60,
keepalive_pool = 10
})
if not res then
ngx.say("httpc call fail ")
return
end
local cjson = require("cjson")
local json = cjson.new()
if not json then
ngx.say("json is null")
return
end -- 测试调用结果
-- ngx.say(stringEx.TableToStr(res))
-- ngx.say(stringEx.ToStringEx(json.decode(res["body"])))
-- ngx.say(type(json.decode(res["body"])))
-- ngx.say(stringEx.ToStringEx(json.decode(res["body"])["header"]["request_seq"]))
-- ngx.say(type(json.decode(res["body"])["header"]))
-- ngx.say(type(json.decode(res["body"])["header"]["request_seq"])) local connectMysqlUtil = require("connectMysqlUtil")
local db = connectMysqlUtil.connect()
if not db then
ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
return
end local res,err,errcode,sqlstate = db:query("select * from t_uls_order_info where order_id='20190119232946000023'",10)
if not res then
ngx.say("bad request: ",err,":",errcode,": ",sqlstate,".")
return
end ngx.say("result:",json.encode(res))

1.6. 总结

  1. 本文记录了对http,mysql,redis,nginx本地缓存的基本使用方式,后续需要使用到该模块的需求可以直接参考修改本示例代码
  2. 对于实际的互联网需求,这里可以想象个基于这些模块的需求,优先读取ngnix本地缓存,过期时间较短,其次读取redis缓存,减少redis压力,进一步减少mysql读取压力

lua模块demo(redis,http,mysql,cjson,本地缓存)的更多相关文章

  1. Nginx Lua拓展模块操作Redis、Mysql

    # Nginx的拓展模块 # ngx_lua模块 # 淘宝开发的ngx_lua模块通过lua解释器集成近Nginx,可以采用lua脚本实现业务逻辑,由于lua的紧凑.快速以及内建协程,所以在保证宝兵法 ...

  2. redis实现mysql的数据缓存

    环境设定base2 172.25.78.12 nginx+phpbase3 172.25.78.13 redis端base4 172.25.78.14 mysql端# 1.在base2(nginx+p ...

  3. 用Redis作为Mysql数据库的缓存【转】

    用Redis作Mysql数据库缓存,必须解决2个问题.首先,应该确定用何种数据结构存储来自Mysql的数据:在确定数据结构之后,还要考虑用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是 ...

  4. redis订阅发布消息操作本地缓存

    Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存 ...

  5. redis(三)--用Redis作为Mysql数据库的缓存

    把MySQL结果集缓存到Redis的字符串或哈希结构中以后,我们面临一个新的问题,即如何为这些字符串或哈希命名,也就是如何确定它们的键.因为这些数据结构所对应的行都属于某个结果集,假如可以找到一种唯一 ...

  6. 用Redis作为Mysql数据库的缓存

    看到一篇不错的博文,记录下: http://blog.csdn.net/qtyl1988/article/details/39553339 http://blog.csdn.net/qtyl1988/ ...

  7. 利用Azure Redis Cache构建百万量级缓存读写

    Redis是一个非常流行的基于内存的,低延迟,高吞吐量的key/value数据存储,被广泛用于数据库缓存,session的管理,热数据高速访问,甚至作为数据库方式提高应用程序可扩展性,吞吐量,和实施处 ...

  8. 本地缓存下载文件,download的二次封装

    来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...

  9. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

随机推荐

  1. ASP .NetCore 部署500错误 查看异常详情

    部署.net core 网站后,访问报错:500 按照教程设置完成,但访问时总是提示 服务器内部错误,没有详细的异常信息,无从下手. 解决办法: 1.在站点根目录下按住shift+鼠标右键,选择在此处 ...

  2. mysql的初次使用操作

    一.mysql 登录 mysql 参数 mysql -uroot -p123 -P3306 -h127.0.0.1 127.0.0.1本地回环地址 二.mysql退出 mysql >exit; ...

  3. JavaSE 初学系统托盘图标SystemTray类

    文章目录 1.预备知识 2.使系统托盘显示图标 3.添加提示 4.添加弹出菜单 设置Java程序的系统托盘图标,用到SystemTray类和TrayIcon类. 1.预备知识 JavaAPI对于Sys ...

  4. Qt自定义滚动条(不使用样式表)

    前面使用Qt 样式表实现滚动条,在实际工作中,发现存在一些瑕疵,例如如果在主窗口中绘制背景,则有可能给滚动条染色,还有如果想实现特殊的效果,则必须使用自定义风格,即从QStyle的子类派生出新的类型. ...

  5. Netty使用(一)

    什么是Netty Netty由JBOSS提供的基于Java NIO的开源框架,Netty提供异步非阻塞.事件驱动.高性能.高可靠.高可定制性的网络应用程序和工具, 可用于开发服务端和客户端. 配置服务 ...

  6. Python中logging日志模块的使用

    参考https://www.cnblogs.com/CJOKER/p/8295272.html

  7. java38

    字符串内存分析 String str = new String("ABCD") 会先在堆中开辟一个空间,然后去常量池(方法区)中寻找是否有该变量,如果有,直接引用常量池中的内容 如 ...

  8. SAS 创建新变量

    SAS  创建新变量 在对SAS数据集进行处理时,经常需要根据原有变量或变量值生成新变量.根据要实现功能的不同,SAS提供了多种方法,例如通过数据集选项RENAME=(RENAME语句).赋值语句.求 ...

  9. k8s对接ceph存储

    前提条件:已经部署好ceph集群 本次实验由于环境有限,ceph集群是部署在k8s的master节点上的 一.创建ceph存储池 在ceph集群的mon节点上执行以下命令: ceph osd pool ...

  10. 从今天开始慢慢阅读java9源码决心的声明。

    我从很早的时候就好奇java的源码了,因为有使用者就有制作者. 在校期间使用了java两年多的我却不知道java里面的任何东西. 这个寒假前我无意之间看到了java9出现的新闻,网上查询到原来源码就隐 ...