jedis zrangebyscore的返回值踩坑记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 最近在使用jedis 操作redis,在处理一个sortedset key的返回值时遇到一个棘手的问题。

最近在使用jedis 操作redis,在处理一个sortedset key的返回值时遇到一个棘手的问题。


有如下报错:

java.lang.ClassCastException: java.lang.String cannot be cast to redis.clien


具体操作是这样子:

zrangebyscore 返回的是一个数据集合,如果要接这个返回值,你又不想new 一个bean,  tuple 是一个不错的选择。


需求中需要将该方法的返回值的第三个字段截取出来放入List<String> 中。


此时报错

java.lang.ClassCastException: java.lang.String cannot be cast to redis.clien

  public  List<Tuple>  getReferenceOpeMove(String referenceOpe, String eqpt, LocalDateTime nowTime, Jedis jedis){
        List<Tuple> tupleList = new ArrayList<>();
        Pipeline pipe = jedis.pipelined();
        nowTime = nowTime.plusMinutes(15);
        String refKey = "";
        // 根据rule中设定机台取参照配置中的机台
        List <MBisDataDN> referenceEqpt= matchUtil.getSPRCMatch(eqpt);
//        String key = referenceOpe + ":" + referenceEqpt.get(0).getCode();
        if(referenceEqpt.size() > 0){
             refKey = referenceEqpt.get(0).getItem() + ":" + referenceEqpt.get(0).getCode().substring(0,6); // 前台有必要设定参照站点吗? 既然要取一次配置则不需要再设定
        }
        long fiStartTime = nowTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() - (60 * 60);
        long fiEndTime = nowTime.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
//        pipe.zrangeByScore(refKey,fiStartTime,fiEndTime);
        pipe.zrangeByScore(refKey,String.valueOf(fiStartTime),String.valueOf(fiEndTime));
        final List<Object> objects = pipe.syncAndReturnAll();
        objects.stream().map(p -> ((LinkedHashSet<Tuple>) p)).filter(p -> p.size() > 0).forEach(p -> {
            tupleList.addAll(p);
        });
        return tupleList.parallelStream().collect(Collectors.toList());
    }

仔细分析下这段代码,发现zrangebyscore的返回值是set,  为了使用pipeLined 转为List<Tuple>.


看jedis下面这段代码, 我们应该将返回值改为

Set<String>, 这样再返回给List<String> 不再报错

不过没有用到pipeLine  是否会有redis性能问题。待验证

20210723180626843.png

update 2021年8月12日17:25:25


不使用Pipeline时,客户端是发送一个命令、读取一次结果。而使用Pipeline时,客户端先把一批命令暂存到buffer中,然后一次性把buffer中的命令发送到服务端,服务端处理多个命令后批量返回结果,这样做的好处是可以减少来回网络IO的次数,降低延迟,提高访问性能。当然,Redis服务端的buffer内存也会相应增长,可以控制好Pipeline命令的数量防止buffer超限。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
网络协议 NoSQL Java
Jedis介绍及常见问题分析
本文主要介绍Jedis的使用方法及常见问题的排查分析方法
12599 0
|
5月前
|
存储 NoSQL Java
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
Redis系列学习文章分享---第二篇(Redis快速入门之Java客户端--Jedis+连接池+SpringDataRedis+RedisTemplate+RedisSerializer+Hash)
254 0
|
6月前
|
NoSQL Java Redis
redis-学习笔记(Jedis 前置知识)
redis-学习笔记(Jedis 前置知识)
46 1
|
6月前
|
监控 Java
【十一】springboot整合异步调用并获取返回值
【十一】springboot整合异步调用并获取返回值
147 0
|
缓存 前端开发 安全
SpringBoot如何缓存方法返回值?
为什么要对方法的返回值进行缓存呢? 简单来说是为了提升后端程序的性能和提高前端程序的访问速度。减小对db和后端应用程序的压力。 一般而言,缓存的内容都是不经常变化的,或者轻微变化对于前端应用程序是可以容忍的。 否则,不建议加入缓存,因为增加缓存会使程序复杂度增加,还会出现一些其他的问题,比如缓存同步,数据一致性,更甚者,可能出现经典的缓存穿透、缓存击穿、缓存雪崩问题。
63 0
|
缓存 NoSQL Redis
细说一下RedisTemplate的使用方法(七)
上篇文章我们学习了三个方法,分别是getExpire(K key)、getExpire(K key, TimeUnit timeUnit)、move三个方法,今天我们学习了RedisTemplate中的delete、expireAt、expire三个方法。
1063 0
细说一下RedisTemplate的使用方法(七)
|
NoSQL 数据处理 Redis
细说一下RedisTemplate的使用方法(十二)
上篇文章中学习了操作Redis中Set数据类型的两个主要方法,分别是opsForSet方法和boundHashOps方法,这两个方法也是目前最为常用的操作Set数据类型的方法了。今天我们就要来看下一个Redis数据类型的操作方法了,也是这个系列的最后一篇文章了。
361 0
|
Java 数据库连接 mybatis
【SSM框架】Mybatis详解10(源码自取)之入参、返回值map
本节主要复习入参和返回值。 指定参数位置、入参是map、返回值是map 和我一起复习下去你可以获得一个比较完美框架demo,并且深刻体会框架。 坚持到最后的源码解析你会收获更多哦,加油坚持!!!
【SSM框架】Mybatis详解10(源码自取)之入参、返回值map
|
NoSQL JavaScript Java
【Redis高手修炼之路】Jedis——Jedis的基本使用
【Redis高手修炼之路】Jedis——Jedis的基本使用
432 0
【Redis高手修炼之路】Jedis——Jedis的基本使用
|
NoSQL Java Redis
jedis-jedis 常规操作演示 | 学习笔记
快速学习jedis-jedis 常规操作演示