这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
问题背景
接到了一个需求,是通过物品查询分类中涨价排行最高的N个子类,再查询每个子类对应的涨价排行最高的N个物品。由于数据结构是hash类型,全部物品、子类物品-价格、物品-子类、子类排行。
看到了物品对应子类
集合和子类-价格
集合,通过取交集,能将物品对应的子类排行查出来,尝试使用redis的zset来实现。
但是并发量上来之后,发现redis取交集这个操作很耗时。于是用hash结构保存数据,再用java进行排序,代码多了好几行,但是并发查询的时间大幅度缩短。
Redis的数据类型可参考: # 【简约入门】Redis的数据类型及常用命令https
原始代码
1 | java复制代码 // 取goods与category的交集,结果放到result中 |
优化后代码
1 | java复制代码 // 查询goodId对应的类别 |
小结
当并发30、50的时候,使用redisTemplate.opsForZSet().intersectAndStore
取交集的平均耗时是超过500ms的,并且尝试使用spring注解,加载多个redisTemplate
来取交集,发现每个执行时间还是一样,如果只是取交集还可以,由于数据结构复杂需要多个交集操作,多个查询操作,使得整体的查询时间很长,2-3s。
改变java代码排序,取出最高的种类,再取出这个种类下的物品,效率更高,查询结果可控制在100ms左右。
本文转载自: 掘金