「 实·战」千万级电商网站高并发之Redis缓存设计与实现--架构设计与认知

欢迎大家来到令狐小哥本期文章,这篇文章将给大家介绍一个电商应用案例,实战介绍如何通过Redis缓存去进行高并发处理!

文章主要介绍的是设计思路与方法!也将配套相应的压测指标供大家观察学习!

案例系统

案例系统将是一个单体应用,前后端不分离:

在这里插入图片描述

系统源代码

https://gitee.com/jackieling/babytun.git

系统展示

在这里插入图片描述

如果我们直接按照这种基础架构设计,会有什么问题呢?我们可以进行一次压力测试

压测情况

在这里插入图片描述

我们在高并发场景下的压测来看,可以知道:吞吐量只有264.在线上环境,这个吞吐量每秒264肯定是不合格的,最起码每秒都得请求上千才行。

最大的一个响应时间甚至到了5秒!平均响应时间是3秒。我们只要想办法把平均时间往下降低,那么吞吐量自然就会上去!

那接下来我们怎么解决这个效率问题呢?

问题分析

在电商应用中,90%数据处理都是用于读取数据。在海量数据的情况下,数据库最有可能成为高并发的瓶颈,因此提高数据库效率或者降低数据库交互就是我们高并发要首先考虑的问题。

稳定数据处理

在电商应用中,很大一部分数据是在一段时间内稳定不变的,比如:商品信息、会员信息、网站基本信息…

对于稳定数据,常用两种方式进行高并发处理:

  • 利用缓存-可以采用Redis
  • 利用静态化技术转化为html
引入Redis-代码改造

那接下来我们就用redis做缓存,对原有代码进行改造,我们的目的是提升系统的性能,最后还将通过压测来查看性能情况

在这里插入图片描述

依赖引入
	<!--引入缓存机制-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-cache</artifactId>
		</dependency>
<!--		引入缓存策略-采用redis策略-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>
开启声明式缓存
@SpringBootApplication
@MapperScan("com.linghu.babytun")
@EnableCaching//开启声明式缓存,利用注解来控制缓存的读写
public class BabytunApplication {

	public static void main(String[] args) {
		SpringApplication.run(BabytunApplication.class, args);
	}

}
业务层加注解
@Service
public class GoodsService {
    @Resource
    private GoodsDAO goodsDAO;
    @Resource
    private GoodsCoverDAO goodsCoverDAO;
    @Resource
    private GoodsDetailDAO goodsDetailDAO;
    @Resource
    private GoodsParamDAO goodsParamDAO;
    //view -> controller -> service -> dao
    /**
     * @Cacheable 是声明式缓存的核心注解
     * 第一次访问的时候将方法返回的结果放入缓存;
     * 第二次访问的时候不再执行方法内部的代码,而是从
     * 缓存中直接获取结果。
     * */
    @Cacheable(value = "goods",key = "#goodsId")
    public Goods getGoods(Long goodsId) {
        return goodsDAO.findById(goodsId);
    }

    @Cacheable(value = "covers",key = "#goodsId")
    public List<GoodsCover> findCovers(Long goodsId){
        return goodsCoverDAO.findByGoodsId(goodsId);
    }
    @Cacheable(value = "details",key = "#goodsId")
    public List<GoodsDetail> findDetails(Long goodsId){
        return  goodsDetailDAO.findByGoodsId(goodsId);
    }
    @Cacheable(value = "params",key = "#goodsId")
    public List<GoodsParam> findParams(Long goodsId){
        List list =  goodsParamDAO.findByGoodsId(goodsId);
        return list;
    }
}

在这里插入图片描述

yaml文件的配置
spring:
  data:
    redis:
      host: 127.0.0.1
      database: 3
      port: 6379
      jedis:
        pool:
          max-active: 100
          max-idle: 100
          min-idle: 10
          max-wait: 1000ms
      password: root

压测情况

我们在引入redis缓存以后,看一下压测情况:

在这里插入图片描述

我们现在发现,吞吐量已经可以1s处理1675个请求了,效率被我们大大的提高了!平均响应时间降到了44ms了,处理一个请求最长耗时也才1s!!!

通过两次压测我们可以发现,引入redis缓存真的太有用了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeLinghu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值