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发出命令的方法

验证结果

纵轴表示处理时间(毫秒)。

本地

image.png

AWS(同一个可用区域)

image.png

亚马逊云服务(AWS)

image.png

考察 – 了解情况或评估某事物的行动或过程。

    • 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はクラスタ構成でのみ有効な件

 

    動作検証アプリのソース
bannerAds