为了账号安全,请及时绑定邮箱和手机立即绑定
  • 高并发:

        1,前端控制触发次数,比如限制控制按钮的触发

        2,使用CDN和缓存机制达到动静分离

        3,减少行级锁和GC的时间,将食物控制在mysql中进行,比如存储过程

    查看全部
  • 1.为什么insert插入成功 update失败事务依然会回滚成功?

    只有在commit的时候 内部逻辑才被"真正"执行 映射到表里 没commit之前所有操作都在内存执行


    2.为什么 insert在前能够减少锁的持有时间?

    首先是在更新操作的时候给行加锁,插入并不会加锁,如果更新操作在前,那么就需要执行完更新和插入以后事务提交或回滚才释放锁,而如果插入在前,则更新完以后事务提交或回滚就释放锁。也就是说是更新在前加锁和释放锁之间两次的网络延迟和GC,如果插入在前则加锁和释放锁之间只有一次的网络延迟和GC,也就是减少的持有锁的时间。

    查看全部
  • 下载并安装redis,添加pom依赖 Jedis

    new JedisPool(String ip,int port)

    序列化--自定义序列化:portostuff-core/portostuff-runtime

    https://github.com/eishay/jvm-serializers/wiki

    查看全部
  • 插入操作放在前面,插入操作就是把秒杀单,用户id,电话组成一个组件,这个组件冲突的概率并不是很高,因为秒杀单在前头,还有用户的电话,组成一个唯一键,这个时候的网络延迟和GC是可以并行的,这个时候再去拿update减库存的rowLocl行级锁

    查看全部
  • 开始没理解开:先insert,等于忽略了库存不足的情况,岂不是插入了很多。 但是后来自己一想,插入了并不一定提交,只有在update成功才会提交,这样就通了。 简单优化:update和insert执行换位置,因为插入的时候,冲突可能性比较小,而且可以直接通过判断影响行数进行下面的操作,update时需要等待行级锁释放,时间比较长。 深度优化:使用存储过程。
    查看全部
  • 写操作,核心请求没办法也不能用CDN缓存 不能用后端缓存用mysql的事务保证一致性
    查看全部
  • 访问一次内存10ns
    查看全部
  • CDN
    查看全部
  • 高并发分析
    查看全部
  • java控制事物行为分析
    查看全部
  • 存储过程: 1.存储过程优化:事务行级锁持有的时间 2.不要过度依赖存储过程 3.简单的逻辑依赖存储过程 4.QPS:一个秒杀6000/qps
    查看全部
  • 利用存储过程将执行秒杀的一条事务逻辑放到mysql服务端去执行,减少了客户端和服务端之间的延迟和gc时间,客户端只需要传入参数执行存储过程并根据得到的返回结果做相应的逻辑处理。存储过程比较适合于简单的逻辑。
    查看全部
  • 减少行锁的持有时间 insert是并行操作,update是串行操作,优化:将insert放到update之前
    查看全部
  • insert操作:主键(商品id,killPhone)很少产生冲突 => 不涉及行级锁 => 可以并发执行 => 极大降低了网络延迟 和 GC带来的影响。 update操作:rowLock。针对同一行数据需要串行化执行。 个人解释:假设10000人同时抢同一件商品,insert放在前面,每个请求事务的insert前半部分请求,可以并发的发送和执行(非串行化)。假设极端情况,大家的insert部分操作都走完了,都只剩下update(rowLock,串行化操作)时。 易得 => 阻塞的时间降低为原来一半左右。 如果是update在insert前面 => A B C等人的update请求同时被发送到mysql服务端,但由于update有rowLock,是串行化的操作,导致 B C等人 对 同一行数据的update操作 必须要 等到 A update insert 并 commit 释放 rowLock之后,才能执行。 而 如果是 insert 在 update 之前的话, 等待/阻塞的时间,就只有 update -> commit 这后半部分的时间。 综上所述:insert放在update前:降低了单个事务操作rowLock的持有时间 => 同一单位时间可执行的update操作(事务)就会更多。 => 系统的并发量也就更大了! 本质:Java客户端阻塞代码段的不同 ① update - insert :Java客户端代码阻塞在 update操作返回。因为需要等待前一事务commit释放rowLock并返回。 ② insert - update :insert 能并发执行返回,代码阻塞在了后半部分的update返回上。这样事务之间需要等待的时间(主要:网络延迟+GC mysql和java执行时间太短不计)就会较方案①降低一半左右。
    查看全部
  • 持有行级锁是在update上,释放锁是在commit(spring控制),也就是锁持有时间是update和commit之间的时间。这个过程网络请求越少,锁持有时间就越短。 insert不涉及行解锁。 insert 会 锁表么? 实际业务会很复杂 跨多个数据源的时候就不能简单用存储过程来解决 行级锁定的优点: ·当在许多线程中访问不同的行时只存在少量锁定冲突。 ·回滚时只有少量的更改。 ·可以长时间锁定单一的行。 行级锁定的缺点: ·比页级或表级锁定占用更多的内存。 ·当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。 ·如果你在大部分数据上经常进行GROUP BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。 · 用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。
    查看全部

举报

0/150
提交
取消
课程须知
《Java高并发秒杀API》是系列课程,共四门课,分别为业务分析和DAO层,Service层,Web层和高并发优化。本门课程是第二门课程,学习前需要了解如下知识: 1、精通JavaWeb基础 2、熟悉SpringMVC、Spring和MyBatis框架 3、了解事务和存储过程的概念
老师告诉你能学到什么?
1、掌握秒杀业务 2、能够进行SpringMVC+Spring+MyBatis的整合开发 3、能够对秒杀业务的瓶颈有所了解 4、能够实现对秒杀业务的优化

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!