一文教你Redis Cluster批量操作的所有姿势(附代码实操)

本文探讨了在Redis Cluster中进行批量操作的优化方法,包括串行IO、归并IO、并行归并IO和使用hash-tag。通过实例解析了不同方法的网络次数和性能,并介绍了hash-tag功能,它允许强制多个键分配到同一节点,以实现高性能的批量操作,但也可能导致集群负载不均。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

很多业务都可能出现同时操作大量Key的情况,比如要同时获取多个用户的信息。

由于 Redis 数据量和访问量的持续增长,造成需要添加大量节点做水平扩容,导致键值分布到更多的节点上,批量操作通常需要从不同节点上获取,相比于单机批量操作只涉及到一次网络操作,Redis Cluster环境下的批量操作会涉及到多次网络时间。大家都知道Redis的性能瓶颈其实不是CPU,而是网络,所以我们要针对这种情况做出优化,尽可能少的减少网络请求的次数。

优化思路

我们以Redis单机批量获取 n 个字符串Key为例,有三种实现方法:

  • 客户端 n 次 get:n 次网络 + n 次 get 命令本身。
  • 客户端 1 次 pipeline get:1 次网络 + n 次 get 命令本身。
  • 客户端 1 次 mget:1 次网络 + 1 次 mget 命令本身。

我们可以发现,在单个节点的情况下,使用mget是性能最好的方法。

下面我们将结合 Redis 集群的一些特性对四种分布式的批量操作方式进行说明。

实践

1.串行IO

由于 n 个 key 是比较均匀的分布在 Redis 集群的各个节点上,因此无法使用 mget 命令一次性获取,所以通常来讲要获取 n 个 key 的值,最简单的方法就是逐次执行 n 次 get 操作, 很明显这种操作时间复杂度较高,它的网络次数是 n,很显然这种方案不是最优的,但是实现起来比较简单:

List<String> serialMGet(List<String> keys) {
   
    // 结果集
    List<String> values = new ArrayList<String>();
    // n次串行get
    for (String key : keys) {
   
        String value = jedisCluster.get(key);
        values.add(value);
    }
    return values;
}

2.归并IO

以 Redis Cluster 为例,Redis Cluster 使用 CRC16 算法计算出散列值,再取对 16384 的余数就可以算出 slot 值,smart 客户端会保存 slot 和节点的对应关系,有了这两个数据就可以对将属于同一个节点的 key 进行归并,得到每个节点的 key 子列表,之后对每个节点执行 mget 或者 pipeline 操作,它的网络次数是 node 的个数,整个过程下图所示,很明显这种方案比第一种要好很多,但是如果节点数足够多,还是有一定的性能问题。

Map<String, String> serialIOMget(List<String> keys) {
   
    //
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值