欢迎大家来到令狐小哥本期文章,这篇文章将给大家介绍一个电商应用案例,实战介绍如何通过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缓存真的太有用了!