有偿问答
面经分享
技术探讨
资料领取
登录
正确的Redis数据类型,让访问时间提高几十倍
社长
1年前
⋅ 532 阅读
接到了一个需求,是通过物品查询分类中涨价排行最高的 N 个子类,再查询每个子类对应的涨价排行最高的 N 个物品。由于数据结构是 hash 类型,全部物品、子类物品 - 价格、物品 - 子类、子类排行。 看到了物品对应`子类`集合和`子类-价格`集合,通过取交集,能将物品对应的子类排行查出来,尝试使用 redis 的 zset 来实现。 > 作者:斗笠小熊猫 > > 原文地址: https://juejin.cn/post/7029274076606627877 但是并发量上来之后,发现 redis 取交集这个操作很耗时。于是用 hash 结构保存数据,再用 java 进行排序,代码多了好几行,但是并发查询的时间大幅度缩短。 ### 原始代码 ``` // 取goods与category的交集,结果放到result中 redisTemplate.opsForZSet().intersectAndStore(goods,category,result); int start = (pageNum-1) * pageSize; // 分页获取集合 Set
> rangeWithScores = redisTemplate.opsForZSet().reverseRangeWithScores(result, start, pageSize - 1); System.out.println(rangeWithScores); ``` ### 优化后代码 ``` // 查询goodId对应的类别 List
categoryList = (List
) redisHash.hGet("good:categorys",goodId); // 查询上面查出类别的价格 List idxPriceList = redisHash.multiGet("category",categoryList); List
idxList = new ArrayList<>(); for (int i = 0;i
idxM = new HashMap<>(); idxM.put("k",boardList.get(i)); idxM.put("v",idxPriceList.get(i)); idxList.add(idxM); } // 种类按价格排序 idxList.sort((o1, o2) -> { return (o1.get("v").toString()).compareTo(o2.get("v").toString()); }); System.out.println(idxList); // 获取最高物品的代码 String code = idxList.get(0).get("k").toString(); // 种类下的物品 List
sList = (List
) redisHash.hGet("category:goods",code); // 查找物品对应价格 List codeList = redisHash.multiGet("good:price",sList); List
codeIdxList = new ArrayList<>(); for (int i = 0;i
idxM = new HashMap<>(); if(null != codeList.get(i)){ idxM.put("k",sList.get(i)); idxM.put("v",codeList.get(i)); codeIdxList.add(idxM); } } // 按价格排序 codeIdxList.sort((o1, o2) -> { return (o1.get("v").toString()).compareTo(o2.get("v").toString()); }); // 分页获取数据 codeIdxList = codeIdxList.stream().limit(pageSize).collect(Collectors.toList()); System.out.println(codeIdxList); ``` ### 小结 当并发 30、50 的时候,使用`redisTemplate.opsForZSet().intersectAndStore`取交集的平均耗时是超过 500ms 的,并且尝试使用 spring 注解,加载多个`redisTemplate`来取交集,发现每个执行时间还是一样,如果只是取交集还可以,由于数据结构复杂需要多个交集操作,多个查询操作,使得整体的查询时间很长,2-3s。 改变 java 代码排序,取出最高的种类,再取出这个种类下的物品,效率更高,查询结果可控制在 100ms 左右。
阅读全部
全部评论:
0
条
我有话说:
@
发送
-- 目录 --
关注官方公众号:
Java问答社
接收最新有赏问答推送!
最新发布
1.
SpringBoot 接口数据加解密技巧,so easy!
2.
一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!
3.
Java8 Stream 极大简化了代码,它是如何实现的?
4.
马上大四了,秋招还是春招好?先找工作还是找实习?
5.
万字详解 Linux 常用指令(值得收藏)
6.
4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
最新评论
部署文档没有了,您能提供下吗
部署文档没有了,能提供下吗
我测你的🐎
源码从哪里获取请问
想学
那篇石墨文档 没有权限查看哇