# Redis

Envoy可以做为Redis代理，在集群中的实例之间对命令进行分区。在这种模式下，Envoy的目标是保持可用性和分区容错的一致性。将Envoy与Redis集群进行比较时，这是重点。Envoy的缓存设计的不足够强大，这意味着它不会尝试协调不一致的数据，无法保持全局一致的群集成员关系视图。

Redis项目提供了与Redis相关的分区的全面参考。请参阅“[分区](https://redis.io/topics/partitioning)：如何在多个Redis实例之间分割数据”。

**Envoy Redis的特点**：

* [Redis协议](https://redis.io/topics/protocol)编解码
* 基于Hash散列的分区
* Ketama发行
* 详细的命令统计
* 主动和被动健康检查

**未来计划增强特性**：

* 补充时间统计
* 断路
* 请求分散命令
* 复制
* 内置重试
* 跟踪
* 哈希标记

## 配置

有关过滤器配置的详细信息，请参阅[Redis代理过滤器](../../configurationreference/networkfilters/redisproxy)配置参考。

配置相应集群所定义的[Hash环负载平衡](../../v1apireference/clustermanager/cluster)。

如果需要进行主动健康检查，则应该对群集使用[Redis健康检查](../../configurationreference/clustermanager/healthchecking)配置。

如果需要被动健康检查，还要配置[异常检测](../../v1apireference/clustermanager/cluster)。

为了进行被动健康检查，将超时，命令超时和连接关闭映射连接到5xx。来自Redis的所有其他响应被视为成功。

## 支持的命令

在协议级别，支持管道。不是MULTI（事务块）。尽可能使用流水线来获得最佳性能。

在命令级别，Envoy仅支持可靠地散列到服务器的命令。因此，所有支持的命令都包含一个key。受支持的命令在功能上与原始Redis命令相同，除非可能出现故障。

有关每个命令用法的详细信息，请参阅官方的[Redis命令参考](https://redis.io/commands)。

| 命令               | 组          |
| ---------------- | ---------- |
| DEL              | Generic    |
| DUMP             | Generic    |
| EXISTS           | Generic    |
| EXPIRE           | Generic    |
| EXPIREAT         | Generic    |
| PERSIST          | Generic    |
| PEXPIRE          | Generic    |
| PEXPIREAT        | Generic    |
| PTTL             | Generic    |
| RESTORE          | Generic    |
| TOUCH            | Generic    |
| TTL              | Generic    |
| TYPE             | Generic    |
| UNLINK           | Generic    |
| GEOADD           | Geo        |
| GEODIST          | Geo        |
| GEOHASH          | Geo        |
| GEOPOS           | Geo        |
| HDEL             | Hash       |
| HEXISTS          | Hash       |
| HGET             | Hash       |
| HGETALL          | Hash       |
| HINCRBY          | Hash       |
| HINCRBYFLOAT     | Hash       |
| HKEYS            | Hash       |
| HLEN             | Hash       |
| HMGET            | Hash       |
| HMSET            | Hash       |
| HSCAN            | Hash       |
| HSET             | Hash       |
| HSETNX           | Hash       |
| HSTRLEN          | Hash       |
| HVALS            | Hash       |
| LINDEX           | List       |
| LINSERT          | List       |
| LLEN             | List       |
| LPOP             | List       |
| LPUSH            | List       |
| LPUSHX           | List       |
| LRANGE           | List       |
| LREM             | List       |
| LSET             | List       |
| LTRIM            | List       |
| RPOP             | List       |
| RPUSH            | List       |
| RPUSHX           | List       |
| EVAL             | Scripting  |
| EVALSHA          | Scripting  |
| SADD             | Set        |
| SCARD            | Set        |
| SISMEMBER        | Set        |
| SMEMBERS         | Set        |
| SPOP             | Set        |
| SRANDMEMBER      | Set        |
| SREM             | Set        |
| SSCAN            | Set        |
| ZADD             | Sorted Set |
| ZCARD            | Sorted Set |
| ZCOUNT           | Sorted Set |
| ZINCRBY          | Sorted Set |
| ZLEXCOUNT        | Sorted Set |
| ZRANGE           | Sorted Set |
| ZRANGEBYLEX      | Sorted Set |
| ZRANGEBYSCORE    | Sorted Set |
| ZRANK            | Sorted Set |
| ZREM             | Sorted Set |
| ZREMRANGEBYLEX   | Sorted Set |
| ZREMRANGEBYRANK  | Sorted Set |
| ZREMRANGEBYSCORE | Sorted Set |
| ZREVRANGE        | Sorted Set |
| ZREVRANGEBYLEX   | Sorted Set |
| ZREVRANGEBYSCORE | Sorted Set |
| ZREVRANK         | Sorted Set |
| ZSCAN            | Sorted Set |
| ZSCORE           | Sorted Set |
| APPEND           | String     |
| BITCOUNT         | String     |
| BITFIELD         | String     |
| BITPOS           | String     |
| DECR             | String     |
| DECRBY           | String     |
| GET              | String     |
| GETBIT           | String     |
| GETRANGE         | String     |
| GETSET           | String     |
| INCR             | String     |
| INCRBY           | String     |
| INCRBYFLOAT      | String     |
| MGET             | String     |
| MSET             | String     |
| PSETEX           | String     |
| SET              | String     |
| SETBIT           | String     |
| SETEX            | String     |
| SETNX            | String     |
| SETRANGE         | String     |
| STRLEN           | String     |

## 失败模型

如果Redis抛出一个错误，我们把这个错误作为响应传递给这个命令。 Envoy将错误数据类型的Redis响应视为正常响应，并将其传递给调用者。

Envoy也可以产生自己的错误来回应客户。

| 错误                                    | 含义                                   |
| ------------------------------------- | ------------------------------------ |
| no upstream host                      | 哈希环负载均衡器在为Key选择的环位置上没有可用的主机。         |
| upstream failure                      | 后端在超时期限内没有响应或关闭连接。                   |
| invalid request                       | 命令由于数据类型或长度而被命令拆分器的第一阶段拒绝。           |
| unsupported command                   | 该命令不被Envoy识别，因此不能被服务，因为它不能被散列到后端服务器。 |
| finished with n errors                | 对响应进行求和的分段命令（例如，DEL）将返回接收到的错误的总数。    |
| upstream protocol error               | 碎片命令接收到意外的数据类型或后端以不符合Redis协议的响应进行响应。 |
| wrong number of arguments for command | 特定的命令检查Envoy参数的数量是正确的。               |

在MGET的情况下，无法提取单独Key所产生错误响应。例如，如果我们获取五个Keys和两个Keys的后端超时，我们会得到一个错误的响应代替每个值。

```
$ redis-cli MGET a b c d e
1) "alpha"
2) "bravo"
3) (error) upstream failure
4) (error) upstream failure
5) "echo"
```

## 返回

* [架构介绍]()
* [简介](..)
* [首页目录](../../master)
