Nginx嵌入Lua语言实现redis的高性能http接口

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

redis没有直接提供一个http的接口,要是用php,python,当然也是可以实现的。

性能的比较的话,lua的能力要比php强的不少。。。

网上有很多的性能的比较,我也做过几次的压力测试,lua的性能确实很强。。。。




安装nginx,以及lua环境

1
2
3
4
5
6
7
8
9
10
11
git clone https: //github.com/simpl/ngx_devel_kit.git
git clone https: //github.com/chaoslawful/lua-nginx-module.git
git clone https: //github.com/agentzh/redis2-nginx-module.git
git clone https: //github.com/agentzh/set-misc-nginx-module.git
git clone https: //github.com/agentzh/echo-nginx-module.git
yum  -y install pcre pcre-dev*
wget http: //nginx.org/download/nginx-1.3.14.tar.gz
tar zxvf nginx- 1.3 . 14 .tar.gz
cd nginx- 1.3 . 14
./configure --prefix=/usr/local/nginx --add-module=../ngx_devel_kit/ --add-module=../lua-nginx-module --add-module=../redis2-nginx-module --add-module=../ set -misc-nginx-module --add-module=../echo-nginx-module
make && make install



注:在 server 段里,加入代码,如果不加此代码或者设置为 on 时,则需要重启 Nginx。


lua_code_cache off;


Nginx.conf


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server{
       listen  80 ;
       server_name test.lua.com;
                                                                                                                                                                                                                                                                   
       #http: //test.lua.com/lua
       location /hello {
          default_type  "text/plain" ;
          content_by_lua  'ngx.say("Nginx Lua Hello!")' ;
       }
                                                                                                                                                                                                                                                                   
       #GET http: //test.lua.com/get?key=key
       location / get  {
           set_unescape_uri $key $arg_key;
           redis2_query  get  $key;
           redis2_pass  127.0 . 0.1 : 6379 ; #配置redis访问
       }
                                                                                                                                                                                                                                                                   
       #SET http: //test.lua.com/set?key=key&val=value
       location / set  {
           set_unescape_uri $key $arg_key;
           set_unescape_uri $val $arg_val;
           redis2_query  set  $key $val;
           redis2_pass  127.0 . 0.1 : 6379 ;
       }
}
重启Nginx
/etc/init.d/nginx restart


也可以直接用lua调用redis的接口


1
2
3
4
5
6
7
8
9
local ckid = redis.pcall( 'get' ,KEYS[ 1 ])
local meta
if  ckid ~= nil then
     meta = redis.call( 'hgetall' , ckid)
else
     meta =  'none'
     ckid =  'none'
end
return  {ckid, meta}




分享一个完成的实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
location /foo {
        set  $value  'first' ;
        redis2_query  set  one $value;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    # GET / get ?key=some_key
    location / get  {
        set_unescape_uri $key $arg_key;  #  this  requires ngx_set_misc
        redis2_query  get  $key;
        redis2_pass foo.com: 6379 ;
    }
    # GET / set ?key=one&val=first%20value
    location / set  {
        set_unescape_uri $key $arg_key;  #  this  requires ngx_set_misc
        set_unescape_uri $val $arg_val;  #  this  requires ngx_set_misc
        redis2_query  set  $key $val;
        redis2_pass foo.com: 6379 ;
    }
    # multiple pipelined queries
    location /foo {
        set  $value  'first' ;
        redis2_query  set  one $value;
        redis2_query  get  one;
        redis2_query  set  one two;
        redis2_query  get  one;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    location /bar {
        # $  is  not special here...
        redis2_literal_raw_query  '*1\r\n$4\r\nping\r\n' ;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    location /bar {
        var iables can be used below and $  is  special
        redis2_raw_query  'get one\r\n' ;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    # GET /baz? get %20foo%0d%0a
    location /baz {
        set_unescape_uri $query $query_string; #  this  requires the ngx_set_misc module
        redis2_raw_query $query;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    location /init {
        redis2_query del key1;
        redis2_query lpush key1 C;
        redis2_query lpush key1 B;
        redis2_query lpush key1 A;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }
    location / get  {
        redis2_query lrange key1  0  - 1 ;
        redis2_pass  127.0 . 0.1 : 6379 ;
    }





 本文转自 rfyiamcool 51CTO博客,原文链接:http://blog.51cto.com/rfyiamcool/1243004,如需转载请自行联系原作者


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
190 3
|
7月前
|
安全 API 持续交付
阿里云云效产品使用问题之如何从流水线访问内网平台的HTTP接口
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
3月前
|
JSON Java fastjson
Java Http 接口对接太繁琐?试试 UniHttp 框架吧
UniHttp 是一个声明式的 HTTP 接口对接框架,旨在简化第三方 HTTP 接口的调用过程。通过注解配置,开发者可以像调用本地方法一样发起 HTTP 请求,无需关注请求的构建和响应处理细节。框架支持多种请求方式和参数类型,提供灵活的生命周期钩子以满足复杂的对接需求,适用于企业级项目的快速开发和维护。GitHub 地址:[UniAPI](https://github.com/burukeYou/UniAPI)。
|
4月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
296 3
快速上手|HTTP 接口功能自动化测试
|
4月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
3月前
|
Java 数据处理 开发者
Java Http 接口对接太繁琐?试试 UniHttp 框架~
【10月更文挑战第10天】在企业级项目开发中,HTTP接口对接是一项常见且重要的任务。传统的编程式HTTP客户端(如HttpClient、Okhttp)虽然功能强大,但往往需要编写大量冗长且复杂的代码,这对于项目的可维护性和可读性都是一个挑战。幸运的是,UniHttp框架的出现为这一问题提供了优雅的解决方案。
124 0
|
3月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
28 0
|
5月前
|
负载均衡 中间件 Go
五分钟给你的 gRPC 服务加上 HTTP 接口
五分钟给你的 gRPC 服务加上 HTTP 接口
|
5月前
|
NoSQL Java 应用服务中间件
使用Redis和Nginx分别实现限制接口请求频率
这篇文章介绍了如何使用Redis和Nginx分别实现限制接口请求频率的方法,包括具体的命令使用、代码实现和配置步骤。
85 0
|
5月前
|
缓存 算法 应用服务中间件
nginx搭建https服务器
nginx搭建https服务器