lizhenqiu blog
最新评论流与站内评论搜索
Comment Stream
最新评论聚合
共 2892 条评论
Current Page
链接聚合
链接标签分页
Latest
评论流
第 25 / 145 页
当前展示 481 - 500 条,共 2892 条评论
javascript中new关键字详解
在Javascript 中,Fn的调用有三种方式:
1、直接调用:Fn 就是 普通函数 ,其this指向全局对象window
2、new操作符: Fn 就是 构造函数 , 其this指向新创建的对象
3、对象调用:Fn 就是 方法 ,其this指向调用它的那个对象
bind是返回对应函数,便于稍后调用,apply、call是立即调用;
404创意动画闪动页面
使用PHP生成二维码的两种方法(带logo图像)
二维码 QR Code 翻译
@意见反馈/技术支持/伊网/安企网
日本反鸡汤短片爆红:对不起,人生没有奇迹
太祖馈彧食,发之乃空器也,於是饮药而卒。
欢迎!毛片网址。
https://www.005wu.com/index.html
7m视频备用域名 : www.005ya.com www.005ta.com
https://www.silkengirl.com/model/kiera_winters.html
https://www.exgirlfriendmarket.com/kiera-winters-via-babes-network
https://www.boundhub.com/videos/190363/well-cum-on-girl/
https://www.babeimpact.com/galleries/eveline-neil-gets-fucked-10.html
https://www.pussystate.com/making-up-for-lost-time-featuring-nina-dolci/making-up-for-lost-time-featuring-nina-dolci-04.html
欢迎!毛片网址。
苍井空,川滨奈美,堤莎也加,町田梨乃,二阶堂仁美,饭岛爱,饭田夏帆,饭冢友子,芳本叶月,冈崎结由,冈田丽奈,高木萌美,高田礼子,高原流 美,宫本真美,宫岛司,古都光,光月夜也,河村亚季子,河井梨绪,黑崎扇菜,红月流奈,华歌恋,吉川萌,及川奈央,吉川真奈美,吉崎纱南,吉野莎莉,今井 明日香,今木翔子,金泽蓝子,进藤玲菜,井上可奈,久保美希,酒井未希,臼井利奈,菊池丽香,菊池英里,菊池智子,橘真央,具志坚阳子,可爱亚织沙,葵小 夏,蓝山南,兰望美,里见奈奈子,里美奈奈子,里美由梨香,立花丽华,立木爱,凉白舞,铃川玲理,铃江纹奈,铃木麻奈美,芦屋瞳,麻川美绪,麻生叶子,美 里霞,美崎凉香,美雪沙织,美月莲,明日香,木谷麻耶,奈奈见沙织,内藤花苗,内田理沙,鲇川亚美,片濑亚纪,平山朝香,前原优树,前原佑子,浅见伽椰, 浅井理,青木琳,青木玲,青野诗织,青羽未来,青沼知朝,秋本玲子,秋菜里子,秋元优奈,如月可怜,若林树里,若月树里,森下理音,纱月结花,杉浦清香, 杉山亚来,山下由美子,杉原凉子,上原留华,神城千佳,神崎麻衣,神崎麻子,矢吹丽,手束桃,树本凉子,水城凛,水野朋美,水野茜,水越丽子,四季彩香寺 田弥生,松浦梦,松浦唯,松田千夏,松下爱来,松下可怜,松元静香,速水真保,藤彩香,藤代流花,藤崎秋,藤森智子,天衣美津,田村麻衣,望月瞳,舞岛美 织,午后野弥生,西泽友里,夏美舞,相川未希,相户爱,相田由美,小仓杏,小川流果,筱宫知世,小栗杏菜,小森美王,小室优奈,小野由佳,筱原凉,小泽菜 穗,小泽玛丽亚,筱冢真树子,星爱丽斯,星崎瞳,星野绫香,星野洋子,星野真弥,徐若樱,雪乃小春,岩下美季,遥优衣,野宫美忧,野原奈津美,叶月千穗, 伊东美华,一色丽矢,一色鲇美,一条沙希,乙伊沙也加,樱井沙也加,由树莉莉,有川真生,有吉奈生子,有森玲香,雨宫优衣,原千寻,原史奈,原田春奈,远 野麻耶,月野静玖,早纪麻未,早乙女舞,泽舞音,长濑爱,长月亚美,真木亚里沙,真山润,中川珠代,中村理央,中根由真,中山美玖,中原绫,仲井美帆,竹 田树理,佐伯美奈,佐佐木,幸田梨纱,北原爱子,成膳任,戴文青木,德永千奈美,笛木优子,福原爱,高见美香,高树玛丽亚,宫崎葵,观月雏乃,海江田纯 子,后藤理莎,后藤香南子,矶山沙耶香,矶山沙也加,吉冈美穗,吉泽瞳,加纳则子,加藤小雪,菅谷梨沙子,结城翼,井上和香,井上熏,酒井瑛里,久纱野水 萌,铃木爱理,玲木美生,泷泽乃南,美依旗由美,木下亚由美,前田知惠,前原爱,浅田真央,清水佐纪,入江纱绫,三尺真奈美,三宅尚子,森下千里,上原 绫,石村舞波,矢田亚希子,市川由衣,市井纱耶香,嗣永桃子,松岛菜菜子,松居彩,松元莉绪,樋口真未,细川直美,夏烧雅,相乐纪子,小川熏,小林惠美, 小野奈美,小泽真珠,星野亚希,须藤茉麻,亚纪奈,岩田小百合,伊藤步,优香,友崎玲,中泽裕子,佐藤麻纱,安藤沙耶,奥山唯子,白崎令于,柏木奈纯,板 谷佑,滨田翔子,朝雾唯,川崎爱,大和抚子,大西由梨香,岛田百合花,二宫优,绀野舞子,岗原厚子,高鸠阳子,古河由摩,谷田未央,河合绫纯美,和久井 辛,和希沙,黑田美礼,横仓里奈,后藤亚维梨,户田惠梨香,吉濑美智子,加藤麻依,江纱绫,井上诗织,井上优香,井真理绘,堀井美月,莲沼民子,柳明日, 落合玲奈,牧濑奈美,木下亚由,奈良沙绪理,浅丘南,秋本那夜,秋山玲子,秋庭比吕子,三尺真奈,三井保奈美,森下真理,山吹美花,山口纱弥加,杉里香, 神代弓子,树梨沙,水谷利加,松鸠永里奈,松山麻美,松屿初音,塔山直美,藤香南子,天使美树,天野理惠,田崎由希,桐岛淳子,尾崎美果,西野美绪,相泽 优香,小林里实,小早川洋子,叶山小姬,樱树露衣,樱田佳子,永井绘理香,远藤真纪,早川美波,早川桃香,折原琴,中鸠广香,中泽夏木,竹野内丰,佐藤江 梨花,爱内萌,爱田露美,爱田毛毛,安倍夏实,安原真美,奥山香,八木泽,白川美奈美,白鸟智惠子,白亚朱里,北山静香,北原步,北原真裕,仓本安奈,仓 田杏里,朝比奈真理,朝仓加穗里,朝仓玛丽亚,持田茜,冲田由加里,川奈由依,大友梨奈,岛田香奈,堤沙也加,渡边香,风间舞,风见京子,福山洋子,冈本 夏生,高仓梨奈,高野瞳,宫本瞳,宫本阳子,宫地奈,宫间沙布子,工藤瞳,宫下杏菜,河田纯子,和希结衣,横山千枝,华美月,姬野莉梦,吉田友里,吉野 碧,菅野美寿纪,江口美贵,结衣美沙,金城美丽,井上彩菜,井上雅,鸠村熏,酒井美幸,菊池则江,君岛美香,可爱亚芝莎,来栖敦子,蓝原夕妃,蛯原舞,立 花优,立原贵美,恋野恋,铃木由美,麻生岬,麻生真美子,麻田子,茂森亚弓,美波志保,木内亚吉拉,内田京香,品田由依,平山绫,前岛美步,前田亚纪,浅 见怜,浅野子,青木美里,清木裕子,青山遥,青山叶子,三濑真美子,三崎真绪,三上夕希,三尾安齐,森宏子,森山子,森野雫,山口理惠,山口美纪,山口 萌,杉山圭,杉田惠美,山田誉子,杉原爱砂,上原亚也加,神崎美树,神田美沙纪,圣瑛麻,石川恩惠,石川瞳,石川优季奈,矢吹凉子,矢吹麻理奈,矢择优 子,水城梓,水希遥,松岛奈奈子,松纱良,速水怜,藤井彩,藤崎弭代,田山真美子,田中梨子,田中美久,瞳理欧,望月七,望月沙香,望月英子,武田真治, 夏结玲,相纪美,相乐晴子,相仁泽美,相原里奈,翔巴辉,小池亚弭,小峰由衣,筱宫庆子,小田凉子,小向杏奈,小野濑,幸田李梨,岩崎千鹤,野宫凛子,野 野由利加,叶山路易,一宫理绘,伊藤美沙纪,一条小百合,樱庭凉子,永井流奈,优木里绪奈,优木美纱,羽田夕夏,原惠美子,远山雪乃,远藤梨奈,早濑理 沙,早乙女香织,长谷川,真纯麻子,织原奈美,柊丽子,中条佳奈子,中野美奈,仲村桃,足立美,佐藤有纪,八木亚希子,朝比奈英里,朝仓仁美,朝仓香乃, 朝仓遥,朝美光,朝美绘乃香,朝丘瞳,朝霞佳绘美,赤西凉,川野亚希子,大久保玲,饭干惠子,福光千穗,冈田安希,高以亚希子,和久井由菜,吉木纯菜,吉 泽京子,井上华菜,君野梦,堀切子,楠麻耶,南使香,平丸久美子,青木友梨,仁乃庆子,三浦富美子,山本京子,榊彩弥,矢野显子,水野亚美,水泽千夏,太 田优,藤森子,相崎琴音,相泽纪美
简单返回顶部代码及注释说明
自动保存记录页面滚动条距离返回滚动到位置
jq获取滚动条高度
前些天遇到了,针对浏览器窗口的滚动条,结果在ie下有兼容性,就查了一下,整理
jQuery中,$(document).scrollTop()与 $(window).scrollTop()效果完全相同
但是,(window).scrollTop()被所有浏览器支持
所以,以后尽量用(window).scrollTop()
go() 方法可加载历史列表中的某个具体的页面。
该参数可以是数字,使用的是要访问的 URL 在 History 的 URL 列表中的相对位置。(-1上一个页面,1前进一个页面)。或一个字符串,字符串必须是局部或完整的URL,该函数会去匹配字符串的第一个URL。
history.go(number|URL)
javascript中new关键字详解
认识函数对象(Function Object)
可以用function关键字定义一个函数,对于每个函数可以为其指定一个函数名,通过函数名来进行调用。这些都是代码给用户的印象,而在JavaScript解释执行的时候,实际上每
个函数都是被维护为一个对象。
函数对象与其它用户所定义的对象有着本质的区别,这一类对象被称之为内部对象,例如日期对象(Date)、数组对象(Array)、字符串对象(String)都是属于内部对象。换句话说,这些内置对象的构造器是由JavaScript本身所定义的:通过执行new Array()这样的语句返回一个对象,JavaScript 内部有一套机制来初始化返回的对象,而不是由用户来指定对象的构造方式。
在 JavaScript中,函数对象对应的类型是Function,正如数组对象对应的类型是Array,日期对象对应的类型是Date一样,可以通过new Function()来创建一个函数对象,也可以通过function关键字来创建一个对象。为了便于理解,将函数对象的创建和数组对象的创建来比较。先看数组对象:下面两行代码的作用是一样的,都是创建一个数组对象myArray:
var myArray=[];
//等价于
var myArray=new Array();
同样,下面的两段代码也是等价的,都是创建一个函数myFunction:
function myFunction(a,b){
return a+b;
}
//等价于
var myFunction=new Function("a","b","return a+b");
现在上面的代码还有些难以理解,但是通过和构造数组对象语句的比较,可以清楚的看到函数的对象本质,前面介绍的函数声明是上述代码的第一种方式,而在解释器内部,当遇
到这种语法时,就会自动构造一个Function 对象,将函数作为一个内部的对象来存储和运行。
从这里也可以看到,一个函数对象名称(函数变量)和一个普通变量名称具有同样的规范,都可以通过变量名来引用这个变量,但是函数变量名后面可以跟上括号和参数列表来进
行函数调用。
也许不会有人通过new Function()的形式来创建一个函数,因为一个函数体通常会有多条语句,如果将它们以一个字符串的形式作为参数传递,那么代码的可读性会非常的差。下面介绍一下其使用语法:
var funcName=new Function(p1,p2,...,pn,body);
参数的类型都是字符串,p1 到pn表示所创建函数的参数名称列表,body表示所创建函
数的函数体语句,而funcName就是所创建函数的名称了。可以不指定任何参数创建一个空
函数,不指定funcName创建一个无名函数,当然那样的函数什么用处都没有。
需要注意的是,前面说p1 到pn是参数名称的列表,这意味着p1不仅仅只能代表一个
参数,它也可以是一个逗号格开的参数列表,例如下面的定义是等价的:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
JavaScript引入Function类型并提供new Function()这样的语法来创建函数并不是毫无意
义的,在后面可以看到,函数作为一个对象,它本身就可以具有一些方法和属性,而为函数
对象添加属性和方法就必须借助于Function这个类型。
现在已经认识到了函数的本质,它其实是一个内部对象,由JavaScript解释器决定其运
行方式。通过上述代码创建的函数,在程序中可以使用函数名进行调用。于是在本节开头列
出的函数定义问题也得到了解释:它们都是创建函数对象的正确语法。注意直接在函数声明
后面加上括号就表示创建完成后立即进行函数调用,例如:
var i=function (a,b){
return a+b;
}(1,2);
alert(i);
这段代码会显示变量i 的值等于3。i 是表示返回的值,而不是创建的函数,因为括号
“(”比等号“=”有更高的优先级。这样的代码可能并不常用,但当用户想在很长的代码段
中进行模块化设计或者想避免命名冲突,这是一个不错的解决办法。
需要注意的是,尽管下面两种创建函数的方法是等价的:
function funcName(){
//函数体
}
//等价于
var funcName=function(){
//函数体
}
但前面一种方式创建的是有名函数,而后面是创建了一个无名函数,只是让一个变量指
向了这个无名函数。在使用上仅有一点区别,就是:对于有名函数,它可以出现在调用之后
再定义;而对于无名函数,它必须是在调用之前就已经定义。例如:
<script language="JavaScript" type="text/javascript">
<!--
func();
var func=function(){
alert(1)
}
//-->
</script>
这段语句将产生func未定义的错误,而:
<script language="JavaScript" type="text/javascript">
<!--
func();
function func(){
alert(1)
}
//-->
</script>
则能够正确执行,甚至下面的语句也能正确执行:
<script language="JavaScript" type="text/javascript">
<!--
func();
var someFunc=function func(){
alert(1)
}
//-->
</script>
由此可见,尽管JavaScript是一门解释型的语言,但它会在进行函数调用时,检查整个
代码中是否存在相应的函数定义,这个函数名只有是通过function funcName()形式定义的才
会有效,而不能是匿名函数。
PHP高并发Redis MySQL重复插入测试笔记
PHP中利用redis实现消息队列处理高并发请求
可以把相同用户名并发的列为排队
如果是要更新,可以不知道总金额,直接更新就可以:
另外,可以考虑用更新锁updlock:
乐观并发控制,一般能也只是指对于读和写之间,而不是写和写之间的。
我理解的加了更新锁的执行顺序是
1、T1进来 查询到了totalMoney
2、T2进来 想查询totalMoney 但发现这一行有个更新锁而且T1没有commit,所以等待
3、T1提交,释放更新锁
4、T2能查询totalMoney了 继续执行了
楼主看一下数据库锁的概念吧,更新操作会加排他锁(之前还有更新锁),所以两个更新操作不会并发的。
简单回答你的问题的话,update确实是原子操作
#2先更新(更新会锁表) 然后在查询 如果金额超出预期 直接回滚 ,更新中 将加减运算放在sql中执行 可以保证数据准确性。
PHP高并发Redis MySQL重复插入测试笔记
时间复杂度
时间复杂度简单的理解就是执行语句的条数。如果有循环和递归,则忽略简单语句,直接算循环和递归的语句执行次数。
比如:
具体例子:
1、O(1)
2、O(n)
所举例子都比较简单。
空间复杂度
空间复杂度也很简单的理解为临时变量占用的存储空间。一个简单例子:
一个临时变量temp,所以空间复杂度为O(1)。
其他常见复杂度
除了常数阶、线性阶、平方阶、对数阶,还有如下时间复杂度:
f(n)=nlogn时,时间复杂度为O(nlogn),可以称为nlogn阶。
f(n)=n³时,时间复杂度为O(n³),可以称为立方阶。
f(n)=2ⁿ时,时间复杂度为O(2ⁿ),可以称为指数阶。
f(n)=n!时,时间复杂度为O(n!),可以称为阶乘阶。
f(n)=(√n时,时间复杂度为O(√n),可以称为平方根阶。
[table][thead] [tr] n[/th] logn[/th] √n[/th] nlogn[/th] n²[/th] 2ⁿ[/th] n![/th] [/tr] [/thead] [tbody][tr] 5[/td] 2[/td] 2[/td] 10[/td] 25[/td] 32[/td] 120[/td] [/tr] [tr] 10[/td] 3[/td] 3[/td] 30[/td] 100[/td] 1024[/td] 3628800[/td] [/tr] [tr] 50[/td] 5[/td] 7[/td] 250[/td] 2500[/td] 约10^15[/td] 约3.0*10^64[/td] [/tr] [tr] 100[/td] 6[/td] 10[/td] 600[/td] 10000[/td] 约10^30[/td] 约9.3*10^157[/td] [/tr] [tr] 1000[/td] 9[/td] 31[/td] 9000[/td] 1000 000[/td] 约10^300[/td] 约4.0*10^2567[/td] [/tr] [/tbody][/table]
[table][thead] [tr] [th]n[/th] [th]logn[/th] [th]√n[/th] [th]nlogn[/th] [th]n²[/th] [th]2ⁿ[/th] [th]n![/th] [/tr] [/thead] [tbody][tr] [td]5[/td] [td]2[/td] [td]2[/td] [td]10[/td] [td]25[/td] [td]32[/td] [td]120[/td] [/tr] [tr] [td]10[/td] [td]3[/td] [td]3[/td] [td]30[/td] [td]100[/td] [td]1024[/td] [td]3628800[/td] [/tr] [tr] [td]50[/td] [td]5[/td] [td]7[/td] [td]250[/td] [td]2500[/td] [td]约10^15[/td] [td]约3.0*10^64[/td] [/tr] [tr] [td]100[/td] [td]6[/td] [td]10[/td] [td]600[/td] [td]10000[/td] [td]约10^30[/td] [td]约9.3*10^157[/td] [/tr] [tr] [td]1000[/td] [td]9[/td] [td]31[/td] [td]9000[/td] [td]1000 000[/td] [td]约10^300[/td] [td]约4.0*10^2567[/td] [/tr] [/tbody][/table]
PHP高并发Redis MySQL重复插入测试笔记
时间复杂度和空间复杂度
算法复杂度分为时间复杂度和空间复杂度。
其作用:
时间复杂度是指执行算法所需要的计算工作量;
而空间复杂度是指执行这个算法所需要的内存空间。
(算法的复杂性体现在运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度)。
简单来说,时间复杂度指的是语句执行次数,空间复杂度指的是算法所占的存储空间
时间复杂度
计算时间复杂度的方法:
用常数1代替运行时间中的所有加法常数
修改后的运行次数函数中,只保留最高阶项
去除最高阶项的系数
按数量级递增排列,常见的时间复杂度有:
常数阶O(1),对数阶O(log2n),线性阶O(n),
线性对数阶O(nlog2n),平方阶O(n2),立方阶O(n3),…,
k次方阶O(nk),指数阶O(2n)。
随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
举个栗子:
最坏时间复杂度和平均时间复杂度
最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。
这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。
平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,算法的期望运行时间。设每种情况的出现的概率为pi,平均时间复杂度则为sum(pi*f(n))
常用排序算法的时间复杂度
空间复杂度
空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度,记做S(n)=O(f(n))。
对于一个算法来说,空间复杂度和时间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当追求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。
有时我们可以用空间来换取时间以达到目的。
时间复杂度大概就是运行时间和输入规模的函数,简单的说,一个函数处理 n 个数字,需要 f(n) 秒的时间,时间复杂度就为 O(f(n));空间复杂度把时间换成内存
时间复杂度O(n)表示程序运行时间跟n有关,并且是线性关系。
空间复杂度O(1),表示所需空间为常量,并且与n无关。
要在 hash 表中找到一个元素就是 O(1)
要在无序数组中找到一个元素就是 O(n)
访问数组的第 n 个元素是 O(1)
访问链表的第 n 个元素是 O(n)
我给你一个简单的判断方法:
如果实现中没有循环就是 O(1)
如果实现中有一个循环就是 O(n)
举个简单的例子,要从0加到n,我们会这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
sum += i;
}
一共算了n次加法,那么就说这个时间复杂度是O(n)。当然O(n)的精确的概念是,是n的最高次方,比如,某个计算共计算了3n + 2次,那么这个时间复杂度也是O(n),因为3n + 2中的最高次方是n。
如果代码这么写:
int sum = 0;
for(int i = 0; i<=n; ++i)
{
for(int j = 0; j <=n; ++j)
{
sum += (i + j);
}
}
很显然一共算了n^2次加法,那么就说这个时间复杂度是O(n^2),和上面类似,如果某个算法计算了3*n^2 + n + 1次,其时间复杂度仍然是O(n^2),因为3*n^2 + n + 1中最高的次方是n^2
所谓O(1)就是计算的次数是个常量,我们还以上面从0加到n的例子来说,如果我们用等差数列的公式,那么,代码可以这么写:
int sum = n * (n + 1) / 2
不管n有多大(当然不能溢出了),通过上面的公式只需计算一次,也就说计算的次数是不变的,这种情况的时间复杂度就可以说成O(1)。 再比如如果某个计算,不管其他条件怎么变化,均只需计算5次即可得出结果,那么这种情况的时间复杂度,也是O(1)。
@意见反馈/技术支持/伊网/安企网
一旦发现英雄也会落井,投石的人格外勇敢,人群会格外拥挤。
天下最可厌可憎可鄙之人,莫过于旁观者。
真诚的友谊来自于不断的自我介绍
人类语言真是奇妙,这种人人都有的东西居然可以拿来骂人
没什么奇怪的,当非法所得超过正当所得,又不会受到严厉制裁,你会怎么选择?显而易见
PHP高并发Redis MySQL重复插入测试笔记
bool PDO::rollBack ( void )
回滚由 PDO::beginTransaction() 发起的当前事务。如果没有事务激活,将抛出一个 PDOException 异常。
如果数据库被设置成自动提交模式,此函数(方法)在回滚事务之后将恢复自动提交模式。
包括 MySQL 在内的一些数据库, 当在一个事务内有类似删除或创建数据表等 DLL 语句时,会自动导致一个隐式地提交。隐式地提交将无法回滚此事务范围内的任何更改。
exec执行一条SQL语句,并返回受影响的行数。此函数不会返回结果集合。
execute函数是用于执行已经预处理过的语句,只是返回执行结果成功或失败。也就是说execute需要配合prepare函数使用,这个的确是麻烦了一点,每次都要先prepare,然后才能exec
利用insert特性,直接用一条SQL插入多行内容
PDO绑定参数
使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values (),(),(),()然后再一次性插入,如果字符串太长,
则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet = 2*1024*1024*10;消耗时间为:11:24:06 11:25:06;
插入200W条测试数据仅仅用了1分钟!代码如下:
1、使用fetchAll函数 $q = $db->query("SELECT ..."); $rows = $q->fetchAll(); $rowCount = count($rows);
2、使用sql count函数 $q = $db->query("SELECT count(*) from db;"); $rows = $q->fetch(); $rowCount = $rows[0];
显然第二种方法更有效率
PHP高并发Redis MySQL重复插入测试笔记
数据库高并发情况下重复值写入的避免 字段组合约束
10线程同时操作,频繁出现插入同样数据的问题。虽然在插入数据的时候使用了:
insert inti tablename(fields....) select @t1,@t2,@t3 from tablename where not exists (select id from tablename where t1=@t1,t2=@t2,t3=@t3)
当时还是在高并发的情况下无效。此语句也包含在存储过程中。(之前也尝试线判断有无记录再看是否写入,无效)。
因此,对于此类情况还是需要从数据库的根本来解决,就是约束。否则数据库的原子操作细不到我所需要的层面。
添加约束的命令行用得人不多,网上每次找SQL语句都累死,还是写下来好了。
需要的关键就叫做 字段组合约束唯一性
alter table tablename add CONSTRAINT NewUniqueName Unique(t1,t2,t3)
这样可以保证三个字段组合不重复
在生产系统数据库的调整真是锱铢必较。。。。。。
对于数据库读操作的重复暂时没有好的解决方法,就是读数据库某些条目同时将这些条目某个字段修改为1,然后其他进程读的时候就不会重复读取。但是在多线程情况下即使我使用了SQL SERVER 2005最新的特性,就是类似update...output into到临时表的方法:
update tablename set OnCheck=1,LastLockTime=getdate(),LastChecktime=getdate()
output deleted.ID into @newtb
where ID in
(select id from tablename where Oncheck=0)
还是会造成重复读。难道没有更好的办法了吗?
PHP高并发Redis MySQL重复插入测试笔记
反引号一般在Esc键的下方,和~在一起。它是为了区分MySQL的保留字与普通字符而引入的符号。
create table desc 报错
create table `desc` 成功
一般我们建表时都会将表名,库名都加上反引号来保证语句的执行度。
PHP高并发Redis MySQL重复插入测试笔记
时间复杂度O(1)与O(n)
时间复杂度是一个函数,它定量描述了该算法的运行时间。常见的时间复杂度有以下几种。
1,log(2)n,n,n log(2)n ,n的平方,n的三次方,2的n次方,n!
1指的是常数。即,无论算法的输入n是多大,都不会影响到算法的运行时间。这种是最优的算法。而n!(阶乘)是非常差的算法。当n变大时,算法所需的时间是不可接受的。
用通俗的话来描述,我们假设n=1所需的时间为1秒。那么当n = 10,000时。
O(1)的算法需要1秒执行完毕。
O(n)的算法需要10,000秒 ≈ 2.7小时 执行完毕。
O(n2)的算法需要100,000,000秒 ≈ 3.17年 执行完毕。
O(n!)的算法需要XXXXXXXX(系统的计算器已经算不出来了)。
可见算法的时间复杂度影响有多大。
所以O(1)和O(n)差了2.7小时,区别显而易见。
@意见反馈/技术支持/伊网/安企网
农行卡
李振球
622848 083830840 9179
PHP高并发Redis MySQL重复插入测试笔记
高并发系统的限流
1.计数器
2.滑动窗口
3.漏桶算法
4.令牌桶算法
PHP高并发Redis MySQL重复插入测试笔记
mysql的锁和存取钱
在处理锁的问题上,经常听到:共享锁、排它锁、悲观锁、乐观锁、行级锁、表级锁。
共享锁: 就是在读取数据的时候,给数据添加一个共享锁。共享和共享直接是不冲突的,但是和排他锁是冲突的。
排他锁: 更新数据的时候,安装排他锁,禁止其他一切行为。
场 景:老公去在 ATM 上取钱,老婆在柜台存钱,假设这个账户中有 1000 元。老公首先执行查询操作,查询到账户余额为 1000 此时程序 将 1000 拿到内存中,老公取了200 元,程序就执行了更新操作将账户余额改为 800,但是当老公的程序没有 commit 的时候,老婆查询账户,此时账户余额还是 1000 元,老婆存入 200 元,程序执行了更新操作将账户余额改为 1200,然后老公将更新语句提交,接着老婆也将更新语句提交。最后导致的结果就是该账户的余额为 1200,这就是更新丢失的问题。引发更新丢失的根源就是查询上,因为双方都是根据从数据库查询到的数据再对数据库中的数据进行更新的。
解决更新丢失有三个方案:
(1) 将事务隔离级别设置为最高,采用死锁策略。
(2) 采用悲观锁,悲观锁不是数据库中真正的锁,是人们看待事务的态度。
(3) 采用乐观锁,乐观锁也不是数据库中真正的锁。
如 果我们采用的是第一个方案时,老公进行查询操作,数据库为表增加了共享锁,老婆进行查询操作时数据库也增加了一个共享锁。但是当老公进行更新数据库操作 时,由于老婆拿着共享锁,导致老公不能增加排它锁,老婆进行更新操作时,因为老公拿着共享锁,导致老婆也拿不到排它锁,这就发生了死锁现象,你等我,我等你。在 mysql 中,处理死锁的方案是释放掉一方的锁。这样就保证了一方更新成功,但是这种性能极低,因为数据库频繁在解决死锁问题。
悲观锁(更新多,查询少时用)
如果我们采用的是第二个方案时,即采用悲观锁。就是我们在操作数据库时采用悲观的态度,认为别人会在此时并发访问数据库。
我们在查询语句中 select * from account where name='aaa' for update; 等于加了排它锁。
当老公查询余额的时候,select money from account where name='aaa' for update; 增加了排它锁,
老婆查询账户余额的时候, select money from account where name='aaa' for update; 也要求对数据库加排它锁,
因为老公已经拿到了排它锁,导致老婆不能加锁,所以老婆只有等待老公执行完毕,释放掉锁以后才能继续操作。
乐观锁(更新少,查询多时用)
如 果我们采用的是第三个方案时,即采用乐观锁,就是我们在操作数据库的时候会认为没有其它用户并发访问,但是乐观锁也不是完全乐观的,乐观锁是采用版本号的 方式进行控制的。在数据库表中有一列版本号。从数据库中查询的时候,将版本号也查询过来,在进行更新操作的时候,将版本号加1,查询条件的版本号还是查询过来的版本号。
比如:
老公执行查询操作
select money,version from account where name='aaa';
假设此时查询到的版本号为 0,
老公在进行更新操作
update account set money=money+100,version=version+1 where name='aaa' and version=0;
未提交时老婆来查询,查询到的版本号依然是 0,
老婆也执行更新操作
update account set money=money+100,version=version+1 where name='aaa' and version=0;
现在老公提交了事务,老婆再提交事务的时候发现版本号为 0 的记录没有了,所以就避免了数据丢失的问题。不过这种情况也导致了多个用户更新操作时,只有一个用户的更新被执行。
行级别的锁:
select * from employee where employeeID=9857 for update; where 后边是索引列 不是索引列那么就为表级别的锁
PHP高并发Redis MySQL重复插入测试笔记
PDO 的事务处理
事务处理具有四个特性:原子性、一致性、独立性、持久性。
并不是所有的数据库都支持事务处理的,PDO 为能够执行事务处理的数据库提供事务支持。
配置事务处理需注意:
1、关闭 PDO 的自动提交;
2、开启一个事务需要的方法;
3、一般事务处理是运行在 try...catch...语句中,当事务失败时执行 catch 代码段。
在事务中的 SQL 语句,如果出现错误,那么所有的 SQL 都不执行。当所有 SQL 有无误的时候,才提交执行。