<!-- review: finished -->

<a id="external-redis2"></a>

# Redis2

`redis2` 模块提供与 Redis 2.x 服务器交互的能力。它实现了完整的统一 Redis 2.0 协议,包括对 Redis 管道的支持。

<a id="installation-23"></a>

## 安装

要 [安装](https://cn.angie.software//angie/docs/installation/index.md#install-packages) 该模块,请使用以下软件包之一:

- Angie:`angie-module-redis2`
- Angie PRO:`angie-pro-module-redis2`

<a id="loading-the-module-23"></a>

## 加载模块

要使用该模块,必须在 `main{}` 上下文中加载它。
下面的示例还使用了 [set-misc](https://cn.angie.software//angie/docs/installation/external-modules/set-misc.md#external-set-misc) 模块的指令:

```nginx
load_module modules/ndk_http_module.so;
load_module modules/ngx_http_set_misc_module.so;
load_module modules/ngx_http_redis2_module.so;
```

<a id="configuration-example-97"></a>

## 配置示例

```nginx
upstream redis_upstream {
    server 127.0.0.1:6379;
}

server {
    listen       80;
    server_name  localhost;

    # 设置键值
    location /foo {
        set $value 'first';
        redis2_query set one $value;
        redis2_pass redis_upstream;
    }

    # 通过键获取值
    location /bar {
        redis2_query get one;
        redis2_pass redis_upstream;
    }

    # 从查询参数设置键值
    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;
    }

    # 从查询参数通过键获取值
    location /get {
        set_unescape_uri $key $arg_key;
        redis2_query get $key;
        redis2_pass 127.0.0.1:6379;
    }

    # 执行多个管道命令
    location /pipeline {
        set $value 'first';
        redis2_query set one $value;
        redis2_query get one;
        redis2_query set one 'first first';
        redis2_query get one;
        redis2_pass 127.0.0.1:6379;
    }

    # 执行在查询参数中传递的任意命令
    location /cmd {
        set_unescape_uri $cmd $arg_command;
        redis2_raw_query "$cmd\r\n";
        redis2_pass 127.0.0.1:6379;
    }
}
```

#### WARNING
重要!与 Angie 中的 `proxy_pass` 指令不同,不允许在 `redis2_pass` 指令的参数中使用变量。

<a id="request-execution-demonstration"></a>

## 请求执行演示

模块使用示例。

```console
$ curl localhost/foo
+OK

$ curl localhost/bar
$5
first
```

这里 `$5` 是值的长度(5 字节),:samp:first 是值本身。

```console
$ curl 'localhost/set/?key=two&val=second%20value'
+OK

$ curl 'localhost/get/?key=two'
$12
second value

$ curl 'localhost/get/?key=three'
$-1
```

值 `$-1` 表示键 `three` 不存在。

```console
$ curl localhost/pipeline
+OK
$5
first
+OK
$11
first first
```

执行任意 Redis 命令:

```console
$ curl 'localhost/cmd/?command=set%20three%20"third%20value"'
+OK

$ curl 'localhost/cmd/?command=get%20three'
$11
third value
```

<a id="additional-information-24"></a>

## 其他信息

详细文档和源代码可在以下位置获取:
[https://github.com/openresty/redis2-nginx-module](https://github.com/openresty/redis2-nginx-module)。
