Redis Pipelining可以克服网络延迟的限制吗?
将Redis配置为多个可用区(AZ)时可能遇到的问题
据说,当从az-2中的应用程序访问位于az-1上的Redis时,由于az之间的网络延迟问题,会变得较慢。
Redis Pipelining是一种技术。
Spring Data Redis – 10.13. 管道化
Redis提供了对流水线操作的支持,流水线指的是将多个命令发送到服务器而无需等待回复,然后在一个步骤中读取回复。
一般情况下,每次发送到服务器都会发送一个命令,因此与Redis交互大量数据时,会产生大量与服务器的通信。 100个set操作将导致100次通信,同样,100个get操作也会导致100次通信。(set和hash操作也一样)
执行Redis Repositories的findByXX等操作时,背后会运行keys + 记录数的hgetall,因此通信量会变得庞大。
通过Pipeline,将多个命令一次性发送,可以解决网络延迟的问题,因此我们进行了验证,以验证这个假设。
验证的内容
配置模式
本地、AWS(同一个可用区)、AWS(跨可用区)这3种模式进行验证。
Note: I provided a single paraphrased option in Chinese.
本地
在本地PC上的Java应用程序中,通过Docker Desktop上的本地PC Redis容器访问的配置。
ThinkPad X390
Redis 6.0.9 (通过docker运行命令:docker run -p 6379:6379 redis)
OpenJDK版本 “11.0.2” 2019-01-15
Spring Data Redis版本2.4.2
AWS(具有相同VPC和相同可用区)
在同一个VPC和同一个可用区内,分别启动Redis服务器和Java客户端服务器,并在同一个可用区内进行访问配置。
• Redis服务器
东京区域,ap-northeast-1c
Amazon Linux 2
m5.xlarge
Redis 6.0.9
・Java客户端
东京地区,ap-northeast-1c
Amazon Linux2
t2.micro
Openjdk版本 “11.0.9.1” 2020-11-04 LTS(Coretto)
Spring Data Redis 2.4.2
AWS(在同一虚拟私有云中、不同可用区)
在同一个VPC上,在不同的可用区内分别启动Redis服务器和Java客户端服务器,并配置跨可用区访问。
・Redis服务器
东京区域,ap-northeast-1c
Amazon Linux2操作系统
m5.xlarge服务器规格
Redis版本为6.0.9
・Java客户端
东京区域,ap-northeast-1d
亚马逊Linux2
t2.micro
OpenJDK版本”11.0.9.1″ 2020-11-04 LTS(Coretto)
Spring Data Redis 2.4.2
运行验证应用程序
唱片数量
对1、10、100和1000进行四种情况的验证。
对Redis数据库的访问模式
進行set操作和get操作各執行記錄數量的三倍,測量set和get操作的平均處理時間[ms]。
set操作為使用”key[n]”和”value[n]”。
get操作為先執行”keys *”,然後分別根據每個key進行get操作。
对于Redis的访问方式
验证以下3种模式:
* 逐个发出命令的方法
* 使用Pipelining发出命令的方法
* 使用Parallel Stream发出命令的方法
验证结果
纵轴表示处理时间(毫秒)。
本地

AWS(同一个可用区域)

亚马逊云服务(AWS)

考察 – 了解情况或评估某事物的行动或过程。
-
- Pipeliningは少量のレコードを扱う場合のオーバーヘッドが結構ある(1件の処理でnormalやParallel Steramに比べて倍以上時間がかかっている)。
-
- azまたがりのケースでは、Pipeliningは有効であるが、100件まではParallel Streamとほとんど変わらなかった。1000件でようやく差が出た。
- Parallel Streamかなり優秀。とはいえ、裏でスレッドを生成して実行する仕組みなので、CPU負荷がかかることに注意する。
得出结论
Redis Pipelining能够超越网络延迟的限制,但也带来了一些开销,所以最好只在处理数百到数千个数据的批量操作中使用。
对于Java来说,考虑到CPU负载问题,大多数情况下使用Parallel Stream应该能够解决。
参考
-
- Spring Data Redis – 10.13. Pipelining
-
- Spring Data Redis(Lettuce)のReadFrom.NEARESTはクラスタ構成でのみ有効な件
- 動作検証アプリのソース