简介:

  OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

  OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached 以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。

            ————章亦春  

Lua基础数据类型

Lua表达式

Lua控制结构

Lua函数

  函数调用的时候可以传参,形参(a,b)与实参(x,y)在使用上需要注意,在使用函数时实参若大于形参则多余的参数为nli(空)

  1. Local function test(a,b)
  2.  
  3. local temp = a
  4. a = b
  5. b = temp
  6. print(a,b)
  7. end
  8. local x = "hello"
  9. local y = 20
  10. print(x, y)
  11. swap(x, y) --调用swap函数
  12. print(x, y) --调用swap函数后,xy的值并没有交换
  13.  
  14. -->output
  15. hello 20
  16. 20 hello
  17. hello 20

Openrsty连接redis连接池封装(connect,port)+auth 使用

  1. --这是大神们封装好的redis连接池,在配置中修改ip和端口即可 文件放到 Openresty/lualib/resty/redis_iresty.lua
  2.  
  3. local redis_c = require "resty.redis"
  4.  
  5. local ok, new_tab = pcall(require, "table.new")
  6. if not ok or type(new_tab) ~= "function" then
  7. new_tab = function (narr, nrec) return {} end
  8. end
  9.  
  10. local _M = new_tab(0, 155)
  11. _M._VERSION = '0.01'
  12.  
  13. local commands = {
  14. "append", "auth", "bgrewriteaof",
  15. "bgsave", "bitcount", "bitop",
  16. "blpop", "brpop",
  17. "brpoplpush", "client", "config",
  18. "dbsize",
  19. "debug", "decr", "decrby",
  20. "del", "discard", "dump",
  21. "echo",
  22. "eval", "exec", "exists",
  23. "expire", "expireat", "flushall",
  24. "flushdb", "get", "getbit",
  25. "getrange", "getset", "hdel",
  26. "hexists", "hget", "hgetall",
  27. "hincrby", "hincrbyfloat", "hkeys",
  28. "hlen",
  29. "hmget", "hmset", "hscan",
  30. "hset",
  31. "hsetnx", "hvals", "incr",
  32. "incrby", "incrbyfloat", "info",
  33. "keys",
  34. "lastsave", "lindex", "linsert",
  35. "llen", "lpop", "lpush",
  36. "lpushx", "lrange", "lrem",
  37. "lset", "ltrim", "mget",
  38. "migrate",
  39. "monitor", "move", "mset",
  40. "msetnx", "multi", "object",
  41. "persist", "pexpire", "pexpireat",
  42. "ping", "psetex", "psubscribe",
  43. "pttl",
  44. "publish", --[[ "punsubscribe", ]] "pubsub",
  45. "quit",
  46. "randomkey", "rename", "renamenx",
  47. "restore",
  48. "rpop", "rpoplpush", "rpush",
  49. "rpushx", "sadd", "save",
  50. "scan", "scard", "script",
  51. "sdiff", "sdiffstore",
  52. "select", "set", "setbit",
  53. "setex", "setnx", "setrange",
  54. "shutdown", "sinter", "sinterstore",
  55. "sismember", "slaveof", "slowlog",
  56. "smembers", "smove", "sort",
  57. "spop", "srandmember", "srem",
  58. "sscan",
  59. "strlen", --[[ "subscribe", ]] "sunion",
  60. "sunionstore", "sync", "time",
  61. "ttl",
  62. "type", --[[ "unsubscribe", ]] "unwatch",
  63. "watch", "zadd", "zcard",
  64. "zcount", "zincrby", "zinterstore",
  65. "zrange", "zrangebyscore", "zrank",
  66. "zrem", "zremrangebyrank", "zremrangebyscore",
  67. "zrevrange", "zrevrangebyscore", "zrevrank",
  68. "zscan",
  69. "zscore", "zunionstore", "evalsha"
  70. }
  71.  
  72. local mt = { __index = _M }
  73.  
  74. local function is_redis_null( res )
  75. if type(res) == "table" then
  76. for k,v in pairs(res) do
  77. if v ~= ngx.null then
  78. return false
  79. end
  80. end
  81. return true
  82. elseif res == ngx.null then
  83. return true
  84. elseif res == nil then
  85. return true
  86. end
  87.  
  88. return false
  89. end
  90.  
  91. -- change connect address as you need
  92. function _M.connect_mod( self, redis )
  93. redis:set_timeout(self.timeout)
  94. return redis:connect("1.1.1.1", 6379)
  95. end
  96.  
  97. function _M.set_keepalive_mod( redis )
  98. -- put it into the connection pool of size 100, with 60 seconds max idle time
  99. return redis:set_keepalive(60000, 1000)
  100. end
  101.  
  102. function _M.init_pipeline( self )
  103. self._reqs = {}
  104. end
  105.  
  106. function _M.commit_pipeline( self )
  107. local reqs = self._reqs
  108.  
  109. if nil == reqs or 0 == #reqs then
  110. return {}, "no pipeline"
  111. else
  112. self._reqs = nil
  113. end
  114.  
  115. local redis, err = redis_c:new()
  116. if not redis then
  117. return nil, err
  118. end
  119.  
  120. local ok, err = self:connect_mod(redis)
  121. if not ok then
  122. return {}, err
  123. end
  124.  
  125. redis:init_pipeline()
  126. for _, vals in ipairs(reqs) do
  127. local fun = redis[vals[1]]
  128. table.remove(vals , 1)
  129.  
  130. fun(redis, unpack(vals))
  131. end
  132.  
  133. local results, err = redis:commit_pipeline()
  134. if not results or err then
  135. return {}, err
  136. end
  137.  
  138. if is_redis_null(results) then
  139. results = {}
  140. ngx.log(ngx.WARN, "is null")
  141. end
  142. -- table.remove (results , 1)
  143.  
  144. self.set_keepalive_mod(redis)
  145.  
  146. for i,value in ipairs(results) do
  147. if is_redis_null(value) then
  148. results[i] = nil
  149. end
  150. end
  151.  
  152. return results, err
  153. end
  154.  
  155. function _M.subscribe( self, channel )
  156. local redis, err = redis_c:new()
  157. if not redis then
  158. return nil, err
  159. end
  160.  
  161. local ok, err = self:connect_mod(redis)
  162. if not ok or err then
  163. return nil, err
  164. end
  165.  
  166. local res, err = redis:subscribe(channel)
  167. if not res then
  168. return nil, err
  169. end
  170.  
  171. res, err = redis:read_reply()
  172. if not res then
  173. return nil, err
  174. end
  175.  
  176. redis:unsubscribe(channel)
  177. self.set_keepalive_mod(redis)
  178.  
  179. return res, err
  180. end
  181.  
  182. local function do_command(self, cmd, ... )
  183. if self._reqs then
  184. table.insert(self._reqs, {cmd, ...})
  185. return
  186. end
  187.  
  188. local redis, err = redis_c:new()
  189. if not redis then
  190. return nil, err
  191. end
  192.  
  193. local ok, err = self:connect_mod(redis)
  194. if not ok or err then
  195. return nil, err
  196. end
  197.  
  198. local fun = redis[cmd]
  199. local result, err = fun(redis, ...)
  200. if not result or err then
  201. -- ngx.log(ngx.ERR, "pipeline result:", result, " err:", err)
  202. return nil, err
  203. end
  204.  
  205. if is_redis_null(result) then
  206. result = nil
  207. end
  208.  
  209. self.set_keepalive_mod(redis)
  210.  
  211. return result, err
  212. end
  213.  
  214. for i = 1, #commands do
  215. local cmd = commands[i]
  216. _M[cmd] =
  217. function (self, ...)
  218. return do_command(self, cmd, ...)
  219. end
  220. end
  221.  
  222. function _M.new(self, opts)
  223. opts = opts or {}
  224. local timeout = (opts.timeout and opts.timeout * 1000) or 1000
  225. local db_index= opts.db_index or 0
  226.  
  227. return setmetatable({
  228. timeout = timeout,
  229. db_index = db_index,
  230. _reqs = nil }, mt)
  231. end
  232.  
  233. return _M

我的调用,生成uuid后存储到redis里 :

  1. ngx.req.read_body()
  2. local args= ngx.req.get_uri_args()
  3. for k,v in pairs(args) do
  4. local mac = v
  5. ngx.say(mac)
  6. end
  7.  
  8. function guid()
  9. local seed={'e','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}
  10. local tb={}
  11. for i=1,32 do
  12. table.insert(tb,seed[math.random(1,16)])
  13. end
  14. local sid=table.concat(tb)
  15. return string.format('%s-%s-%s-%s-%s',
  16. string.sub(sid,1,8),
  17. string.sub(sid,9,12),
  18. string.sub(sid,13,16),
  19. string.sub(sid,17,20),
  20. string.sub(sid,21,32)
  21. )
  22. end
  23.  
  24. --print('execute_time='..tostring(os.clock()-start_time))
  25. local redis = require "resty.redis_iresty"
  26. local red = redis:new()
  27. redis:auth("password")
  28.  
  29. local s=0
  30. --local start_time=os.clock()
  31. while s<50 do
  32. s=s+1
  33. local uuid = guid()
  34. local ok, err = redis:hset("lbs",uuid,"1")
  35. if not ok then
  36. ngx.say("failed to set dog: ", err)
  37. return
  38. end
  39. ngx.say(s,uuid)
  40. end

  

 

认为Openresty完全可以替代nginx

Openresty(Lua+Nginx)实践的更多相关文章

  1. 【原创】大叔经验分享(77)openresty(nginx+lua)发http请求

    openresty(nginx+lua)发http请求 利用location+proxy_pass间接实现 location ^~ /test/http { internal; proxy_pass ...

  2. openresty(nginx+lua)初识

    1.新增项目配置文件: vim /usr/example/example1.conf --将以下内容加入example1.conf server { listen 80; server_name _; ...

  3. openresty+lua在反向代理服务中的玩法

    openresty+lua在反向代理服务中的玩法 phith0n · 2015/06/02 10:35 0x01 起因 几天前学弟给我介绍他用nginx搭建的反代,代理了谷歌和维基百科. 由此我想到了 ...

  4. openresty+lua+kafka方案与Tomcat接口并发度对比分析

    1.openresty+lua+kafka 1.1 openresty+lua+kafka方案 之前的项目基于nginx反向代理后转发到Tomcat的API接口进行业务处理,然后将json数据打入ka ...

  5. Openresty+Lua+Kafka实现日志实时采集

    简介 在很多数据采集场景下,Flume作为一个高性能采集日志的工具,相信大家都知道它.许多人想起Flume这个组件能联想到的大多数都是Flume跟Kafka相结合进行日志的采集,这种方案有很多他的优点 ...

  6. Openresty Lua协程调度机制

    写在前面 OpenResty(后面简称:OR)是一个基于Nginx和Lua的高性能Web平台,它内部集成大量的Lua API以及第三方模块,可以利用它快速搭建支持高并发.极具动态性和扩展性的Web应用 ...

  7. OpenResty Lua钩子调用完整流程

    前面一篇文章介绍了Openresty Lua协程调度机制,主要关心的是核心调度函数run_thread()内部发生的事情,而对于外部的事情我们并没有涉及.本篇作为其姊妹篇,准备补上剩余的部分.本篇将通 ...

  8. openresty + lua 1、openresty 连接 mysql,实现 crud

    最近开发一个项目,公司使用的是 openresty + lua,所以就研究了 openresty + lua.介绍的话,我就不多说了,网上太多了. 写这个博客主要是记录一下,在学习的过程中遇到的一些坑 ...

  9. 用lua nginx module搭建一个二维码

    用lua nginx module搭建一个二维码(qr code)生成器 作者 vinoca 發布於 2014年10月31日 如果有VPS,或者开源的路由器,安装一个nginx,添加lua-nginx ...

  10. linux环境中,openssl升级及openresty中nginx基于新版本openssl重新编译

    需求说明: 最近在对系统进行安全扫描的时候,出现了openssl版本的问题,建议对openssl版本进行升级,在此记录下升级过程. 环境说明: 操作系统:RHEL 6.6 升级操作过程: 1.下载最新 ...

随机推荐

  1. Visual Studio 2012 编译错误【error C4996: 'scanf': This function or variable may be unsafe. 】的解决方案

    在VS 2012 中编译 C 语言项目,如果使用了 scanf 函数,编译时便会提示如下错误: error C4996: 'scanf': This function or variable may ...

  2. JS-移动端判断上拉和下滑

    一.手指触屏,利用touchstart和touchend计算前后滑动距离,判断是上拉还是下滑. 二.js中距离:pageY.clientY.offsetY的区别: offsetY:相对于父节点的偏移距 ...

  3. 【LeetCode3】Longest Substring Without Repeating Characters★★

    题目描述: 解题思路: 借用网上大神的思想:the basic idea is, keep a hashmap which stores the characters in string as key ...

  4. css学习之LInk & import

    一.用link加载外部样式表 1.放置位置:放在head元素中 2.样式表中只能包含样式规则,不能包含其他标记语言.如出现了标记,会导致其中一部分或全部被忽略. 3.type = 'text/css' ...

  5. 基于Verilog的CRC-CCITT校验

    由于笔者在自己设计CRC模块时遇到很多问题,在网上并未找到一篇具有实际指导意义的文章,在经过多次仿真修改再仿真之后得到了正确的结果,故愿意在本文中为大家提供整个设计流程供大家快速完成设计.本文章主要针 ...

  6. SparkSQL与Hive的整合

    其他的配置hive基本配置就不记录了!! 1. 拷贝$HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/2. 在$SPARK_HOME/conf/目录中,修改 ...

  7. JavaWeb基础—过滤器Filter

    一.概念 JavaWeb三大组件之一(组件都有一个特性,需要在web.xml中配置) 过滤器:会在一组资源(jsp servlet等)的前面执行,可以让请求得到目标资源,也可以终止请求,不再继续 也就 ...

  8. 20155301 滕树晨linux基础——linux进程间通信(IPC)机制总结

    20155301 滕树晨linux基础--linux进程间通信(IPC)机制总结 共享内存 共享内存是在多个进程之间共享内存区域的一种进程间的通信方式,由IPC为进程创建的一个特殊地址范围,它将出现在 ...

  9. java中package import区别

    他们两个是互逆过程package freedom.bean;将你这个类放在了/freedom/bean/这个文件夹下面要使用的话import freedom.bean.*;导入这个类

  10. JavaWeb总结(三)

    什么是Servelt - 是运行在Web服务器或应用服务器上的Java程序 - 在Web上创建动态内容的有效而强大的解决方案 - 由容器来管理生命周期与Web服务器交互 Servlet规范的组成 Ja ...