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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
68 6
|
3月前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
70 0
|
8天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
34 13
|
2月前
|
存储 缓存 NoSQL
Redis的高性能之谜
Redis的高性能之谜
41 5
|
2月前
|
NoSQL Go API
go语言操作Redis
go语言操作Redis
|
2月前
|
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
|
1月前
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
16 0
|
2月前
|
存储 消息中间件 NoSQL
Redis的单线程设计之谜:高性能与简洁并存
Redis的单线程设计之谜:高性能与简洁并存
42 0
|
4月前
|
Rust NoSQL API
c++开发redis module问题之如果在加载module时,该module没有执行权限,Redis会如何解决
c++开发redis module问题之如果在加载module时,该module没有执行权限,Redis会如何解决
|
3月前
|
JavaScript 前端开发 Java
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
【Azure 环境】各种语言版本或命令,发送HTTP/HTTPS的请求合集
下一篇
无影云桌面