有一张订单表,由于我们此时仅仅需要查询订单列表,所以其表结构暂时忽略。
以resource_coin作为是否为热点订单的依据,查询可知
订单总量: 5030
热点订单数量: 50
非热点订单数量: 4980
根据要求,我们需要为这50条热点订单加一层redis缓存。
@Override
public void afterPropertiesSet() throws Exception {
List<Orderpl> list = orderplService.list(new QueryWrapper<Orderpl>().eq("resource_coin",1));
for (Orderpl l : list) {
redisTemplate.opsForList().rightPush(GlobalConstant.RedisConstant.ORDERPL,l);
}
}
项目启动后,bean的属性注入完成之后,redis的数据情况如下
编写获取热点订单接口
@PostMapping("/getOrderList")
public R getOrderList(){
R r = new R();
List<Orderpl> orderList = redisTemplate.opsForList().range(GlobalConstant.RedisConstant.ORDERPL,0 , -1);
r.put("orderList",orderList);
r.setStateCode(StateCode.SUCCESS);
r.setMessage("success!");
return r;
}
r是封装的返回对象,在这里可以约等于返回了热点订单列表
使用JTMTER进行压测
聚合报告
其吞吐量为54.7/sec
结果树
修改接口请求,让其直接去数据库里查询这50条热点订单
直接去数据库里查询这五十条热点订单并返回
@PostMapping("/getOrderList")
public R getOrderList(){
R r = new R();
List<Orderpl> orderList = orderplService.list(new QueryWrapper<Orderpl>().eq("resource_coin",1));
r.put("orderList",orderList);
r.setStateCode(StateCode.SUCCESS);
r.setMessage("success!");
return r;
}
不改变压测参数进行压测
吞吐量228.0/sec 吞吐量是去redis中查询的接近四倍
另外,当热点数据的数据量为1时,吞吐量如下
redis完爆直接去mysql查询
求助:
1.导致此类差异的原因是什么?是不是redis列表结构所导致的,因为在数据量多的时候,磁盘IO不再是制约因素,因为组成链表需要遍历链表,一个一个从内存里取数据来组成链表。而从数据库里取只需要走索引,然后直接把热点数据全部取出来组成列表,而在数据量小的时候,磁盘IO就变成了主要制约因素。
2.如果要对数据量并不小的热点订单进行缓存,该如何进行?
欢迎大佬解答