小弟在使用redis的管道流中碰到个问题,批量添加数据的反馈结果不能知道

问题描述

使用管道流批量添加数据时,怎么能保证全部添加成功,怎样才能知道哪些数据添加成功了,哪些数据添加失败了

问题出现的环境背景及自己尝试过哪些方法

第一次添加 返回值为[1,1,1,1,1,1,1,1........]
第二次添加 返回值为[2,2,2,2,2,2,2,2........]
并不能知道其中添加的具体情况

相关代码

// 请把代码文本粘贴到下方(请勿用图片代替代码)
//批量增加redis 手动领取红包批量添加

public List<Object> patchAdd(Map<String,List<Object>> params){
    //返回[1, true, 1, true] 1数据在list中的位置 设置过期时间才会返回true和false
    List<Object> returnAll = redisTemplate.executePipelined(new SessionCallback<Object>() {
        @Override
        public <K, V> Object execute(RedisOperations<K, V> redisOperations) throws DataAccessException {
            Set<Map.Entry<String, List<Object>>> entries = params.entrySet();
            for (Map.Entry<String, List<Object>> param : entries) {
                String key = param.getKey();
                List<Object> value = param.getValue();
                lSet(key,value); //过期时间以秒为单位
            }
            return null;
        }
    });
    return returnAll;
}

  public boolean lSet(String key, List<Object> value) {
    try {
        redisTemplate.opsForList().rightPushAll(key, value);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 2.7k
2 个回答

pipeline(管道流)可以简单看做是一批命令的顺序处理,
redis自己是会按命令发出的顺序返回命令执行结果的,
我推测java对redis的访问封装应该保持了这个特性
所以你贴的返回值里[1,1,1,1,1,1,1,1........]
里面的每一个1可能就是对应顺序的redis操作返回码

然后就是查文档的工作了,按返回码判断执行结果

贴一下lset方法

   public boolean lSet(String key, List<Object> value) {
        try {
            redisTemplate.opsForList().rightPushAll(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题