当前位置: 首页 > news >正文

网站制作方案模板经典php网站开发教程

网站制作方案模板,经典php网站开发教程,广州海珠区房价,主题公园旅游景区网站建设目录一、生成测试用户二、jmeter压测三、秒杀接口优化1、优化第一步#xff1a;解决超卖2、优化第二步#xff1a;Redis重复抢购3、优化第三步#xff1a;Redis预减库存①商品初始化②预减库存一、生成测试用户 将UserUtils工具类导入到zmall-user模块中#xff0c;运行生… 目录一、生成测试用户二、jmeter压测三、秒杀接口优化1、优化第一步解决超卖2、优化第二步Redis重复抢购3、优化第三步Redis预减库存①商品初始化②预减库存一、生成测试用户 将UserUtils工具类导入到zmall-user模块中运行生成测试用户信息可根据自身电脑情况来生成用户数量。 1必须保证zmall-user模块处于运行状态下在进行测试用户数据生成操作 2注意修改UserUtils中的用户登录接口地址及端口同时请修改用户登录接口将生成的token令牌存入响应封装类中 //5.通过UUID生成token令牌并保存到cookie中 String token UUID.randomUUID().toString().replace(-,); ... return new JsonResponseBody(token);3设置生成登录令牌存储位置 4修改数据库名、登录账号及密码 5设置生成测试用户数量 UserUtils package com.zking.zmall.utils;import com.alibaba.nacos.common.utils.MD5Utils; import com.fasterxml.jackson.databind.ObjectMapper; import com.zking.zmall.model.User; import com.zking.zmall.util.JsonResponseBody;import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List;public class UserUtils {private static void createUser(int count) throws Exception {ListUser lstnew ArrayListUser();//循环添加用户数据for(int i0;icount;i){User usernew User();user.setLoginName(useri);user.setUserName(测试用户i);user.setPassword(MD5Utils.md5Hex(123456.getBytes()));user.setType(0);user.setMobile((17700000000Li));user.setEmail(useri139.com);user.setIdentityCode((430104199912120000Li));lst.add(user);}System.out.println(create users);//获取数据库连接Connection conngetConn();//定义SQLString sqlinsert into zmall_user(loginName,userName,password,identityCode,email,mobile,type) values(?,?,?,?,?,?,?);//执行SQLPreparedStatement psconn.prepareStatement(sql);//赋值for (User user : lst){ps.setString(1,user.getLoginName());ps.setString(2,user.getUserName());ps.setString(3,user.getPassword());ps.setString(4,user.getIdentityCode());ps.setString(5,user.getEmail());ps.setString(6,user.getMobile());ps.setInt(7,user.getType());ps.addBatch();}ps.executeBatch();ps.clearParameters();ps.close();conn.close();System.out.println(insert to db);//登录生成UserTicketString urlStringhttp://localhost:8010/userLogin;File filenew File(C:\\Users\\Administrator\\DeskTop\\config.txt);if(file.exists()){file.delete();}RandomAccessFile accessFilenew RandomAccessFile(file,rw);//设置光标位置accessFile.seek(0);for (User user : lst) {URL urlnew URL(urlString);HttpURLConnection co (HttpURLConnection) url.openConnection();co.setRequestMethod(POST);co.setDoOutput(true);OutputStream outco.getOutputStream();String paramsloginNameuser.getLoginName()password123456;out.write(params.getBytes());out.flush();InputStream inco.getInputStream();ByteArrayOutputStream boutnew ByteArrayOutputStream();byte[] buffernew byte[1024];int len0;while((lenin.read(buffer))0){bout.write(buffer,0,len);}in.close();bout.close();String responsenew String(bout.toByteArray());ObjectMapper mappernew ObjectMapper();JsonResponseBody jsonResponseBodymapper.readValue(response, JsonResponseBody.class);String tokenjsonResponseBody.getData().toString();System.out.println(create token:token);accessFile.seek(accessFile.length());accessFile.write(token.getBytes());accessFile.write(\r\n.getBytes());//System.out.println(write to file:token);}accessFile.close();System.out.println(over);}private static Connection getConn() throws Exception {String urljdbc:mysql://localhost:3306/zmall?useSSLfalseuseUnicodetrueuseJDBCCompliantTimezoneShifttrueuseLegacyDatetimeCodefalseserverTimezoneUTCcharacterEncodingUTF8;String drivercom.mysql.jdbc.Driver;String usernameroot;String password123456;Class.forName(driver);return DriverManager.getConnection(url,username,password);}public static void main(String[] args) throws Exception {createUser(50);} } 二、jmeter压测 相关配置 1.线程计划添加线程(用户)线程组 2.线程组添加配置元件http请求默认值 3.线程组添加取样器http请求 4.线程组添加配置元件http cookie管理器 5.线程组添加配置元件CSV数据文件设置 6.线程组添加监听器汇总报告 7.线程组添加监听器查看结果树 8.线程组添加监听器用表格查看结果 线程组200个线程1秒之内发送循环1次。测试结果如下吞吐量为1328/s 数据库中的秒杀商品表中的商品出现了库存为负数的问题。 订单表和订单项表中出现了秒杀商品超卖问题。 三、秒杀接口优化 1、优化第一步解决超卖 更新秒杀商品库存的sql语句只有当库存大于0才能更新库存修改更新秒杀库存方法updateKillStockById的返回类型为boolean用于判断是否更新成功。 OrderServiceImpl TransactionalOverridepublic JsonResponseBody? createKillOrder(User user, Integer pid, Float price) {//1.根据秒杀商品编号获取秒杀商品库存是否为空//........//2.秒杀商品库存减一boolean update killService.update(new UpdateWrapperKill().eq(item_id, pid).gt(total, 0).setSql(totaltotal-1));if(!update)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//3.生成秒杀订单及订单项//........return new JsonResponseBody();}2、优化第二步Redis重复抢购 在RedisService中新增以下两个方法用于Redis重复抢购的判断操作。 根据用户ID和秒杀商品ID为Key将秒杀订单保存到Redis中根据用户ID和秒杀商品ID从Redis中获取对应的秒杀商品 RedisServiceImpl /*** 将秒杀订单保存到Redis* param pid 商品ID* param order 秒杀订单 */ Override public void setKillOrderToRedis(Integer pid, Order order) {redisTemplate.opsForValue().set(order:order.getUserId():pid,order,1800, TimeUnit.SECONDS); }/*** 根据用户ID和商品ID从Redis中获取秒杀商品用于重复抢购判断* param uid 用户ID* param pid 商品ID* return 返回Redis中存储的秒杀订单 */ Override public Order getKillOrderByUidAndPid(Integer uid, Integer pid) {return (Order) redisTemplate.opsForValue().get(order:uid:pid); }这里用户抢购的秒杀订单保存到Redis默认设置是1800秒即30分钟可视情况具体调整。 OrderServiceImpl Transactional Override public JsonResponseBody? createKillOrder(User user, Integer pid) {.../***********在库存判断是否为空之后***********///6.根据秒杀商品ID和用户ID判断是否重复抢购Order order redisService.getKillOrderByUidAndPid(user.getId(), pid);if(null!order)throw new BusinessException(JsonResponseStatus.ORDER_REPART);/***********在根据商品ID获取商品之前***********///4.秒杀商品库存减一boolean flagkillService.updateKillStockById(pid);if(!flag)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);...//生成秒杀订单等操作//重点重点重点在此处将生成的秒杀订单保存到Redis中用于之后的重复抢购判断redisService.setKillOrderToRedis(pid,order);return new JsonResponseBody(); }此处第二步优化完毕再次进行JMeter压测并查看测试情况。 3、优化第三步Redis预减库存 ①商品初始化 将参与秒杀活动且秒杀状态、秒杀活动时间有效的商品推送到Redis中并对秒杀商品设置超时时间。 超时时间的设定取至于活动结束时间减去活动开始时间的差值但必须是有效活动时间也就是当前时间在活动开始时间与结束时间范围之内。 IRedisService /** * 设置秒杀商品库存到Redis中 * param pid 秒杀商品ID * param total 秒杀商品数量 * param expires 秒杀商品存储过期时间 */ void setKillTotaltoRedis(Integer pid,Integer total,long expires);RedisServiceImpl Override public void setKillTotaltoRedis(Integer pid, Integer total,long expires) {redisTemplate.opsForValue().set(goods:pid,total,expires,TimeUnit.DAYS); }OrderController 在zmall-order订单模块中的OrderController类上实现InitializingBean完成秒杀商品预加载。 package com.zking.zmall.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zking.zmall.model.Kill; import com.zking.zmall.model.Order; import com.zking.zmall.model.User; import com.zking.zmall.service.IOrderService; import com.zking.zmall.service.impl.KillServiceImpl; import com.zking.zmall.service.impl.RedisServiceImpl; import com.zking.zmall.util.JsonResponseBody; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.time.Duration; import java.time.Instant; import java.util.Date; import java.util.List;Controller public class OrderController implements InitializingBean {Autowiredprivate IOrderService orderService;Autowiredprivate KillServiceImpl killService;Autowiredprivate RedisServiceImpl redisService;/*** 秒杀商品初始化* throws Exception*/Overridepublic void afterPropertiesSet() throws Exception {ListKill list killService.list(new QueryWrapperKill()//秒杀活动必须是激活状态.eq(is_active, 1)//秒杀活动结束时间必须当前时间小于证明活动已结束.ge(end_time,new Date().toLocaleString()));list.forEach(kill - {//计算秒杀商品存入Redis的过期时间此处以天为单位Instant start kill.getStartTime().toInstant();Instant end kill.getEndTime().toInstant();long days Duration.between(start, end).toDays();redisService.setKillTotaltoRedis(kill.getItemId(),kill.getTotal(),days);});}RequestMapping(/orderUserList)ResponseBodypublic ListOrder orderUserList(){return orderService.list(new QueryWrapperOrder().eq(userId,18));}RequestMapping(/createOrder/{pid}/{num})ResponseBodypublic Order createOrder(PathVariable(pid) Integer pid,PathVariable(num) Integer num){return orderService.createOrder(pid,num);}RequestMapping(/createKillOrder/{pid}/{price})ResponseBodypublic JsonResponseBody? createKillOrder(User user,PathVariable(pid) Integer pid,PathVariable(price) Float price){return orderService.createKillOrder(user,pid,price);} }②预减库存 第一步在RedisService中定义库存预减和递增方法。预减方法是在用户抢购商品成功后对商品进行库存预减递增方法是在高并发情况下Redis库存预减可能会出现负数情况通过递增方法进行库存回滚为0 IRedisService /** * 根据秒杀商品ID实现Redis商品库存递增 * param pid * return */ long increment(Integer pid);/** * 根据秒杀商品ID实现Redis商品库存递减 * param pid * return */ long decrement(Integer pid);RedisServiceImpl Override public long increment(Integer pid) {return redisTemplate.opsForValue().increment(goods:pid); }Override public long decrement(Integer pid) {return redisTemplate.opsForValue().decrement(goods:pid); }第二步修改订单生成方法加入Redis库存预减判断 请在Redis重复抢购判断的下面加入Redis库存预减操作。 OrderServiceImpl package com.zking.zmall.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zking.zmall.exception.BusinessException; import com.zking.zmall.mapper.OrderMapper; import com.zking.zmall.model.Kill; import com.zking.zmall.model.Order; import com.zking.zmall.model.OrderDetail; import com.zking.zmall.model.User; import com.zking.zmall.service.ApiProductService; import com.zking.zmall.service.IOrderService; //import io.seata.spring.annotation.GlobalTransactional; import com.zking.zmall.util.JsonResponseBody; import com.zking.zmall.util.JsonResponseStatus; import com.zking.zmall.util.SnowFlake; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;/*** p* 服务实现类* /p** author xnx* since 2023-02-06*/ Service public class OrderServiceImpl extends ServiceImplOrderMapper, Order implements IOrderService {Autowiredprivate KillServiceImpl killService;Autowiredprivate OrderDetailServiceImpl orderDetailService;Autowiredprivate ApiProductService productService;Autowiredprivate RedisServiceImpl redisService;// Transactional // Override // public Order createOrder(Integer pid, Integer num) { // //根据商品ID修改商品对应的库存 // productService.updateStock(pid,num); // //新增订单 // Order ordernew Order(); // //此处只是做模拟操作 // this.save(order); // return order; // }// GlobalTransactionalTransactionalOverridepublic Order createOrder(Integer pid, Integer num) {//根据商品ID修改商品对应的库存productService.updateStock(pid,num);//异常模拟int i 1 / 0;//新增订单Order ordernew Order();//此处只是做模拟操作this.save(order);return order;}TransactionalOverridepublic JsonResponseBody? createKillOrder(User user, Integer pid, Float price) {//1.根据秒杀商品编号获取秒杀商品库存是否为空 // Kill kill killService.getOne(new QueryWrapperKill().eq(item_id,pid)); // if(kill.getTotal()1) // throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//2.秒杀商品库存减一 // killService.update(new UpdateWrapperKill() // .eq(item_id,pid) // .setSql(totaltotal-1));/***********在库存判断是否为空之后***********///6.Redis库存预减long stock redisService.decrement(pid);if(stock0){redisService.increment(pid);throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);}//5.根据秒杀商品ID和用户ID判断是否重复抢购Order order redisService.getKillOrderByUidAndPid(user.getId(), pid);if(null!order)throw new BusinessException(JsonResponseStatus.ORDER_REPART);//2.秒杀商品库存减一boolean update killService.update(new UpdateWrapperKill().eq(item_id, pid).gt(total, 0).setSql(totaltotal-1));if(!update)throw new BusinessException(JsonResponseStatus.STOCK_EMPTY); // boolean flagkillService.updateKillStockById(pid); // if(!flag) // throw new BusinessException(JsonResponseStatus.STOCK_EMPTY);//3.生成秒杀订单及订单项SnowFlake snowFlakenew SnowFlake(2,3);Long orderIdsnowFlake.nextId();int orderIdInt new Long(orderId).intValue();//创建订单 // Order ordernew Order();order.setUserId(user.getId());order.setLoginName(user.getLoginName());order.setCost(price);order.setSerialNumber(orderIdInt);this.save(order);//创建订单项OrderDetail orderDetailnew OrderDetail();orderDetail.setOrderId(orderIdInt);orderDetail.setProductId(pid);orderDetail.setQuantity(1);orderDetail.setCost(price);orderDetailService.save(orderDetail);//生成秒杀订单等操作//重点重点重点在此处将生成的秒杀订单保存到Redis中用于之后的重复抢购判断redisService.setKillOrderToRedis(pid,order);return new JsonResponseBody();}} 第三步还原测试数据重新使用jmeter压测这时可以发现明显压测效率要提升很多。 但是还是要根据不同电脑配置情况来决定配置太低效率也提升不了多少。 尤其是链接远程redis会导致压测的吞吐量直线下降
http://www.w-s-a.com/news/175021/

相关文章:

  • 网站建设与维护大作业pc网站转换成微网站
  • php网站开发经典教材东莞网站开发
  • 教育培训手机网站模板下载跨境电商培训哪家最好
  • 网站开发淄博网站被降权会发生什么影响吗
  • 网站开发常用的语言东城手机网站制作
  • 微小店网站建设平台手机优化加速有什么用
  • 沈阳酒店企业网站制作公司竞价网站怎么做seo
  • 中山企业网站多少钱学网站建设的好处
  • 做官网网站哪家公司好jianux wordpress
  • 插件素材网站新站seo优化快速上排名
  • 网站注销主体填写原因asp响应式h5网站源码下载
  • 电商类网站模板下载济南市建设网官网
  • 万户网络做网站如何采集器wordpress
  • 襄阳网站建设企业查看 wordpress 插件
  • 网站地址申请京东联盟怎么做网站
  • 三亚市城乡建设局网站网站口碑营销
  • 图书租借网站 开发企业网站搜索优化外
  • 新乡个人网站建设哪家好免费的图片做视频在线观看网站
  • 洛阳工程建设信息网站山西响应式网页建设哪里好
  • 企业网站建设市场的另一面wordpress分类插件
  • 网站建设名头公司展厅装修
  • 小型购物网站开发费用郑州企业网站模板建站
  • 个体商户建自己的网站做销售建设积分兑换官方网站
  • 网站建设与维护培训网页制作专业用语
  • 建站特别慢wordpress网页制作与设计项目策划书
  • 视频制作素材免费网站头像制作在线生成器
  • 网站建设是不是可以免费建站广州做网站 信科网络
  • 闸北区网站设计叫别人做网站后怎么更改密码
  • 为什么想做网站运营建设工程教育网站
  • 站长基地百度推广整体优化网站