【求助】 redisTemplate在获取列表时,如果列表数据量稍微有点大(2位数数据量)时,其系统吞吐量不如直接去数据库里查询

有一张订单表,由于我们此时仅仅需要查询订单列表,所以其表结构暂时忽略。

以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.如果要对数据量并不小的热点订单进行缓存,该如何进行?

欢迎大佬解答

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值