## 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.md)配置参考。
配置相应集群所定义的[Hash环负载平衡](../../v1APIreference/Clustermanager/Cluster.md)。
如果需要进行主动健康检查,则应该对群集使用[Redis健康检查](../../Configurationreference/Clustermanager/Healthchecking.md)配置。
如果需要被动健康检查,还要配置[异常检测](../../v1APIreference/Clustermanager/Cluster.md)。
为了进行被动健康检查,将超时,命令超时和连接关闭映射连接到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"
```
### 返回
- [架构介绍](../Architectureoverview.md)
- [简介](../../Introduction.md)
- [首页目录](../../README.md)
- 首页
- 简介
- Envoy是什么
- 架构介绍
- 术语
- 线程模型
- 监听器
- L3/L4网络过滤器
- HTTP连接管理
- HTTP过滤器
- HTTP路由
- gRPC
- WebSocket支持
- 集群管理
- 服务发现
- 健康检查
- 连接池
- 负载均衡
- 异常检测
- 熔断
- 全局限速
- TLS
- 统计
- 运行时配置
- 跟踪
- TCP代理
- 访问日志
- MongoDB
- DynamoDB
- Redis
- 热重启
- 动态配置
- 初始化
- 逐出
- 脚本
- 部署
- 业界对比
- 获得帮助
- 历史版本
- 编译安装
- 编译
- 参考配置
- 演示沙箱
- 前端代理
- Zipkin跟踪
- Jaeger跟踪
- gRPC桥接
- 构建Envoy Docker镜像
- 工具
- 配置参考
- V1 API 概述
- V2 API 概述
- 监听器
- 网络过滤器
- TLS客户端身份认证
- Echo
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP连接管理器
- 路由匹配
- 流量转移/分流
- HTTP头部操作
- HTTP头部清理
- 统计
- 运行时设置
- 路由发现服务
- HTTP过滤器
- 缓存
- CORS过滤器
- 故障注入
- DynamoDB
- gRPC HTTP/1.1 桥接
- gRPC-JSON 转码过滤器
- gRPC-Web 过滤器
- 健康检查
- 速率限制
- 路由
- Lua
- 集群管理
- 统计
- 运行时设置
- 集群发现服务
- 健康检查
- 熔断
- 访问日志
- 限速服务
- 运行时配置
- 路由表检查工具
- 运维管理
- 命令行选项
- 热重启
- 管理接口
- 统计概述
- 运行时配置
- 文件系统
- 自定义扩展示例
- V1 API参考
- 监听器
- 网络过滤器
- TLS客户端身份认证
- Echo
- HTTP连接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP路由配置
- 虚拟主机
- 路由
- 虚拟集群
- 速率限制配置
- 路由发现服务
- HTTP过滤器
- 缓存
- CORS过滤器
- DynamoDB
- 故障注入
- gRPC HTTP/1.1 桥接
- gRPC-JSON 转码过滤器
- gRPC-Web 过滤器
- 健康检查
- Lua
- 速率限制
- 路由
- 集群管理
- 集群
- 健康检查
- 熔断
- TLS上下文
- 异常值检测
- HASH环负载均衡配置
- 异常检测
- 集群发现服务
- 服务发现服务
- 访问日志
- 管理接口
- 限速服务
- 运行时配置
- 跟踪
- V2 API参考
- 启动引导
- 监听&监听发现
- 集群&集群发现
- 服务发现
- 健康检查
- HTTP路由管理&发现
- TLS配置
- 通用的类型
- 网络地址
- 协议选项
- 发现API
- 限速组件
- 过滤器
- 网络过滤器
- TLS客户端身份认证
- HTTP连接管理
- Mongo代理
- 速率限制
- Redis代理
- TCP代理
- HTTP过滤器
- 缓存
- 故障注入
- 健康检查
- Lua
- 速率限制
- 路由
- gRPC-JSON转码器
- 常见访问日志类型
- 常见故障注入类型
- FAQ
- Envoy有多快?
- 我在哪里获得二进制文件?
- 我如何设置SNI?
- 如何设置区域感知路由?
- 我如何设置Zipkin跟踪?