nginx嵌入lua脚本操作redis

nginx嵌入lua脚本操作redis

此前稍微提过,用nginx里面执行lua脚本,可以执行一些原有无法实现的必须到后端去控制。目前有个需求,是根据不同的传入id,判断其类型,反向代理到不同的项目后端,如果是采用后端来做的话,基本上很难去实现,然而我们在前端用lua去判断ID的类型就OK了,为了保证前端nginx的速度,所以将id的类型存入redis中,由lua去读取redis的数据进行id类型判断。

目前,用在nginx中用lua读取redis的数据有两套方案,一套是用lua自身的redis-client库,一套是采用nginx的redis模块。为了保证性能和可靠性,我们采用lua去用subprocess调用nginx的redis模块进行读取,由于nginx的redis模块只是单纯的做数据的插入和读取,并没有做redis协议的解析,所以,我们如果要使用的话,还必须加lua的redis-parse进行解析数据协议。

如何安装nginx+lua的环境此前已经有文章介绍过了,这里就不在阐述,接下来只需要在该基础上,编译进多两个模块(set-misc-nginx-module,redis2-nginx-module)即可。

定义redis连接池(1024个固定连接):

upstream redis_pool {                server host:6379;                keepalive 1024;  }
定义个get的操作(接收key的连接参数,然后作为key去redis获取原始数据,/rget?key=xxx 来获取,此行为作为接下来的lua使用):
   location /rget{                  default_type 'text/plain';                  set_unescape_uri $key $arg_key;                  redis2_query get $key;                  redis2_pass redis_pool;    }
定义真正的location和lua脚本使用:

        location /rt{                  default_type 'text/plain';                  set $hs '';                  access_by_lua '                          local res = ngx.location.capture("/rget",{                                  args = { key = ngx.var.arg_key }                          }                          ngx.var.hs = res.body;                  ';                  echo $hs;            }
通过lua的capture操作,可以内部发起子进程去调用/rget来获取redis的值,并且赋予$hs变量,需要注意的是,这里得到的res.body是完整的redis数据,没有做任何协议解析,比如如果找不到key对应的value,则$hs是$-1。

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部