Redis: pipeline基本使用

基本介绍

pipeline即管道的意思,在Redis中,它表示的是一次性执行多条命令。

  • 在原生模式下,

    每执行一次redis命令,都需要经过发送命令(I/O)、执行命令(内存)和返回结果(I/O))三个阶段。

    其中,主要耗时在发送命令与返回结果。

  • 在pipeline模式下,

    一次性执行多条命令,也只需要一次发送命令和一次返回结果。节省了大量花费在I/O上的耗时。在 Pipeline 模式下,客户端可以一次性发送多个命令到 Redis 服务器,而无需等待每个命令的响应。Redis 服务器接收到这批命令后,会依次执行它们并返回响应。

pipeline模式的操作是非原子性的,若需要批量操作保持原子性,可以使用redis.call,执行LUA脚本的方式实现

但是,需要注意的是,Pipeline是不保证原子性的,他的多个命令都是独立执行的,Redis并不保证这些命令可以以不可分割的原子操作进行执行。这是Pipeline和Redis的事务的最大的区别。
虽然都是执行一些相关命令,但是Redis的事务提供了原子性保障,保证命令执行以不可分割、不可中断的原子性操作进行,而Pipeline则没有原子性保证。
但是他们在命令执行上有一个相同点,那就是如果执行多个命令过程中,有一个命令失败了,其他命令还是会被执行,而不会回滚的

基本使用

使用redisTemplate执行批量查询

/**
     * 执行查询redis
     *
     * @param
     * @param <T>
     */
    public <T> List<T> queryObjectListByKeyList(List<String> keyList, final Class<T> clazz) {

        List<Object> results = stringRedisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                for (String key : keyList) {
                    connection.get(key.getBytes());
                }
                return null;
            }
        });

        List<T> resultList = new ArrayList<>();
        for (Object result : results) {
            if (result != null && StringUtils.isNotBlank((String) result)) {
                resultList.add(JSONObject.parseObject((String) result, clazz));
            }
        }
        return resultList;
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值