Code Monkey home page Code Monkey logo

springboot-seckill's Issues

项目启动后访问不了网页

数据什么的都导入了。该安装的也安装了。启动后也没报错。
但是访问localhost:8080一直都404加上/login啥的也是404.想问下大佬是怎么回事

预减库存如果库存小于0,为什么要调用afterPropertiesSet()更新每件商品?

秒杀下单时的一段代码:
//预减库存 long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);//10 if (stock < 0) { afterPropertiesSet(); long stock2 = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);//10 if(stock2 < 0){ localOverMap.put(goodsId, true); return Result.error(CodeMsg.SECKILL_OVER); } }

下面这个是afterPropertiesSet方法定义,每次调用都要获取所有商品并且遍历商品,这样会消耗性能吧,而且,我只是下单某一件商品,为什么在遍历中将每件商品标记为false?原本某些标记为true的商品变为false了
public void afterPropertiesSet() { List<GoodsVo> goodsVoList = goodsService.listGoodsVo(); if (goodsVoList == null) { return; } for (GoodsVo goods : goodsVoList) { redisService.set(GoodsKey.getGoodsStock, "" + goods.getId(), goods.getStockCount()); //初始化商品都是没有处理过的 localOverMap.put(goods.getId(), false); } }

bug

哥们 一个bug 加载的时候要把订单信息加载上去
不然服务器宕机了已下单用户再次请求的话插入数据库会出错
mq的消息会一直轮询

点击立即秒杀 后台user对象内的属性值都为null

点击立即秒杀 后台/do_seckill 方法中 user对象内的属性值都为null,当执行到//判断重复秒杀
SeckillOrder order = orderService.getOrderByUserIdGoodsId(user.getId(), goodsId);报空指针异常,请问为什么呢?

多服务部署

项目当前是单服务,我想了解下有没有多服务的解决方案,比如1000个秒杀商品,拆分5个服务,每个服务分配200个商品供秒杀。这个解决方案需要解决的点在于请求路由。

关于乐观锁

本人小白,mysql的update本身具有排他锁,@update("update sk_goods_seckill set stock_count = stock_count - 1, version= version + 1 where goods_id = #{goodsId} and stock_count > 0 and version = #{version}"),更新库存应该不存在安全问题,为什么还需要根据版本来实现乐观锁,希望释疑。

启动项目报错了

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.

redis password

redis pass 没有通过配置读取到实例化中,导致redis 设置了pass就会报错。
JedisPool jp = new JedisPool(config, redisConfig.getHost(), redisConfig.getPort(),
redisConfig.getTimeout()*1000, redisConfig.getPassword(), 0);
git中没有加redisConifg.getPassword()
在RedisPoolFactory.java中

请教一下这个异步下单,真的算异步吗?

我看代码里面的controller层的SeckillController#list()方法,即执行秒杀的方法,redis的操作完成之后,只是把消息发送到rabbitmq中,然后rabbitmq监听取出消息,就直接和数据库交互了,所以我想问一下这个异步是体现在哪个地方呀?

重复下单redis中库存还是会减小

long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);//10
        if (stock < 0) {
            afterPropertiesSet();
            long stock2 = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);//10
            if(stock2 < 0){
                localOverMap.put(goodsId, true);
                return Result.error(CodeMsg.SECKILL_OVER);
            }
        }
        //判断重复秒杀
        //如果重复秒杀,是否多次减库存?
        SeckillOrder order = orderService.getOrderByUserIdGoodsId(user.getId(), goodsId);
        if (order != null) {
            return Result.error(CodeMsg.REPEATE_SECKILL);
        }

预减库存后,如果是重复秒杀,redis中的库存量还是会减少,导致其他用户不能下单

启动步骤

方便详细写下启动步骤吗,我这种小白来学习的话就是一路坑。

怎么运行这个项目

用idea试了好几次都失败了,有没有运行成功的大佬教一下怎么运行,谢谢了

立即支付后无响应

查看了代码,不知道是否只更新到了支付后的代码,并无找到点击支付按钮后的处理代码

关于隐藏秒杀地址

大佬,想问你一个问题,你这里为什么没有去实现隐藏秒杀地址的功能,你觉得这个没必要吗,希望你能解答一下

预减库存会不会存在卖不完的情况

SeckillController.list 方法中,先预减库存,然后判断是否重复秒杀。如果重复秒杀或者下订单异常,应该会出现有库存,但是返回秒杀完毕情况

md5 二次加密

  1. 两次MD5加密
    将用户输入的密码和固定Salt通过MD5加密生成第一次加密后的密码,再讲该密码和随机生成的Salt通过MD5进行第二次加密,最后将第二次加密后的密码和第一次的固定Salt存数据库

这里存到 db 的 salt 应该是第二次加密时随机生成的 salt 吧

关于MD5加密的笔误问题

数据库里存的应该是随机生成的salt吧,存写死的salt,自己也没办法比较用户输入的密码是否正确了啊

consumer减库存失败之后存入redis的goodOver的key有问题

同一个商品减库存key为SeckillKey:go1,失败一次,则后续所有该商品的所有减库存操作在redis中设为失败,一旦getSeckillResult查询时,mq暂时没执行则会通知秒杀失败。"对不起,秒杀失败" ,即一直失败
建议rediskey添加用户id,并给这个key设置过期时间,即超过最大mq延迟执行时间

如果version失效了,更新失败 再次执行时没有取出表中最新的version,所以不管循环几次,更新也是失败的????

/**
* 减少库存,每次减一
*
* @return
*/
public boolean reduceStock(GoodsVo goods) {
int numAttempts = 0;
int ret = 0;
SeckillGoods sg = new SeckillGoods();
sg.setGoodsId(goods.getId());
sg.setVersion(goods.getVersion());
do {
numAttempts++;
try {
//TODO 如果version失效了,更新失败 再次执行时没有取出表中最新的version,所以不管循环几次,更新也是失败的????
ret = goodsMapper.reduceStockByVersion(sg);
} catch (Exception e) {
e.printStackTrace();
}
if (ret != 0)
break;
} while (numAttempts < DEFAULT_MAX_RETRIES);

    return ret > 0;
}

跑不了

java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@117159c0: startup date [Wed Mar 23 20:50:25 CST 2022]; root of context hierarchy

用户密码

你好,我想运行这个项目,密码可以说下吗

乐观锁的version number在更新时没有传送

两个问题
1、更新库存时没有送version number,所以更新库存失败
2、秒杀成功以后,返回的int 永远是1,作为订单号返回,是查不到订单的

GoodsVo
增加
int version 和getter setter

GoodsMapper
getGoodsVoByGoodsId 增加返回 sg.version

GoodsService
reduceStock()方法增加
sg.setVersion(goods.getVersion());

OrderService
createOrder()方法
订单号要从实体类中取,否则update返回的永远是1
long orderId = orderInfo.getId();

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.