并发秒杀实践

    xiaoxiao2021-12-03  36

    因为之前做项目还是用脚本语言更多一些,java的东西有段时间不碰了,正好在慕课上看到这个教程,所以跟着走了一遍自己完整的实现出来找找感觉,整体感觉还是视频讲解的还是不错的,代码也比较规范,实际中的并发秒杀肯定会比这个更复杂的,但是这里对核心内容提炼一下能让大家有个整体的认识。 下面我开始谈一谈关于此次实践的理解与收获。

    技术栈

    SpringMVCSpringMyBatisRedisMySQLbootstrapjquery

    项目完整源代码,请查看我的github

    截图

    进入正题,具体业务逻辑我就没必要说了,谈我的理解

    1、 代码如何书写?

    首先在java的世界里,你要对你的代码负责,有些地方封装和不封装都不会影响你的功能和使用,但会影响代码的可读性和后期维护的难易度,我的理解是这样的,思考这个整体逻辑流程的时候站在用户的角度(尽量先不要用技术的角度去思考),相对宏观的把思路理清,然后在工程中去书写整体的代码(一个功能模块在执行的时候就是一个函数或者一个对象,具体实现内容封装起来放到对应包下),java工程的entity,dao,service,controller等层次的设计也是这个道理,不过这对于我们还不够,在对应层次的代码书写我们该封装的时候还要继续封装(比如自定义异常和自定义满足需求的对象等等),要体现出java面向对象的设计理念,有本书可以推荐给大家《代码整洁之道》。

    2、并发秒杀是如何实现的?

    在这个实践当中简要概括的话就是采用的mysql的事务锁,当一个事务操作commit/rollback之后,其他操作才能获取mysql的lock,依次往下,从而保证事务的完整性,这里因为在并发的情况下,这种事务锁、java与数据库通信和java对象本身的GC(垃圾回收)的消耗会让mysql的效率下降很多,所以在下一段落会介绍如何做优化。(在这里提一下nosql那类的不支持事务操作的是通过其本身原子性操作来实现的)

    3、如何优化的?

    直奔主题:把这种数据库操作全都交给数据库去是执行,最后告诉java个结果就好,这就是通过数据库的存储过程来实现的。其次就是对一些频繁的操作做缓存处理(前提是可以缓存,你肯定不能把实时在变化的数据缓存起来),这个实践当中缓存的就是识别每个商品的Token值,每次去秒杀商品的时候都需要先访问暴露接口获取token值,然后有一个正确的token值才能进行秒杀操作,所以每次都会请求这个后端api,所以在这里使用redis进行缓存。

    4、 由商品token而联想的Token验证登陆方式

    在这个小项目中他登陆做的还是比较简陋,不过在一些相对更完整的应用中都会用心设计他们的登陆,一大类就是基于cookie,session的登陆验证,登陆成功之后将标识信息存储在session或者cookie当中,cookie与session的区别就是cookie在浏览器端,session在服务器端(cookie不安全,不要存储重要信息)。 另外一种就是基于Token验证的方式,比如oAuth2这种协议,核心原理就是根据你的用户特别标识通过它后端的加密得到的Token值,这个值会返回给客户端,然后之后的每次客户端请求,客户端都需要连同token值一起发过去进行验证。这种方式的好处就是前后端解耦,后端api还可以不做修改的应用到别处。而且也更安全。

    还在上课呢,暂时就写这么多,待续。。。

    转载请注明原文地址: https://ju.6miu.com/read-680162.html

    最新回复(0)