Redis 批量操作之pipeline

本文介绍了Redis批量操作的利器——Pipeline,通过对比非pipeline的阻塞方式,阐述了pipeline提高效率的原因。详细讲解了在单机版和集群版Redis中如何使用pipeline,并给出了相应的Java代码示例。
摘要由CSDN通过智能技术生成

业务场景

最近项目中场景需要get一批key的value,因为redis的get操作(不单单是get命令)是阻塞的,如果循环取值的话,就算是内网,耗时也是巨大的。所以想到了redis的pipeline命令。

pipeline简介

非pipeline:client一个请求,redis server一个响应,期间client阻塞
Pipeline:redis的管道命令,允许client将多个请求依次发给服务器(redis的客户端,如jedisCluster,lettuce等都实现了对pipeline的封装),过程中而不需要等待请求的回复,在最后再一并读取结果即可。

单机版

单机版比较简单,直接上代码

//换成真实的redis实例
Jedis jedis = new Jedis();
//获取管道
Pipeline p = jedis.pipelined();
for (int i = 0; i < 10000; i++) {
    p.get(i + "");
}
//获取结果
List<Object> results = p.syncAndReturnAll();

集群版

因为 JedisCluster 本身不支持 pipeline ,所以我们需要对 JedisCluster 进行一些封装。
还是一样,直接上代码

import lombok.extern.slf4j.Slf4j;
import redis.clients.jedis.*;
import redis.clients.jedis.exceptions.JedisMovedDataException;
import redis.clients.jedis.exceptions.JedisRedirectionException;
import redis.clients.util.JedisClusterCRC16;
import redis.clients.util.SafeEncoder;

import java.io.Closeable;
import java.lang.reflect.Field;
import java.util.*;
import java.util.function.BiConsumer;



@Slf4j
public class JedisClusterPipeline extends PipelineBase implements Closeable {


    /**
     * 用于获取 JedisClusterInfoCache
     */
    private JedisSlotBasedConnectionHandler connectionHandler;
    /**
     * 根据hash值获取连接
     */
    private JedisClusterInfoCache clusterInfoCache;

    /**
     * 也可以去继承JedisCluster和JedisSlotBasedConnectionHandler来提供访问接口
     * JedisCluster继承于BinaryJedisCluster
     * 在BinaryJedisCluster,connectionHandler属性protected修饰的,所以需要反射
     *
     *
     * 而 JedisClusterInfoCache 属性在JedisClusterConnectionHandler中,但是这个类是抽象类,
     * 但它有一个实现类JedisSlotBasedConnectionHandler
     */
    private static final Field FIELD_CONNECTION_HANDLER;
    private static final Field FIELD_CACHE;
    static {
        FIELD_CONNECTION_HANDLER = getField(BinaryJedisCluster.class, "connectionHandler");
        FIELD_CACHE = getField(JedisClusterConnectionHandler.class,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值