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
相关文章
|
4月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
99 6
|
9天前
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
41 13
|
3月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
68 5
|
3月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
90 13
|
4月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
95 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
4月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
51 2
|
4月前
|
NoSQL Java 关系型数据库
阿里 P7二面:Redis 执行 Lua,到底能不能保证原子性?
Redis 和 Lua,两个看似风流马不相及的技术点,为何能产生“爱”的火花,成为工作开发中的黄金搭档?技术面试中更是高频出现,Redis 执行 Lua 到底能不能保证原子性?今天就来聊一聊。 
154 1
|
3月前
|
缓存 应用服务中间件 网络安全
Nginx中配置HTTP2协议的方法
Nginx中配置HTTP2协议的方法
227 7
|
4月前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
21天前
|
存储 应用服务中间件 Linux
nginx配置证书和私钥进行SSL通信验证
nginx配置证书和私钥进行SSL通信验证
56 4