Nginx之lua开发实战

1.  Redis操作    

    1.  nginx支持3种方法访问Redis

        1)HttpRedis : 提供指令少,功能单一

        2)HttpRedis2Module : 比 HttpRedis 操作更灵活,功能更强大

        3)Lua-resty-redis 库 : Openresty 提供的操作 Redis 的接口库,需要通过 --with-luajit 编译安装
    2.  HttpRedis

        只支持Redis的get命令和select命令
        1.  例子:

http {
    upstream redis_backend {
        server 127.0.0.1:6379;
    }

    server {
        listen 80;

        location / {
            set $redis_key $uri;
            redis_pass redis_backend;
            default_type text/html;
            error_page 404 = @backend;
        }

        location @backend {
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

        2.  请求地址:  curl http://localhost/ceshi.html  

            因为在redis中,没有ceshi.html这个key,所以导致访问404错误,请求反向代理到8080上。

            在redis中,创建对应的key,ceshi.html,那么返回对应的key的值。

        3.  HttpRedis常用的指令

            1.  redis_pass

                语法:  redis_pass [name:port]

                默认:  none

                上下文:  http,server,location

            2.  redis_bind

                语法:  redis_bind [addr]

                默认:  none

                上下文:  http,server,location

            3.  redis_read_timeout

                语法:  redis_read_timeout [time]

                默认:  60000

                上下文:  http,server,location

                说明:  以毫秒为单位的redis读取超时值  

            4.  redis_send_timeout

                语法:  redis_send_timeout [time]

                默认:  60000

                上下文:  http,server,location

                说明:  以毫秒为单位的redis发送超时值

            5.  redis_buffer_size

                语法:  redis_buffer_size [size]

                默认:  see getpagesize

                上下文:  http,server,location

                说明:  以字节为单位的发送和接受缓冲区尺寸

            6.  redis_next_upstream

                语法:  redis_next_upstream [error] [timeout] [invalid_response] [not_fount] [off]

                默认:  error timeout

                上下文:  http,server,location

                说明:  定义哪个失败条件可以引导请求向下一个upstream内server项流转。

                      只有在redis_pass中使用的upstream中有两个以上server的情况下才有效。                

            7.  redis_connect_timeout

                语法:  redis_connect_timeout [time]

                默认:  60000

                上下文:  http,server,location

                说明:  以毫秒为单位的redis连接超时值

            8.  redis_gzip_flag

                语法:  redis_gzip_flag [number]

                默认:  unset

                上下文:  location

                说明:  使用gzip压缩标志

        4.  HttpRedis变量

            1.  $redis_key  key值

            2.  $redis_db  redis数据库数量

    3.  HttpRedis2Module

        1.  模块

            ngx_http_redis2_module

            作用:  允许Nginx通过TCP协议直接与Redis通信,支持多条命令

        2.  安装方式

./configure --add-module=/path/to/redis2-nginx-module
make && make install

            如果你用的是OpenResty,这个模块已经内置。

        3.  例子1

            取值赋值        

http {
    server {
        listen 8080;

        # GET 取值
        location /redis2_get {
            set_unescape_uri $key $arg_key;
            redis2_query get $key;
            redis2_pass 127.0.0.1:6379;
        }

        # SET 赋值
        location /redis2_set {
            set_unescape_uri $key $arg_key;
            set_unescape_uri $value $arg_value;
            redis2_query set $key $value;
            redis2_pass 127.0.0.1:6379;
        }

        # 删除键
        location /redis2_del {
            set_unescape_uri $key $arg_key;
            redis2_query del $key;
            redis2_pass 127.0.0.1:6379;
        }
    }
}

            测试命令:

# 写入
curl "http://localhost:8080/redis2_set?key=user:1&value=Tom"

# 读取
curl "http://localhost:8080/redis2_get?key=user:1"

# 删除
curl "http://localhost:8080/redis2_del?key=user:1"

        4.  例子2

            一次执行多条命令

location /redis2_multi {
    set_unescape_uri $key1 $arg_key1;
    set_unescape_uri $val1 $arg_val1;
    set_unescape_uri $key2 $arg_key2;
    set_unescape_uri $val2 $arg_val2;

    redis2_query set $key1 $val1;
    redis2_query set $key2 $val2;
    redis2_query mget $key1 $key2;

    redis2_pass 127.0.0.1:6379;
}

            访问地址:  curl "http://localhost:8080/redis2_multi?key1=a&val1=1&key2=b&val2=2"

        5.  常用指令

| 指令名 | 作用 | 使用范围 |
| ------------------------ | ---------------------------- | ---------------------- |
| `redis2_query` | 指定要发送到 Redis 的命令(可多次调用) | location |
| `redis2_pass` | 指定 Redis 服务器地址(IP或upstream) | location |
| `set_unescape_uri` | 解码 URI 参数,用于 redis key/value | location |
| `redis2_connect_timeout` | 设置连接 Redis 的超时时间 | http, server, location |
| `redis2_send_timeout` | 设置向 Redis 发送请求的超时时间 | http, server, location |
| `redis2_read_timeout` | 设置从 Redis 读取响应的超时时间 | http, server, location |
| `redis2_buffer_size` | 设置接收 Redis 响应的 buffer 大小 | http, server, location |
| `redis2_next_upstream` | 当连接失败时,指定是否重试下一个 upstream | location |
| `redis2_raw_queries` | 直接发送原始 Redis 协议命令(高级用法) | location |

            1.  redis2_query  执行redis命令,可以多次使用

location /get {
    set_unescape_uri $key $arg_key;
    redis2_query get $key;
    redis2_pass 127.0.0.1:6379;
}


location /multi {
    redis2_query set foo 123;
    redis2_query set bar 456;
    redis2_query mget foo bar;
    redis2_pass 127.0.0.1:6379;
}  

            2.  redis2_pass  指定redis地址  

location /redis {
    redis2_query get foo;
    redis2_pass 127.0.0.1:6379;
}

另外一种写法
upstream redis_backend {
    server 127.0.0.1:6379;
    server 127.0.0.2:6379 backup;
}

location / {
    redis2_query get foo;
    redis2_pass redis_backend;
}

            3.  set_unescape_uri  用于将请求参数解码后存入变量,避免key/value被URL编码

set_unescape_uri $key $arg_key;
set_unescape_uri $value $arg_value;
redis2_query set $key $value;

            4.  redis2_connect_timeout  设置连接redis的超时时间(毫秒或秒)

redis2_connect_timeout 100ms;

                默认60s

            5.  redis2_send_timeout  设置向redis发送数据的超时时间

redis2_send_timeout 200ms;

            6.  redis2_read_timeout  设置从redis读取响应的超时时间

redis2_read_timeout 1s;

            7.  redis2_buffer_size  设置接受redis回复的buffer大小,默认是4k

redis2_buffer_size 8k;

            8.  redis2_next_upstream  指定如果连接失败或超时,是否重试下一个upstream

redis2_next_upstream error timeout invalid_response;

                可选项包括:

                  error

                  timeout

                  invalid_response

                  not_found

                  off

            9.  redis2_raw_queries  允许直接发送redis协议格式的命令

    4.  lua-resty-redis

      

  

  

  

    

  

    

  

      

  

  

  

                        

                              

        

posted @ 2025-11-07 15:33  奋斗史  阅读(18)  评论(0)    收藏  举报