编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

高并发缓存架构雏形之ehcache-redis-db二级缓存架构实战演练

wxchong 2024-08-31 04:08:29 开源技术 8 ℃ 0 评论

背景介绍:

前面几篇文章,我们主要介绍了二级缓存架构的演进过程,本次文章将实战演练下整个过程,进一步熟悉二级缓存架构,本次演练的架构图如下:

当然了,这只是最基础的二级缓存架构,还有很多优化空间,如果你感兴趣,可以持续关注本头条号……

如果你理解上有困难,可以关注后面发布的视频,视频讲解可能更能容易理解,因为有时候文字可能表现力不够,有什么问题尽快提出来,期待您的参与……

前言:基本环境搭建

1、mysql环境搭建

推荐大家下载phpstudy一键安装包,直接网上搜索下载安装即可,

安装成功后,我们启动mysql

如果你还不清楚怎么用,可以参考这篇文章:快速建立php的Windows开发环境

2、连接mysql,导入sql语句

连接mysql的工具,推荐大家使用Navicat,这是很普通的一个工具这里我们就不过多介绍了

首先我们建立数据库:jikeh,然后建立如下数据表:

-- ----------------------------

-- Table structure for ad

-- ----------------------------

DROP TABLE IF EXISTS `ad`;

CREATE TABLE `ad` (

`id` bigint(20) NOT NULL AUTO_INCREMENT,

`name` varchar(60) DEFAULT NULL,

`price` bigint(20) DEFAULT NULL,

`destination_url` varchar(255) DEFAULT NULL,

`img_url` varchar(100) DEFAULT NULL,

`start_time` bigint(20) DEFAULT NULL,

`end_time` bigint(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

3、redis环境搭建,连接redis,使用redis客户端

如果你不熟悉,可以参考这篇文章:缓存架构之SpringBoot集成redis并结合ehcache实现二级缓存架构

一、广告管理系统演练测试

1)代码仓库:这个代码完全可以运行成功,本地演示过

https://gitee.com/jikeh/JiKeHCN-RELEASE.git

2)项目名

spring-boot-ad

3)项目启动

(1)配置数据库连接环境

spring.datasource.url=jdbc:mysql://localhost:3306/jikeh?serverTimezone=UTC&characterEncoding=utf-8

spring.datasource.username=root

spring.datasource.password=root

(2)右键run即可启动项目

4)访问测试

http://localhost:1111/ad-manage/ads

5)核心代码

(1)广告的增删改查操作

@Service
public class AdServiceImpl implements AdService {
 @Autowired
 private AdMapper adMapper;
 @Override
 public List<Ad> findByAd(Ad ad, Integer offset, Integer limit) {
 RowBounds rowBounds = RowBounds.DEFAULT;
 if(offset != null && limit != null){
 rowBounds = new RowBounds(offset, limit);
 }
 return adMapper.selectByAd(ad, rowBounds);
 }
 @Override
 public Ad findById(Long id) {
 return adMapper.selectByPrimaryKey(id);
 }
 @Override
 public boolean saveOrUpdate(Ad ad) {
 if(ad.getId() == null){
 return adMapper.insert(ad) == 1;
 } else {
 return adMapper.updateById(ad) == 1;
 }
 }
 @Override
 public boolean deleteById(Long id) {
 if(id == null){
 throw new NullPointerException("id");
 }
 return adMapper.deleteById(id) == 1;
 }
}

注释:这就是基本的增删改查操作

如果你连这都不会,可以参考我之前发布的文章:

(2)对外提供接口功能

@Controller
@RequestMapping("/api")
public class ApiController {
 @Autowired
 AdService adService;
 /**
 * 对外提供查询广告的接口:http://localhost:1111/ad-manage/api/getAd?adId=1
 * @param adId
 * @return
 */
 @RequestMapping(value = "getAd", method = RequestMethod.GET)
 @ResponseBody
 public String getAd(Long adId){
 Ad ad = adService.findById(adId);
 return JSONObject.toJSONString(ad);
 }
}

(3)对外提供接口功能测试

http://localhost:1111/ad-manage/api/getAd?adId=1

二、广告系统演练测试

1)代码仓库

https://gitee.com/jikeh/JiKeHCN-RELEASE.git

2)项目名

spring-boot-ehcache-redis-db

3)项目启动

(1)前提是你已经启动redis服务器

(2)启动:右键直接启动就好了

4)访问测试

下面有联合演练过程

三、ehcache-redis-db三级联调测试

1)ehcache缓存不存在、redis缓存不存在,直接调用db

第一次调用:http://localhost:8088/getAd?adId=1

打印结果:

执行上述调用之后:ehcache会刷入数据、redis会刷入数据

2)ehcache缓存存在

第二次调用:http://localhost:8088/getAd?adId=1

打印结果:

没有任何输出,

说明:第二次调用读取的是ehcache本地缓存

3)ehcache缓存不存在,redis缓存存在

等ehcache缓存过期了之后,再次调用:http://localhost:8088/getAd?adId=1

打印结果:

说明:ehcache缓存不存在,而redis缓存存在,所以没有走db

总结:上述演练过程,我们就基本了解了当前架构的流程,二级缓存架构从一定程度上环节高并发的压力,但是这还是不够的,还是很有很多问题的,接下来的几篇文章我们继续优化该系统!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表