项目介绍

这个项目是主要设计缓存的一个练手项目,目前后台还没有实现,还在开发(现在已上传后台),但是前台流程是通了的,从登陆到购买以及秒杀。目前主要模块有五个:用户模块,游戏模块,评论模块、购物车模块以及秒杀模块。你们可以接着把这个项目写下去,里面注释写了很多,相信大家也能看懂,页面是直接在steam趴下来修改了的,嘿嘿嘿。。。。后台用的H-UI界面,上述模块的可视化操作全部实现了。

项目下载地址

项目架构图

项目展示



压力测试

服务器是学生服务器,就是腾讯那个10元的服务器,在本地利用jmeter压测工具设置5000个线程、10000个请求时,首页的QPS为1024,而秒杀接口则为1678,可能服务器的问题,我感觉QPS不应该这么低。

项目的运行

在数据库中创建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信息与秒杀资源信息加入消息队列中
  • 消息接受者减少库存,新增秒杀订单
  • 客户端不断轮询缓存,查询到对应的秒杀订单,则秒杀成功

秒杀的一些优化(借鉴了网上的思路):

  • 增加了秒杀的随机路径,防刷
  • 在秒杀开始前需要验证码输入,延缓压力
  • 利用redis的缓存,限制每个用户的每分钟的秒杀次数

4.页面的渲染

  • 页面的渲染采取了jquery加ajax技术的字符串拼接以及thymleaf模板的渲染
  • 大部分是用的字符串拼接,只有少部分采用的模板渲染
  • 前端主要是由字符串拼接,后台主要是模板渲染

5. 主从配置

继承AbstractRoutingDataSource类,重写determineCurrentLookupKey方法,改变DataSource路由中介,在运行当中根据自定义KEY值动态切换真正的DataSource:

public class DynamicDataSource extends AbstractRoutingDataSource {......@Overrideprotected 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技术动态的改变数据源键值,就可以达到动态的分发数据请求了:

/*** 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中取出事件的任务,调用对应的消息处理器处理:

......threadPoolExecutor.execute(new Runnable() {@Overridepublic 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();}}}});}

项目——仿Steam商城相关推荐

  1. ssm框架实现仿steam官网购物商城项目

    简介 暑假前学的ssm框架(spring.springmvc.mybatis),做了一个仿steam官网的购物网站. 由于技术.时间有限,bug不完善的地方有,还请见谅. 最下面有完整的代码和数据库, ...

  2. 基于javaweb的仿天猫商城系统开发与设计.rar(论文+任务书+项目源码)

    1设计背景 1 1.1课题现状 1 1.2课题意义 1 2设计思路 2 2.1环境与工具 2 2.1.1 Idea工具 2 2.1.2 webStorm工具 2 2.1.3 Mysql 2 2.1.4 ...

  3. 仿联想商城laravel实战---1、仿联想商城需求和数据库设计(lavarel如何搭建项目)...

    仿联想商城laravel实战---1.仿联想商城需求和数据库设计(lavarel如何搭建项目) 一.总结 一句话总结: composer引入lavarel.配置域名.配置apache 1.项目名 le ...

  4. Github上开源仿京东商城项目-安装部署(二)

    Github上开源仿京东商城项目-安装部署(二) 2.用IntelliJ IDEA 2020打开项目,选择SuperMarket目录, 将会自动安装相关项目的依赖包,这个时间大约1个半小时. 3.安装 ...

  5. 学生网页作业:商城网站设计——仿天猫商城(9页) HTML+CSS大作业_ 网页制作作业_疫情防控网页设计...

    HTML5期末大作业:商城网站设计--仿天猫商城(9页) HTML+CSS大作业 文章目录 HTML5期末大作业:商城网站设计--仿天猫商城(9页) HTML+CSS大作业 一.作品展示 二.文件目录 ...

  6. 【android】高仿京东商城App,集成react-native热更功能

    简介 高仿京东商城项目具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,功能还在持续更新中-如果对你有帮助,给个star 使用kotlin语言开发,项目使用模块化开发,降低 ...

  7. 高仿京东商城app、集成react-native热更新功能

    简介 这是一个高仿京东商城的安卓项目,有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能 kotlin . retrofit2 + okhttp3 网络请求 .多模块 leak ...

  8. 基于javaweb仿京东商城管理系统的设计与实现(含论文和程序源码及数据库文件)

    网上购物商城系统以弥补传统购物方式的弊端.在目前的商城里,如果采用网上商城方式,用户购物时就不需要到店里面排队,这样不仅能实时地了解商品的特色,而且方便了顾客,同时也减轻了商城的服务压力.随着WLAN ...

  9. 高仿京东商城App,集成react-native 热更新功能

    前言 这是一个高仿京东商城的android 混合项目,具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,使用最新MVI架构开发 kotlin . retrofit2 + o ...

最新文章

  1. 使用Linux进行缓冲区溢出实验的配置记录
  2. kuangbin专题16B(kmp模板)
  3. windows socket编程入门示例3
  4. java基础笔试_java基础笔试题
  5. C语言博客作业05--指针
  6. OpenGL动感模糊
  7. 【深度学习】基于web端和C++的两种深度学习模型部署方式
  8. C++语言基本概念(5)
  9. JavaScript数据结构和算法 1
  10. ASP.Net Core Razor 页面路由
  11. 【Android Developers Training】 58. 缓存位图
  12. 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...
  13. 整理 45 道 CSS 基础面试题(附答案)
  14. 谷歌再遭反垄断起诉:曾试图“扼杀”三星应用商店!
  15. ubuntu安装transmission下载BT
  16. win7精简_微软从未公开的win10版本,3GB+极度精简,老爷机总算有救了!
  17. 信息系统项目管理师必背核心考点(四十三)预期货币价值(EMV)
  18. app微信登陆 小程序微信授权登陆
  19. 衡量两个概率分布之间的差异性的指标
  20. 龙族幻想东京机器人一次_龙族幻想凌晨四点的东京机器人坐标-机器人刷新点_6137游戏网...

热门文章

  1. java 韩文转中文_java-如何转换为韩文缩写
  2. nginx的高级配置(4)——防盗链
  3. 浅谈Attribute [C# | Attribute | DefaultValueAttribute]
  4. 可靠性测试设备技术含量_可靠性测试技术文件.doc
  5. 互联网时代,企业薪酬管理逐渐向数智化转型
  6. 2019年wine QQ最完美解决方案(多Linux发行版通过测试并稳定运行)
  7. Linux 内核及 GNU/Linux 操作系统的基本体系结构
  8. win10 操作自带防病毒软件Defender
  9. 《MATLAB SYNTAX》第9章 三维图形可视化
  10. 嵌入式学习路线——解惑