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

本文涉及的产品
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,如需转载请自行联系原作者


相关文章
|
6月前
|
应用服务中间件 Linux 网络安全
Centos 8.0中Nginx配置文件和https正书添加配置
这是一份Nginx配置文件,包含HTTP与HTTPS服务设置。主要功能如下:1) 将HTTP(80端口)请求重定向至HTTPS(443端口),增强安全性;2) 配置SSL证书,支持TLSv1.1至TLSv1.3协议;3) 使用uWSGI与后端应用通信(如Django);4) 静态文件托管路径设为`/root/code/static/`;5) 定制错误页面(404、50x)。适用于Web应用部署场景。
720 87
|
5月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
1547 7
|
9月前
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
503 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
9月前
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
472 13
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
231 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
网络协议
Lua中实现异步HTTP请求的方法
Lua中实现异步HTTP请求的方法
|
11月前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
155 2
|
NoSQL Java 关系型数据库
阿里 P7二面:Redis 执行 Lua,到底能不能保证原子性?
Redis 和 Lua,两个看似风流马不相及的技术点,为何能产生“爱”的火花,成为工作开发中的黄金搭档?技术面试中更是高频出现,Redis 执行 Lua 到底能不能保证原子性?今天就来聊一聊。 
450 1
|
NoSQL 网络协议 应用服务中间件
redis,memcached,nginx网络组件
redis,memcached,nginx网络组件
117 0
下一篇
oss云网关配置