# 项目介绍
这个项目是主要设计缓存的一个练手项目,目前后台还没有实现,还在开发(现在已上传后台),但是前台流程是通了的,从登陆到购买以及秒杀。目前主要模块有五个:用户模块,游戏模块,评论模块、购物车模块以及秒杀模块。你们可以接着把这个项目写下去,里面注释写了很多,相信大家也能看懂,页面是直接在steam趴下来修改了的,嘿嘿嘿。。。。后台用的H-UI界面,上述模块的可视化操作全部实现了。
# 项目架构图
<img src="https://github.com/suyeq/steamMall/blob/master/%E6%9E%B6%E6%9E%84.png">
# 项目展示
<div style="float:left">
<img src="https://github.com/suyeq/steamMall/blob/master/1.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/2.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/3.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/4.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/5.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/6.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/7.png" width=350px height=200px>
<img src="https://github.com/suyeq/steamMall/blob/master/8.png" width=350px height=200px>
</div>
# 压力测试
服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。
<img src="https://github.com/suyeq/steamMall/blob/master/TestResult.png" width=350px height=200px>
# 项目的运行
在数据库中创建steam库,然后导入sql文件,修改相应的的配置,关于主从配置请自行百度啦,运行起项目,然后需要把`GameService`类以及`CommentService`类里面的`afterPropertiesSet`方法里面的代码注释掉,这是第一次启动加载缓存的代码。
# 架构以及详细实现
## 1.登录注册
* 两次md5,对密码加密
* 分布式session,将用户的登录信息缓存在redis中
* 权限检查,每次操作在权限允许下才能进行
* 注册,需要邮箱验证码,邮箱验证码会在缓存中存在90s的时间
## 2.页面数据
* 首页及其他页面因为读多写少,利用Mysql主从复制实现读写分离,写入在主Mysql下进行,读取在从Mysql进行
* 关于数据的不一致性,可以在写入的时候先写入缓存,读取的时候也先在缓存中读取,这样就可以避免数据的不一致性
* 缓存利用Redis,内存满的情况下,键的删除策略采用volatile-lru
* 热卖榜以及排序功能依据Redis的zset实现,缓存时间为30s
* 为了减少网络时延的影响,引入了redis的管道技术,实行批处理
* 为了更好地加快性能,在redis缓存层之上加了加了一层本地的缓存
## 3.秒杀功能
原理:尽量减少Mysql的访问
* 将先将需要秒杀的数据缓存在Redis中,在秒杀接口里做预减少库存
* 判断秒杀订单里有无对应的信息,有则秒杀重复
* 将user信息与秒杀资源信息加入消息队列中
* 消息接受者减少库存,新增秒杀订单
* 客户端不断轮询缓存,查询到对应的秒杀订单,则秒杀成功<br>
秒杀的一些优化(借鉴了网上的思路):
* 增加了秒杀的随机路径,防刷
* 在秒杀开始前需要验证码输入,延缓压力
* 利用redis的缓存,限制每个用户的每分钟的秒杀次数
## 4.页面的渲染
* 页面的渲染采取了jquery加ajax技术的字符串拼接以及thymleaf模板的渲染
* 大部分是用的字符串拼接,只有少部分采用的模板渲染
* 前端主要是由字符串拼接,后台主要是模板渲染
## 5. 主从配置
继承`AbstractRoutingDataSource`类,重写`determineCurrentLookupKey`方法,改变DataSource路由中介,在运行当中根据自定义KEY值动态切换真正的DataSource:
```java
public class DynamicDataSource extends AbstractRoutingDataSource {
......
@Override
protected Object determineCurrentLookupKey() {
Object key = "";
//主库
if (DynamicDataSourceHolder.isMaster()) {
key = DynamicDataSourceHolder.MASTER;
} else {
//从库
key = getSlaveKey();
//key=DynamicDataSourceHolder.SLAVE;
}
logger.info("==> select datasource key [{}]", key);
return key;
}
public void setSlaveDataSources(List<Object> slaveDataSources) {
this.slaveDataSources = slaveDataSources;
}
......
}
```
再利用AOP技术动态的改变数据源键值,就可以达到动态的分发数据请求了:
```java
/**
* Created with IntelliJ IDEA.
*
* @author: Suyeq
* @date: 2019-04-25
* @time: 15:23
*/
@Component
@Aspect
public class DynamicDataSourceAop {
Logger log= LoggerFactory.getLogger(DynamicDataSourceAop.class);
/**
* 切面service包下的所有以add形式开头的方法
*/
@Before("execution(* com.example.steam.service.*.add*(..))")
public void dynamicDataSourceAddMethod(){
log.info("设置为主节点");
DynamicDataSourceHolder.putDataSource(DynamicDataSourceHolder.MASTER);
}
@Before("execution(* com.example.steam.service.*.update*(..))")
public void dynamicDataSourceUpdateMethod(){
log.info("设置为主节点");
DynamicDataSourceHolder.putDataSource(DynamicDataSourceHolder.MASTER);
}
@Before("execution(* com.example.steam.service.*.delete*(..))")
public void dynamicDataSourceDeleteMethod(){
log.info("设置为主节点");
DynamicDataSourceHolder.putDataSource(DynamicDataSourceHolder.MASTER);
}
@Before("execution(* com.example.steam.service.*.find*(..))")
public void dynamicDataSourceFindMethod(){
log.info("设置为从节点");
DynamicDataSourceHolder.putDataSource(DynamicDataSourceHolder.SLAVE);
}
}
```
## 6.消息队列
在项目里,利用redis的list来实现了一个简单的消息队列,用来异步处理邮件任务以及秒杀任务,在线程池中提交一个不断循环从list中取出事件的任务,调用对应的消息处理器处理:
```java
......
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
while (true){
Event event=redisService.rpop(MQKey.MQ,Event.EVENT_KEY,Event.class);
if (event==null){
continue;
}
if (!eventMap.keySet().contains(event.getEventType())){
log.error("未知的事件类型");
continue;
}
for (EventHandle eventHandle:eventMap.get(event.getEventType())){
threadPoolExecutor.execute(new EventHanleThread(event,eventHandle,applicationContext));
}
/**
* 每隔500毫秒取一次
*/
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
}
```
没有合适的资源?快使用搜索试试~ 我知道了~
基于SpringBoot+Mybatis开发的主从架构的Steam商城.zip
共427个文件
gif:126个
java:120个
png:82个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 64 浏览量
2024-05-18
17:23:50
上传
评论
收藏 5.27MB ZIP 举报
温馨提示
基于springboot的java毕业&课程设计
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot+Mybatis开发的主从架构的Steam商城.zip (427个子文件)
mvnw.cmd 6KB
H-ui.css 203KB
H-ui.min.css 149KB
game.css 133KB
store.css 99KB
home.css 78KB
shareglobal.css 66KB
recommended.css 62KB
profive2.css 58KB
cart.css 46KB
global2.css 35KB
discoveryqueue.css 35KB
button.css 30KB
apphub.css 25KB
profile_game_list.css 19KB
layer.css 18KB
register.css 16KB
sharereponsive.css 15KB
groupadmin.css 12KB
tag.css 11KB
sharegame.css 11KB
search.css 11KB
browse.css 9KB
contenthub.css 7KB
user_review.css 7KB
H-ui.admin.css 7KB
profile_reviews.css 6KB
layer.css 5KB
H-ui.reset.css 3KB
login.css 3KB
H-ui.ie.css 3KB
font.css 3KB
motivo.css 3KB
creator.css 2KB
H-ui.login.css 2KB
skin.css 1KB
skin.css 1KB
skin.css 1KB
skin.css 1KB
skin.css 1KB
skin.css 1KB
style.css 44B
35.gif 13KB
71.gif 13KB
69.gif 10KB
loading.gif 8KB
18.gif 8KB
19.gif 8KB
11.gif 8KB
32.gif 7KB
78.gif 6KB
loading-0.gif 6KB
31.gif 6KB
99.gif 5KB
75.gif 5KB
85.gif 5KB
8.gif 5KB
29.gif 5KB
74.gif 5KB
5.gif 5KB
45.gif 4KB
33.gif 4KB
72.gif 4KB
0.gif 4KB
26.gif 4KB
loading-b.gif 4KB
7.gif 4KB
10.gif 4KB
76.gif 4KB
80.gif 4KB
49.gif 4KB
66.gif 3KB
205.gif 3KB
91.gif 3KB
9.gif 3KB
28.gif 3KB
70.gif 3KB
6.gif 3KB
68.gif 3KB
79.gif 3KB
22.gif 3KB
97.gif 3KB
56.gif 3KB
51.gif 3KB
27.gif 3KB
86.gif 3KB
41.gif 2KB
50.gif 2KB
25.gif 2KB
103.gif 2KB
84.gif 2KB
83.gif 2KB
24.gif 2KB
12.gif 2KB
89.gif 2KB
101.gif 2KB
106.gif 2KB
105.gif 2KB
34.gif 2KB
95.gif 2KB
共 427 条
- 1
- 2
- 3
- 4
- 5
资源评论
Nowl
- 粉丝: 1w+
- 资源: 3891
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功