个人记录:2018年,工作的第6到7个年头。
重点研究自己不太擅长的技术:分布式、高并发、大数据量、数据库优化、高性能、负载均衡等。
个人看法
第1次看到有人想到用“文件锁”的,总体感觉不靠谱。
首先,我想到的是,创建文件file.lock,创建成功算得到锁。创建失败,就没有。这种做法,感觉比较耗费io性能。没有写代码测试。
其次,看了作者的想法,只是提到了“文件锁”,没有具体说明。
然后专门看了一篇关于Java文件锁的文章,“
Java 进程间文件锁FileLock详解
http://blog.csdn.net/wangbaochu/article/details/48546717”。
如果真的只是“进程间”,根本无法解决分布式并发的问题。
然后,“innodb引擎,则它的锁只能支持行锁。(查询速度比较慢)”innodb是后来出的引擎,支持行级锁,这个有亲自测试select for update可以根据where条件,锁住全表、几行、一行。但是,查询速度比较慢,也太不靠谱了。
既然支持了行级锁,意味着引擎升级了,更牛逼了。
查询是最基本的需求,这个还慢,谁还用呢?
网友的评论比较靠谱,“nnodb 写操作不影响查询速度,查询是快照读”,这个点还需要再次学习下。(不会的真多哎)
最后,推荐redis和Zookeeper。
写这个“分布式锁”的经验文章很多。
个人偏好,能用“软件”就尽可能用“软件”,文件更侧重硬件和操作系统一点。
互联网系统,更加侧重软件思维。
-------------------------------------------------------------------------------
原文链接:http://blog.csdn.net/qq_33567603/article/details/52800320
项目中并发下单的问题怎么解决?
解决方法肯定是用文件锁了,具体怎么做看数据库区的mysql模块下的mysql锁。
使用文件锁,先试试有没有其他方法,具体如下。背景知识:数据库存储引擎、表锁、文件锁。
数据库存储引擎:
如果是mysiam引擎,则它的锁只能支持表锁,所以要操作这个表的功能,都会被阻塞。这样做会拖慢整个网站的网速。
举个例子:
比如:我们下订单时,要锁定商品表,那么网站下订单的人非常多,那么商品表就一直处于被锁定的状态。
这样其他和商品表有关的操作,就会被阻塞!
而如果是innodb引擎,则它的锁只能支持行锁。(查询速度比较慢)故使用文件锁。
下单流程:
加锁->当多个人同时购买时,操作系统的底层确保只有一个客户在进行操作,其他的只能阻塞。
->先取出商品库存量,检查库存量,下单,减少库存量。->解锁
然后其他客户再操作,流程与上相同。