php 关于锁的一些看法
背景:在一个项目中,需要一次对数据很复杂的计算,其中一次计算需要花费大概30秒钟时间,大概需要查询一个比较大的表300次左右,然后还需要进行查询7-8次数据库,然后进行组合排序等功能,完成最终结果。对于一个估算平均10w次的一个接口来说,无论从时间上讲和对于数据库的压力来说,这是完全不能接受的,但很幸运的是我们的需求只要求数据每天更新一次。
为此我们有了三种方法
第一种方案:这个方案是我一个同事提出,对300次查询进行优化,把计算结果规为一个表的一个属性,每天定时脚本得出这个属性,,这样查询只需7-8次就能完成。
第二种方案:这个方案是我另一个同事提出,对整个结果进行存储,这样就需要一句sql就能搞定,但是每天需要有一次比较长的查询排序放在一个结果表里面。
第三种方案:是我提出,为什么不把数据放在一个文件里面呢,这样数据库一次查询都没有了,不是降低了每天10w次的访问吗?于是我同事跟我说到进程同步问题,我很是迷茫,php不是有加锁功能吗?为什么不能放在一个文件里面,在使用file_put_content 加入LOCK_EX不是能预防读写锁问题吗。随着数据的增多,为什么一定要用数据库呢,几乎所有的瓶颈都是数据库上面,为什么不能尽量减少数据库的负担呢。于是我做了以下一些实验。
编写两个程序
process1:
set_time_limit(-1);
$filename="D://text.txt";
for($i=0;$i<100;$i++){
file_put_contents($filename, $i,FILE_APPEND|LOCK_EX);
sleep(1);
}
process2:
<?php
set_time_limit(-1);
$filename="D://text.txt";
$string = file_get_contents($filename);
for($i=0;$i<100;$i++){
if(empty($string)){
echo error_get_last().var_dump($string).'<br>';
}else{
echo $string."<br>";
}
sleep(1);
}
因为使用不同浏览器验证,我不知道这会不会产生什么影响。但是结果却是加锁后proceess2只能获得未加锁的内容。还是找不到关于为什么不能使用文件的原因,如果说数据完整和一致性管理上,第三种方法有他的劣势。但是我觉得跟进程无关。希望有人能回答我这些问题
另附我查询到的一些php锁资料
flock
(PHP 3 >= 3.0.7, PHP 4, PHP 5)
flock -- 轻便的咨询文件锁定
说明
bool flock ( int handle, int operation [, int &wouldblock] )
PHP 支持以咨询方式(也就是说所有访问程序必须使用同一方式锁定, 否则它不会工作)锁定全部文件的一种轻便方法。
注:
在 Windows 下 flock() 将会强制执行。
flock() 操作的 handle
必须是一个已经打开的文件指针。operation
可以是以下值之一:
要取得共享锁定(读取程序),将
operation 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。要取得独占锁定(写入程序),将
operation 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。要释放锁定(无论共享或独占),将
operation 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。如果你不希望 flock() 在锁定时堵塞,则给
operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
php 关于锁的一些看法的更多相关文章
- SQL Server中的锁 详解 nolock,rowlock,tablock,xlock,paglock
摘自: http://www.myexception.cn/sql-server/385562.html 高手进 锁 nolock,rowlock,tablock,xlock,paglock 锁 no ...
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
- SQL Server中CURD语句的锁流程分析
我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...
- java并发编程的艺术——第五章总结(Lock锁与队列同步器)
Lock锁 锁是用来控制多个线程访问共享资源的方式. 一般来说一个锁可以防止多个线程同时访问共享资源(但有些锁可以允许多个线程访问共享资源,如读写锁). 在Lock接口出现前,java使用synchr ...
- 基于Redis的分布式锁真的安全吗?
说明: 我前段时间写了一篇用consul实现分布式锁,感觉理解的也不是很好,直到我看到了这2篇写分布式锁的讨论,真的是很佩服作者严谨的态度, 把这种分布式锁研究的这么透彻,作者这种技术态度真的值得我好 ...
- 谈谈MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
在日常开发中,尤其是业务开发,少不了利用 Java 对数据库进行基本的增删改查等数据操作,这也是 Java 工程师的必备技能之一.做好数据操作,不仅仅需要对 Java 语言相关框架的掌握,更需要对各种 ...
- 谷歌pixel手机解BL锁、刷机、破解电信(史上最详细的帖子)
本文根据网上已有内容进行整理,对每一个步骤都进行了实践,运气爆棚,几乎没有出现什么重大错误,小错误也进行了很好地解决.因此,十分感激那些为折腾google pixel的IT爱好者,为我提供了无穷的帮助 ...
- 转自高手关于SQL 锁的叙述。。(nolock,rowlock,tablock,xlock,paglock)
锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: [丢失更新]A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...
- java锁类型
转载链接在每个锁类型后边 线程锁类型 1.自旋锁 ,自旋,jvm默认是10次吧,有jvm自己控制.for去争取锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchroni ...
随机推荐
- php 微信接口API之长链接转短链接代码示例
<?php header("Content-Type: text/html; charset=utf-8"); $longurl; if(isset($_POST['long ...
- hdu 1848 Fibonacci again and again(sg)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Python学习之路day3-字符编码与转码
一.基础概念 字符与字节 字符是相对于人类而言的可识别的符号标识,是一种人类语言,如中文.英文.拉丁文甚至甲骨文.梵语等等. 字节是计算机内部识别可用的符号标识(0和1组成的二进制串,机器语言) ...
- 分布式_理论_04_ 3PC
一.前言 五.参考资料 1.分布式理论(四)—— 一致性协议之 3PC 2.分布式理论(四) - 3PC协议 3.
- 速记JVM内存模型和垃圾回收策略
一.常用JVM参数 -Xms: 初始堆大小 -Xmx: 最大堆-Xmn: 新生代大小 -Xss: 栈容量 -PermSize: 方法区大小 -MaxPermSize: 最大方法区大小 -MaxDire ...
- XMLSchema验证
一.什么是Schema(XSD) XML Schema是微软定义的一套用来验证XML技术.是一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式. DTD的局限性: 1 ...
- I.MX6 dts 在哪里、怎么编译
/************************************************************************ * I.MX6 DTS 在哪里.怎么编译 * 说明: ...
- 微信小程序编写物流信息进度样式
做电商类型的小程序一定会碰到编写物流信息的时候,一般页面如下图 难点在于只有一条信息时候的页面样式 以及多条信息最后一条信息的页面样式 之前没做过这一块的东西,所以刚碰到的时候想了老半天orz.后来上 ...
- 关于jsp和html页面中的三种弹出框
代码: <!-- 引入jquery 由于在下面使用jquery选择器,与弹出框无关 --> <script type="text/javascript" src= ...
- 一文读懂非关系型数据库(NoSQL)
为了更好的理解非关系型数据库,我又深入的度娘了下 原文地址:https://baijiahao.baidu.com/po/feed/share?wfr=spider&for=pc&co ...