浅谈MySql的MVVC

摘要

MySQL的大多数事务性存储引擎实现都不是建单的行级锁。基于提升并发性能的考虑,他们一般都是同事实现了多版本并发控制。

可以认为MVVC是行级锁的一种变种,但是它在很多情况下避免了加锁操作,隐藏开销更低。虽然实现机制不同,但大家都实现了非阻塞的读操作,写操作也只锁定必要的行。

阅读全文

php垃圾回收

php是如何实现内存管理的?内存管理包括内存分配、内存回收、以及内存使用优化。

  • 内存使用的优化
  • 垃圾回收机制
  • 底层内存分配

阅读全文

php数组实现

php的数组依赖于hashtable实现的。

Times33的算法很简单,就是不断的乘33,下边是times33算法:

Times33(hash)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function myHash($str) {
// hash(i) = hash(i-1) * 33 + str[i]
$hash = 5381;
$s = md5($str); //相比其它版本,进行了md5加密
$seed = 5;
$len = 32;//加密后长度32
for ($i = 0; $i < $len; $i++) {
// (hash << 5) + hash 相当于 hash * 33
//$hash = sprintf("%u", $hash * 33) + ord($s{$i});
//$hash = ($hash * 33 + ord($s{$i})) & 0x7FFFFFFF;
$hash = ($hash << $seed) + $hash + ord($s{$i});
}
return $hash & 0x7FFFFFFF;
}

阅读全文

php数据结构

变量

php是如何统一实现各种变量类型的? 这和php变量类型的实现是密不可分的。
一个变量主要有三个要素:变量名``变量类型``变量值,他们在php变量类型实现中主要对应 zval zend_value 和
zend的各种数据类型。
php中用$去声明一个变量,在声明的时候可以进行初始化,当然也可以不声明直接使用。一般来说,一个变量的定义包含
两步:变量定义和变量初始化,在php中只定义不初始化是可以的。

阅读全文

php的引用

&

&是php中的引用,他并不一种独立的数据类型,而是指向其他数据类型的数据结构,和C语言的指针类似。

具体作用为:当我们修改引用类型变量是,其修改的将作用于实际引用的变量上。

阅读全文

算法-几种排序算法的实现

快速排序(快拍)

快速排序的思想是分治,平均时间复杂度O(nlogn),当然快速排序的时间复杂度并不是稳定的,最大时间复杂度是n^2。当然在用C语言实现的快速排序中,快速排序是原地排序,所有排序中空间复杂最低。

阅读全文

websocket订阅火币成交记录

python3

单线程:

文件一:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# -*- coding: utf-8 -*-
#author: maxie_lj
import _thread
from websocket import create_connection
from mysqlOpertion import connect_mysql
import gzip
import time
import json
# 链接
def connect():
while(1):
try:
print('')
# 挂代理
ws = create_connection("wss://www.huobi.br.com/-/s/pro/ws")
#print('链接成功')
return ws
break
except Exception as err:
#print(err)
#print('connect ws error,retry...')
time.sleep(1)
def getsubconfig():
# 统计参数
tradeStr=[
"""{"sub": "market.elfusdt.trade.detail","id": "id1"}""",
"""{"sub": "market.btcusdt.trade.detail","id": "id2"}""",
"""{"sub": "market.htusdt.trade.detail","id": "id3"}""",
"""{"sub": "market.swftcbtc.trade.detail","id": "id4"}""",
"""{"sub": "market.topcbtc.trade.detail","id": "id6"}""",
"""{"sub": "market.bchusdt.trade.detail","id": "id7"}""",
"""{"sub": "market.ethusdt.trade.detail","id": "id8"}""",
"""{"sub": "market.etcusdt.trade.detail","id": "id9"}""",
"""{"sub": "market.eosusdt.trade.detail","id": "id9"}""",
"""{"sub": "market.ltcusdt.trade.detail","id": "id9"}"""
]
return tradeStr
# 订阅
def sub(ws,tradeStr):
ws.send(tradeStr)
# 获取返回
def getResponse(ws,tradeStr):
db = connect_mysql.connect()
while 1 :
try :
compressData=ws.recv()
except Exception :
#print('链接异常')
run(tradeStr,1)
try :
result=gzip.decompress(compressData).decode('utf-8')
except:
#print('丢包解析异常')
continue
if result[:7] == '{"ping"':
ts=result[8:21]
#print('心跳包',ts)
pong='{"pong":'+ts+'}'
ws.send(pong)
else:
if result[:5] == '{"ch"':
result = json.loads(result)
#print(result)
#print('------------------------------------------------------')
n = 0
while n < len(result['tick']['data']) :
connect_mysql.commit('%s' % result['ch'].split('.')[1],result['tick']['data'][n]['price'],result['tick']['data'][n]['amount'],"'%s'" % result["tick"]["data"][n]["direction"], "'%s'" % result['ch'].split('.')[1],db);
n += 1
def subCoin(tradeStr):
ws=connect()
sub(ws,tradeStr)
getResponse(ws,tradeStr)
def run(tradeStr,test):
subCoin(tradeStr)
def main():
tradeStr=getsubconfig()
try :
tradeStr = getsubconfig()
i = 0
while i < len(tradeStr) :
_thread.start_new_thread( run, (tradeStr[i],i) )
i += 1
except Exception as err :
print(err)
while 1:
pass
if __name__ == '__main__':
main()

阅读全文

数据库-索引的使用优化

数据库索引使用的优化

索引的选择

B-tree

特点:

阅读全文

数据库-explain

官方文档

使用explain可以分析sql的执行情况,定位慢sql的问题,从而可优化查询语句。
explain的官方文档
explain的官方文档

阅读全文

数据库-mysql索引简介

摘要

因为各个数据库的索引机制不尽相同,在此涉及到mysql的两种索引b-treehash

阅读全文