背景:网卡流量80,如果是100M的网卡可能是瓶颈,而如何知道这个网卡是100M还是1000M的?用命令查询一下。阿里云的虚拟机好像看不到,用另一个命令看,这块涉及到网卡是否支持多队列网卡识别,Capabilities: [70] MSI-X: Enable+Masked-TabSize=10,阿里的是:Capabilities: [40] MSI-X: Enable+ Count=3 Masked-,参考链接:http://blog.sina.com.cn/s/blog_aed82f6f0102vwjx.html ,http://blog.csdn.net/wyaibyn/article/details/14109325。
lspci -vvv|grep network -B 1 -A 15




物理机上:
ethtool eth0


1.使用lspci -vvv命令查看网卡的参数。
Ethernet controller的条目内容,如果有MSI-X && Enable+ && TabSize > 1,则该网卡是多队列网卡。
2.如何打开网卡多队列
cat /etc/modprobe.conf查看网卡驱动。
broadcom网卡的驱动为e1000,默认打开网卡多队列
修改完驱动后需要重启。查看是否打开了网卡多队列,以broadcom网卡为例。cat /proc/interrupt | grep eth。产生了8个网卡队列,并且对应着不同的中断。

3.设置中断CPU亲和性方法
将中断52-59分别绑定到CPU0-7上。        
echo "1" > /proc/irq/52/smp_affinity  
echo "2" > /proc/irq/53/smp_affinity  
echo "4" > /proc/irq/54/smp_affinity  
echo "8" > /proc/irq/55/smp_affinity  
echo "10" > /proc/irq/56/smp_affinity  
echo "20" > /proc/irq/57/smp_affinity  
echo "40" > /proc/irq/58/smp_affinity  
echo "80" > /proc/irq/59/smp_affinity  
/proc/irq/${IRQ_NUM}/smp_affinity为中断号为IRQ_NUM的中断绑定的CPU核的情况。以十六进制表示,每一位代表一个CPU核。
1(00000001)代表CPU0
2(00000010)代表CPU1
3(00000011)代表CPU0和CPU1



阿里私有云虚拟的网卡有些简单:
ethtool eth0
Settings for eth0:
        Link detected: yes


ethtool 工具关于网络协商功能介绍;

ethtool - Display or change ethernet card settings(ethtool 是用来显示和更改网卡设置的工具);这个工具比较复杂,功能也特别多。由于洋文比较难懂。所以我们还是把网络设备协商方式的设置方法说一说。

2.1 ethtool 显示网络端口设置功能;
这个功能比较好办。就是ethtool 后面直接接网絽接口就行;比如下面的例子;
[root@localhost ~]# ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes: 10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes: 10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
        Advertised auto-negotiation: No 注:自动协商关闭
        Speed: 100Mb/s 注:速度 100Mb
        Duplex: Full 注:全双工
        Port: MII
        PHYAD: 32
        Transceiver: internal
        Auto-negotiation: off
        Supports Wake-on: pumbg
        Wake-on: d
        Current message level: 0x00000007 (7)
        Link detected: yes 注:eth0已经激活;


摘自:https://my.oschina.net/u/1986074/blog/517033


======================================================================
现象
Redis 进程 cpu 跑满

原因

没有开启网卡多队列,导致只有一个cpu被使用
网卡在同一时刻只能产生一个中断,CPU在同一时刻只能响应一个中断,由于配置的原因,只有一颗cpu去响应中断(这个是可调的),所以所有的流量都压在了一个CPU上 ,把CPU跑满了。

为什么只有一颗cpu去响应中断?

这个是历史设计的问题,一开始CPU都是一核的,只能由唯一的CPU去响应,后来逐步发展出了多核的CPU,才有了可调整的参数去调整到底由几个CPU去处理。

处理方法

修改方案
1. 修改/etc/modprobe.d/modprobe.conf
在文件最后追加三行
alias eth0 igb
alias eth1 igb
options igb RSS=8,8
image001.png
2. 修改完之后就需要重启网络才能生效

只需要重新加载内核模块和重启网络服务就可以了,实际测试需要20s时间

操作命令
nohup rmmod igb && modprobe igb && /etc/init.d/network restart && /etc/rc3.d/S27route

来自:http://blog.csdn.net/fjq5a/article/details/53747444
https://my.oschina.net/matyhtf/blog/806196

生活中的事情没有啥不能通过一吨饭解决问题的,
代码世界没有啥是不能通过测试显问题或惊喜的。 ---swoole顾问向东
vim从vim7开始加入了多标签切换的功能,相当于多窗口。
之前的版本虽然也有多文件编辑功能,但是总之不如这个方便啦。
实践成功功能如下,冒号输入:
:tabr #第一个Tab标签页
:tabl #最后一个标签页面
:tabnew  #新建标签页面

#先用:tabs   列出已打开的标签列表,">"表示当前标签页
:tabm 0      移到第一个标签页
:tabm       当前标签移到最后

关闭标签页
:q       # 直如关闭标签,tabc  关闭当前标签页。
:tabo  关闭所有的标签页。
切换标签
:tabn或gt  移动到下一个标签页。
:tabp或gT  移动到上一个标签页。
:tabfirst或:tabr  移动到第一个标签页。
来自:http://liuzhijun.iteye.com/blog/1836428

:bn—下一个文件
:bp—上一个文件
:ctrl+w + 纵向扩大(行数增加)
:ctrl+w - 纵向缩小 (行数减少)
关闭多窗口
可以用:q!,也可以使用:close,最后一个窗口不能使用close关闭。使用close只是暂时关闭窗口,其内容还在缓存中,只有使用q!、w!或x才能真能退出。
关闭窗口
     q  或 close   #关闭当前窗口
     only          #保留当前窗口,关闭其它所有窗口
     qall(qa)          #退出所有窗口
     wall          #保存所有窗口
多标签页命令
:tabdo <命令>  同时在多个标签页中执行命令。比如:tabdo %s/food/drink/g 命令把当前多个标签页文件中的“food”都替换成“drink”。

用法
:tabnew [++opt选项] [+cmd] 文件            建立对指定文件新的tab
:tabc       关闭当前的tab
:tabo       关闭所有其他的tab
:tabs       查看所有打开的tab
:tabp      前一个
:tabn      后一个
标准模式下:
gt , gT 可以直接在tab之间切换。
更多可以查看帮助 :help table , help -p
使用alt+数字键来切换tab (vim7+)
不过用gt,gT来一个个切换有点不方便, 如果用:tabnext {count}, 又按键太多. 加入以下代码后, 可以用 alt+n来切换,
比如alt+1切换到第一个tab,alt+2切换到第二个tab。
把以下代码加到vimrc, 或者存为.vim文件,再放到plugin目。
function! TabPos_ActivateBuffer(num)
    let s:count = a:num
    exe "tabfirst"
    exe "tabnext" s:count
endfunction
      
function! TabPos_Initialize()  
for i in range(1, 9)
        exe "map <M-" . i . "> :call TabPos_ActivateBuffer(" . i . ")<CR>"
    endfor
    exe "map <M-0> :call TabPos_ActivateBuffer(10)<CR>"
endfunction

autocmd VimEnter * call TabPos_Initialize()
上面的看上去太复杂了,来个简单的。
:nn <M-1> 1gt
:nn <M-2> 2gt
:nn <M-3> 3gt
:nn <M-4> 4gt
:nn <M-5> 5gt
:nn <M-6> 6gt
:nn <M-7> 7gt
:nn <M-8> 8gt
:nn <M-9> 9gt
:nn <M-0> :tablast<CR>
把这个放进_vimrc配置文件里。
参考至:http://www.liurongxing.com/vim-tab-shortcut.html
现象:cmake ../
CMake Error at CMakeLists.txt:1 (cmake_minimum_required):
  CMake 3.1 or higher is required.  You are running version 2.8.12.2
-- Configuring incomplete, errors occurred!
一)编译C通过cmake:
# 如何编译和执行

本工程使用CMake来编译,CMake的好处是方便跨平台执行。关于CMake,可以访问(https://cmake.org/)。

在Linux环境下,请先创建build目录,并到目录build下,执行cmake
```bash
mkdir build && cd build
cmake ../
```

再执行
```bash
make
```

如果你的Linux中无法运行cmake或make命令,可以按照如下命令安装它
```bash
sudo apt-get install cmake g++ make
```

所有的可执行程序在目录build/bin下面


如果你有CLion或者其他可视化的IDE,可以直接在IDE中执行"Build Project"来完成整个项目的编译。


二)升级 cmake 的步骤:

卸载原有通过 yum 安装的 cmake
yum remove cmake
下载cmake安装包
cd /opt
wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.tar.gz
解压下载好的cmake二进制包
cd /opt
tar zxvf cmake-3.14.5-Linux-x86_64.tar.gz
解压成功后,就可以在 /opt 目录下看到一个 cmake-3.14.5-Linux-x86_64 目录,下面添加cmake环境变量,编辑 /etc/profile.d/cmake.sh 文件,写入以下内容:
export CMAKE_HOME=/opt/cmake-3.14.5-Linux-x86_64
export PATH=$PATH:$CMAKE_HOME/bin
保存并退出,执行命令让 cmake 环境文件生效
source /etc/profile
此时,再次查看cmake版本,就已经是 3.14.5 了:

cmake -version
cmake 版本升级完毕。

来自:https://www.jianshu.com/p/d5dd6514526a







Mysql新版本均采用了cmake:
http://mp.weixin.qq.com/s?__biz=MzI0MTEyMzgxOA==&mid=2247483751&idx=1&sn=124007f577a8d697040479942935d88a&chksm=e91129e2de66a0f4b6e385d663c927c7e0386255d29af3a7a7f2550ff84abbf5a95a457bbdc1&mpshare=1&scene=23&srcid=1214WmcU4f5K7XqqSEIfWo6l#rd
背景:像做点PHP给那个下位机,也就是现在的物联网芯片发送指令这种,用到这样的一个串,发送下去后,下位机解析后(解析到串里部分值修改后原样返回)再以串返回,自己想对串里作修改啥的用到这种url参数结构,如:framefd=4&fd=1&act=display&command=gettemp,解析在数组,同数组里的key=>value再解析成串。
parse_url
parse_str




From:http://www.cnblogs.com/freespider/p/4262244.html
背景:如果redis缓慢多是hgetall导致的当然其他的情况也有...

在没关注这个函数之前,一直用的Memcache的数据存储方式,但是自从更换了redis之后,对于一个hash的数据存与取 对于Memcache方便甚多,但是问题来了,一个hash的列表如果量不大的情况,用hGetAll函数几乎看不出问题,一旦这个列表超过50或者更多时,此时用hGetAll函数便能很直观的看到性能问题,这里就不作数据分析了。

Redis是单线程的!当它处理一个请求时其他的请求只能等着。通常请求都会很快处理完,但是当我们使用HGETALL的时候,必须遍历每个字段来获取数据,这期间消耗的CPU资源和字段数成正比,如果还用了PIPELINING,无疑更是雪上加霜。
PERFORMANCE = CPUs / OPERATIONs
也就是说,此场景下为了提升性能,要么增加运算过程中的CPU数量;要么降低运算过程中的操作数量。在为了继续使用hash结构的数据,又要解决此问题,比较方便的方法就是将hash以序列化字符串存储,取的时候先取出反序列化的数据,再用hGet(key,array(hash..))。

例如:
....
$arrKey = array('dbfba184bef630526a75f2cd073a6098','dbfba184bef630526a75f2cd0dswet98')
$strKey = 'test';
$obj->hmGet($strKey,$arrKey);
把原本的hGetAll操作简化为hGet,也就是说,不再需要遍历hash中的每一个字段,因此即便不能让多个CPU参与运算,但是却大幅降低了操作数量,所以性能的提升仍然是显著的;当然劣势也很明显,和所有的冗余方式一样,此方案浪费了大量的内存。

有人会问,这样虽然没有了遍历字段的过程,但是却增加了反序列化的过程,而反序列化的成本往往也是很高的,难道这样也能提升性能?问题的关键在于开始我们遍历字段的操作是在一个cpu上完成的,后来反序列化的操作,不管是什么语言,都可以通过多进程或多线程来保证是在多个cpu上完成的,所以性能总体上是提升的。

另外,很多人直觉是通过运行redis多实例来解决问题。确实,这样可以增加运算过程中的CPU数量,有助于提升性能,但是需要注意的是,hGetAll和PIPELINING往往会让运算过程中的操作数量呈几何级爆炸式增长,相比之下,我们能增加的redis多实例数量简直就是杯水车薪,所以本例中这种方法不能彻底解决问题。

来自:http://www.mudbest.com/redis%E7%9A%84hgetall%E5%87%BD%E6%95%B0%E7%9A%84%E6%80%A7%E8%83%BD%E9%97%AE%E9%A2%98/?utm_source=tuicool&utm_medium=referral
使用 fuser xxx 命令查看制定的文件被哪个进程占用,然后关闭该进程,则解决问题。
备注: 如果 xxx 命令是在普通用root 下开启, 而在普通用户下使用:fuser xxx 是没有结果的
切换至 root 用度,再执行 fuser xxx ,则会显示 其进程号,将其杀即可。

eg:
# ./Xfbdev :0 -fp /usr/share/fonts/X11/misc
./Xfbdev: Text file busy

$ fuser Xfbdev
$ sudo su
# fuser Xfbdev
Xfbdev: 28784e
# ps aux | grep Xfbdev
root 28784 0.9 0.2 4608 2640 pts/0 S+ 12:48 0:00 ./Xfbdev :0 -fp /usr/share/fonts/X11/misc
root 30708 0.0 0.1 3792 1248 pts/1 S+ 12:49 0:00 grep Xfbdev

Text file busy问题的解决

Author: liucy
在使用scp跨服务器拷贝文件时,出现了Text file busy的错误,导致无法完成操作,后来经过查找得知,该错误指的是文件正在被某一进程使用,处于锁定状态,所以无法拷贝。后来经过查证得知,使用fuser命令可以解决上述问题,具体执行命令如下:
fuser -cdkux filename

From:http://m.jb51.net/LINUXjishu/153057.html

pmap -p pid
背景:像做一些标识位、状态位,在早期的c语言或c++里都是通过一个位运算符来做的,这块PHP也在上面作了一些借鉴,对于爱放在数据库里和从数据库取东西的php程序,如果状态位很多,你想多个数据库表字段实现是不灵活的,哪天再来一个状态怎么办?所以,本文的思想就是用位运算达到灵活性之目的,故而转载此文。

PHP中的位运算和进制是比较冷门的知识,感觉很简单也很好理解,但是在实际场景中却很少使用,本篇博文就是简单了解基本概念以及讲解如何去实际使用.
位运算
PHP中的位运算符是对整形进行的操作,比如对于十进制,二进制,八进制等数字的一些操作.
& (按位与 AND)
| (按位或 OR)
~ (按位取反 NOT)
^ (按位异或 XOR)
<< (bitwise left shift)
>> (bitwise right shift)
下面用一个实际例子来说明如何去使用它们,比如一个博客系统最重要的元素就是文章,而文章可以有很多状态,比如状态可以是删除,评论,收藏,喜欢,当然可以根据实际情况扩展,那在数据库表中如何进行设计呢?假如通过每个字段来存储文章的状态,一方面表的可扩展性很差,另外一方面查询效率很差.
这个时候可以通过一个status字段来保存这些状态,这个字段的类型是整形,可以存储十进制,八进制,二进制,十六进制.
那么这么多状态`如何在一个字段值中表示呢,可以进行如下规定:
整数(二进制)  状态  说明
0001  删除状态  第一位等于1
0010  评论状态  第二位等于1
0100  收藏状态  第三位等于1
1000  喜欢状态  第四位等于1
面临的第一个问题,如何给文章增加状态属性?
$status = $status | 0b0001 ; //文章被置为删除状态$status = $status | 0b0010 ; //文章被置为评论状态$status = $status | 0b1100 ; //文章同时被置为收藏和喜欢状态
面临的第二个问题,如何给文章取消状态属性?
$status = $status & ~0b0001 ; //文章从删除状态恢复$status = $status & ~0b0010 ; //文章从评论状态恢复$status = $status & ~0b1100 ; //文章同时从收藏和喜欢状态恢复
面临的第三个问题,如何检查文章的状态?
$status & 0b0001?true:false ; //查询文章是否是删除状态$status & 0b0010?true:false ; //查询文章是否是评论状态$status & 0b1100?true:false ; //查询文章是否是收藏和喜欢状态
希望通过上面的例子你能明白位运算符的作用,另外位运算符和逻辑运算符比较容易让人误解.可以这样去区分和理解:
位运算符是对两个整数的bits进行操作,然后返回结果,That means it's not a yes or no thing.
假如位运算符被用在条件语句中,他们将会进行逻辑比较.
逻辑操作符是比较多个表达式,然后返回true或者false.
进制运算
上面位运算符的例子中,作为操作符数的都是二进制,但是也可以是其它进制.
PHP中支持二进制(binary),八进制(octal),十进制(decimal),十六进制(hexadecimal).
它们都是整型,进制和编码密切相关,这里仅仅说明PHP中的进制是如何表达的,以及之间是如何转换的.
如何在整型变量定义进制:
$n = 0b10000 ; //二进制$n = 16; //十进制$n = 0x10; //十六进制$n = 020;//八进制在echo输出的时候,不管是什么类型的整数,最后输出的都是十进制
定义字符串的时候如何通过进制表示:
//\[0-7]{1,3} #八进制表达方式//\x[0-9A-Fa-f]{1,2} #十六进制表达方式$str = "\20";$str = "\x10";echo输出的时候,会输出字符DLE
PHP内部函数如何支持进制转换,共有二种转换方式:
$n = 16;echo dechex($n) . "_" . decbin($n);$n = base_convert('10',16,10 ); //'10'本身的进制由第二个参数决定$nn = base_convert($n, 10,2 );echo $n . "_" . $nn ;//以上的函数返回各进制的字符串表达形式,那么如何返回这些变量代表的字符呢.echo  chr(base_convert('10',16,10 ));
sprintf如何在进制中使用:
这个函数实际上和进制没有非常耦合的关系,可以将不同进制的整型转换为不同进制的字符串表示
$n = sprintf("%x",  0b10000 );$n = sprintf("%x",  0x10 );$n = sprintf("%x",  020 );$n = sprintf("%x", 16 );$n = sprintf("%x", "a" );$n = sprintf("%s",  0b10000 );$n = sprintf("%c",  0b10000 );#返回ASCII值对应的字符

摘自:https://buluo.qq.com/p/detail.html?bid=13609&pid=5730935-1481030480&from=grp_sub_obj
让editplus迅速定位到当前编辑的文件目录,使用Tortoise SVN的时候特别有用(http://tortoisesvn.tigris.org/),效果真不是盖的

添加方法:
选择工具->配置用户工具->添加工具->程序

Command(命令): %systemroot%\explorer.exe /e,/root,
实践:%systemroot%\explorer.exe  /e,/root,
Argument(参数):    $(FileDir)
实践:$(FileDir)
动作:退出时关闭窗口

参考的文档:
http://www.ooso.net/archives/137
ping   -a   ip返回计算机名的原理?或我该怎么办才能返回这个计算机名?
------解决方案--------------------------------------------------------
有时候不能反向解析DNS,所以就找不出计算机名!纯属个人见解!
------解决方案--------------------------------------------------------
象是一个什么功能被禁止了.nbios服务禁止.不一定准确


如:ping 10.78.72.XX
ping -s 1500 -c 10 -a 10.70.39.254 10.78.72.XX

ctrl+c
[root@itv-api_php_bj_syq_10_70_62_28 /]#  ping -f xx.xx.xx.xx
PING xx.xx.xx.xx(10.78.72.163) 56(84) bytes of data.
...................................^C  (ctrl+c)
--- xx.xx.xx.xxping statistics ---
44364 packets transmitted, 44330 received, 0% packet loss, time 651113ms
rtt min/avg/max/mdev = 53.616/55.311/79.376/2.586 ms, pipe 7, ipg/ewma 14.676/54.124 ms


情况是这样的~本来是4M的线路需要增开到10M,客户测试的时候是在linux下用ping -f命令测试极限,发现带宽依旧只是4M。但采用feiQ这类局域网文件传输工具,两端的传输速度都能达到1.2MB/s以上。两端经过的是SDH传输网。 有没有大神能解释下linux ping-f这命令...

ping -f
尽可能快地发送报文

linux下 ping命令参数
表1 ping命令参数(linux)
参数
描述
-c count
在收发指定的count个数目的报文后停止
-d
在套接口设置so_debug
-f
尽可能快地发送报文
-i wait
设置连续报文发送时报文间的发送时间间隔(单位为秒)
-i ?device?
设置输出接口
-l preload
尽可能快地发送预载的报文,然后再返回到正常发送模式
-n
不查寻主机名,仅仅给出ip地址值
-p pattern
定义随同报文一起被发送的便笺内容(便笺最长为16个字节)
-q
仅输出结果的总结内容
-r
不使用路由表来发送报文,而是直接把报文发到主机
-r
设置记录路由选择功能,即记录报文传送经过的路径
-s packetsize
设置要发送的报文大小(单位为字节,最大长度是64k,缺省长度是64)
-t tsonly
发送一个带有时间戳的ping报文
-t tsandaddr
收集时间戳和地址
-t tsprespec
[host1 [host2 [host3 [host4]]]] 收集来自预定的网络段的时间戳和地址
-w timeout
指定等待每个响应的最长时间(单位是毫秒)


linux下测试ping包:
ping -q -c 100 -s 8100 10.70.7.108
[root@a ~]# ping -q -c 100 -s 8100 101.200.228.135
PING 101.200.228.135 (101.200.228.135) 8100(8128) bytes of data.

背景:在MySQL与PostgreSQL的对比中,PG的JSON格式支持优势总是不断被拿来比较。最主要是json这种东西在做一些物联网时用php结合很有用处。
========================真实实践成功如下所示AddTime:2016-12-4==================================
CREATE TABLE json_test(  
id INT,  
person_desc TEXT  
)ENGINE INNODB;  

INSERT INTO json_test VALUES (1,'
    {  
    "programmers": [{  
        "firstName": "Brett",  
        "lastName": "McLaughlin",  
        "email": "aaaa"  
    }, {  
        "firstName": "Jason",  
        "lastName": "Hunter",  
        "email": "bbbb"  
    }, {  
        "firstName": "Elliotte",  
        "lastName": "Harold",  
        "email": "cccc"  
    }],  
    "authors": [{  
        "firstName": "Isaac",  
        "lastName": "Asimov",  
        "genre": "sciencefiction"  
    }, {  
        "firstName": "Tad",  
        "lastName": "Williams",  
        "genre": "fantasy"  
    }, {  
        "firstName": "Frank",  
        "lastName": "Peretti",  
        "genre": "christianfiction"  
    }],  
    "musicians": [{  
        "firstName": "Eric",  
        "lastName": "Clapton",  
        "instrument": "guitar"  
    }, {  
        "firstName": "Sergei",  
        "lastName": "Rachmaninoff",  
        "instrument": "piano"  
    }]  
}');  

ALTER TABLE json_test MODIFY person_desc json;  



{
    "programmers":[
        {
            "firstName":"Brett",
            "lastName":"McLaughlin",
            "email":"aaaa"
        },
        {
            "firstName":"Jason",
            "lastName":"Hunter",
            "email":"bbbb"
        },
        {
            "firstName":"Elliotte",
            "lastName":"Harold",
            "email":"cccc"
        }
    ],
    "authors":[
        {
            "firstName":"Isaac",
            "lastName":"Asimov",
            "genre":"sciencefiction"
        },
        {
            "firstName":"Tad",
            "lastName":"Williams",
            "genre":"fantasy"
        },
        {
            "firstName":"Frank",
            "lastName":"Peretti",
            "genre":"christianfiction"
        }
    ],
    "musicians":[
        {
            "firstName":"Eric",
            "lastName":"Clapton",
            "instrument":"guitar"
        },
        {
            "firstName":"Sergei",
            "lastName":"Rachmaninoff",
            "instrument":"piano"
        }
    ]
}





mysql> SELECT id,json_keys(person_desc) as "keys" FROM json_test\G
*************************** 1. row ***************************
  id: 1
keys: ["authors", "musicians", "programmers"]
1 row in set (0.00 sec)


mysql>  SELECT json_extract(AUTHORS,'$.lastName[0]') AS 'name', AUTHORS FROM  
    ->     (  
    ->     SELECT id,json_extract(person_desc,'$.authors[0][0]') AS "authors" FROM json_test  
    ->     UNION ALL  
    ->     SELECT id,json_extract(person_desc,'$.authors[1][0]') AS "authors" FROM json_test  
    ->     UNION ALL  
    ->     SELECT id,json_extract(person_desc,'$.authors[2][0]') AS "authors" FROM json_test  
    ->     ) AS T1  
    ->     ORDER BY NAME DESC;
+------------+----------------------------------------------------------------------------+
| name       | AUTHORS                                                                    |
+------------+----------------------------------------------------------------------------+
| "Williams" | {"genre": "fantasy", "lastName": "Williams", "firstName": "Tad"}           |
| "Peretti"  | {"genre": "christianfiction", "lastName": "Peretti", "firstName": "Frank"} |
| "Asimov"   | {"genre": "sciencefiction", "lastName": "Asimov", "firstName": "Isaac"}    |
+------------+----------------------------------------------------------------------------+
3 rows in set (0.00 sec)



mysql> SELECT  
    -> json_extract(AUTHORS,'$.firstName[0]') AS "firstname",  
    -> json_extract(AUTHORS,'$.lastName[0]') AS "lastname",  
    -> json_extract(AUTHORS,'$.genre[0]') AS "genre"  
    -> FROM  
    -> (  
    -> SELECT id,json_extract(person_desc,'$.authors[0]') AS "authors" FROM json_test  
    -> ) AS T\G ;
*************************** 1. row ***************************
firstname: "Isaac"
lastname: "Asimov"
    genre: "sciencefiction"
1 row in set (0.00 sec)

修改的方法,注意加双引号:
mysql> update json_test set  person_desc=json_set(person_desc,"$.authors[2].firstName",'dong');
Query OK, 1 row affected (0.04 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT id,json_extract(person_desc,'$.authors[2].firstName') AS "authors" FROM json_test;
+------+---------+
| id   | authors |
+------+---------+
|    1 | "dong"  |
+------+---------+
1 row in set (0.00 sec)



自己设计一个Json串的字段:
  {  
    "deviceinfo": [{  
        "chineseName": "蛋壳孵化I型",  
        "EnglishName": "LevooAllCanBeHatch",  
        "deviceMacAdd": "00-50-56-C0-00-08"  
    }],  
    "tcpserverinfo": [{  
        "fd": "Isaac",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.1"  
    }],  
    "websocketinfo": [{  
        "fd": "1",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.1"  
    }, {  
        "fd": "21",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.2"  
    }]  
}


mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinfo[0].chineseName", '蛋壳108') where id=20;          
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0


mysql>  SELECT * FROM json_test where id=20\G;
*************************** 1. row ***************************
         id: 20
person_desc: {"deviceinfo": [{"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108", "deviceMacAdd": "00-50-56-C0-00-08"}], "tcpserverinfo": [{"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}], "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)




Json的格式更简单一些:
  {  
    "deviceinfo": {  
        "chineseName": "蛋壳孵化I型",  
        "EnglishName": "LevooAllCanBeHatch",  
        "deviceMacAdd": "00-50-56-C0-00-08"  
    },  
    "tcpserverinfo": {  
        "fd": "Isaac",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.1"  
    },  
    "websocketinfo": [{  
        "fd": "1",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.1"  
    }, {  
        "fd": "21",  
        "connTime": "2014-11-11 23:45:21",  
        "connIp": "127.0.0.2"  
    }]  
}
mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinf.chineseName", '蛋壳108') where id=30;
Query OK, 0 rows affected (0.01 sec)
Rows matched: 1  Changed: 0  Warnings: 0


=================================================================================================================
mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳孵化I型", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)

mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinfo.chineseName", '蛋壳1081') where id=30;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳1081", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)


=================================================================================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinfo.chineseName", '蛋壳108109') where id=30;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)

===================================================================================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.tcpserverinfo.fd", '蛋壳108109') where id=30;                      
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0



======================================================修改二级=====================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.websocketinfo[1].fd", '22') where id=30;                                
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "蛋壳108109", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "22", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)


=================================插入新的数组属性===================================
mysql> update `json_test` set person_desc=json_insert(person_desc, "$.websocketinfo[1].fdfd", '2222') where id=30;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "蛋壳108109", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "22", "fdfd": "2222", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}


最后想了一下,那个websocket是没有啥用的,直接简单化即可:
{
    "deviceinfo":{
        "EnglishName":"LevooAllCanBeHatch",
        "chineseName":"蛋壳108109",
        "deviceMacAdd":"00-50-56-C0-00-08"
    },
    "tcpserverinfo":{
        "fd":"蛋壳108109",
        "connIp":"127.0.0.1",
        "connTime":"2014-11-11 23:45:21"
    },
    "websocketinfo":[
        {
            "fd":"1",
            "connIp":"127.0.0.1",
            "connTime":"2014-11-11 23:45:21"
        }
    ]
}



josn类不能有如下默认值:
{
    "deviceinfo":{
        "EnglishName":"N/A",
        "chineseName":"N/A",
        "deviceMacAdd":"N/A"
    },
    "tcpserverinfo":{
        "fd":"N/A",
        "connIp":"N/A",
        "connTime":"N/A"
    },
    "websocketinfo":[
        {
            "fd":"N/A",
            "connIp":"N/A",
            "connTime":"N/A"
        }
    ]
}



php json.php
{
    "deviceinfo":{
        "EnglishName":"N/A",
        "chineseName":"N/A",
        "deviceMacAdd":"N/A"
    },
    "tcpserverinfo":{
        "fd":"N/A",
        "connIp":"N/A",
        "connTime":"N/A"
    },
    "websocketinfo":[
        {
            "fd":"N/A",
            "connIp":"N/A",
            "connTime":"N/A"
        }
    ]
}Array
(
    [deviceinfo] => Array
        (
            [EnglishName] => N/A
            [chineseName] => N/A
            [deviceMacAdd] => N/A
        )

    [tcpserverinfo] => Array
        (
            [fd] => N/A
            [connIp] => N/A
            [connTime] => N/A
        )

    [websocketinfo] => Array
        (
            [0] => Array
                (
                    [fd] => N/A
                    [connIp] => N/A
                    [connTime] => N/A
                )

        )

)



mysql> select json_extract(data,'$.tcpserverinfo.fd') as fd from hatch_dev_temp where hatchdevid=1;
+----------------+
| fd             |
+----------------+
| "蛋壳108109"   |
+----------------+
1 row in set (0.00 sec)


=============================================================================================
mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳孵化I型", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)

mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinfo.chineseName", '蛋壳1081') where id=30;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳1081", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)


=============================================================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.deviceinfo.chineseName", '蛋壳108109') where id=30;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "Isaac", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "21", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)

===================================================================================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.tcpserverinfo.fd", '蛋壳108109') where id=30;                      
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0



======================================================修改二级=====================================================
mysql> update `json_test` set person_desc=json_set(person_desc, "$.websocketinfo[1].fd", '22') where id=30;                                
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "蛋壳108109", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "22", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}
1 row in set (0.00 sec)


=================================插入新的数组属性===================================
mysql> update `json_test` set person_desc=json_insert(person_desc, "$.websocketinfo[1].fdfd", '2222') where id=30;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM json_test where id=30\G;
*************************** 1. row ***************************
         id: 30
person_desc: {"deviceinfo": {"EnglishName": "LevooAllCanBeHatch", "chineseName": "蛋壳108109", "deviceMacAdd": "00-50-56-C0-00-08"}, "tcpserverinfo": {"fd": "蛋壳108109", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, "websocketinfo": [{"fd": "1", "connIp": "127.0.0.1", "connTime": "2014-11-11 23:45:21"}, {"fd": "22", "fdfd": "2222", "connIp": "127.0.0.2", "connTime": "2014-11-11 23:45:21"}]}


最后想了一下,那个websocket是没有啥用的,直接简单化即可:
{
    "deviceinfo":{
        "EnglishName":"LevooAllCanBeHatch",
        "chineseName":"蛋壳108109",
        "deviceMacAdd":"00-50-56-C0-00-08"
    },
    "tcpserverinfo":{
        "fd":"蛋壳108109",
        "connIp":"127.0.0.1",
        "connTime":"2014-11-11 23:45:21"
    },
    "websocketinfo":[
        {
            "fd":"1",
            "connIp":"127.0.0.1",
            "connTime":"2014-11-11 23:45:21"
        }
    ]
}



josn类不能有如下默认值:
{
    "deviceinfo":{
        "EnglishName":"N/A",
        "chineseName":"N/A",
        "deviceMacAdd":"N/A"
    },
    "tcpserverinfo":{
        "fd":"N/A",
        "connIp":"N/A",
        "connTime":"N/A"
    },
    "websocketinfo":[
        {
            "fd":"N/A",
            "connIp":"N/A",
            "connTime":"N/A"
        }
    ]
}

修改tcpserver里的fd的句柄及查询该句柄的值:
mysql> update hatch_dev_temp set data=json_set(data, "$.tcpserverinfo.fd", '108') where hatchdevid=1;                                
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select json_extract(data,'$.tcpserverinfo.fd') as fd from hatch_dev_temp where hatchdevid=1;    
+-------+
| fd    |
+-------+
| "108" |
+-------+
1 row in set (0.00 sec)

mysql> update hatch_dev_temp set data=json_set(data,"$.tcpserverinfo.fd",22) where hatchdevid=1;    
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>  select json_extract(data,'$.tcpserverinfo.fd') as fd from hatch_dev_temp where hatchdevid=1;  
+------+
| fd   |
+------+
| 22   |
+------+
1 row in set (0.00 sec)


EOF
========================================================================================


修改json数据:
JSON_SET(json_doc, path, val[, path, val] ...)
修改数据

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

结果js={"a":456,"s":"abc","b":"bbb"}

path中$就代表整个doc,然后可以用javascript的方式指定对象属性或者数组下标等.
执行效果,类似json的语法
$.a=456
$.b="bbb"

存在就修改,不存在就设置.

$.c.c=123
这个在javascript中会出错,因为.c为null。
但是在json_set('{}','$.c.c',123)中,不存在的路径将直接被忽略。
来自:http://blog.5ibc.net/p/36344.html
http://jackyrong.iteye.com/blog/2282003
多唯json数组的修改处理方法:
http://blog.csdn.net/yueliangdao0608/article/details/49760213


MySQL 5.7.7 labs版本开始InnoDB存储引擎已经原生支持JSON格式,该格式不是简单的BLOB类似的替换。原生的JSON格式支持有以下的优势:
JSON数据有效性检查:BLOB类型无法在数据库层做这样的约束性检查
查询性能的提升:查询不需要遍历所有字符串才能找到数据
支持索引:通过虚拟列的功能可以对JSON中的部分数据进行索引


来自:http://database.51cto.com/art/201504/472302.htm


-------------------------------------------------------------------------------------------------------------------------
MySQL 5.7原生JSON格式支持:


可以看到我们新建了表user,并且将列data定义为了JSON类型。这意味着我们可以对插入的数据做JSON格式检查,确保其符合JSON格式的约束,如插入一条不合法的JSON数据会报如下错误:
mysql> insert into user values (NULL,"test");
ERROR 3130 (22032): Invalid JSON text: "Invalid value" at position 2 in value (or column) 'test'.
此外,正如前面所说的,MySQL 5.7提供了一系列函数来高效地处理JSON字符,而不是需要遍历所有字符来查找,这不得不说是对MariaDB dynamic column的巨大改进:

当然,最令人的激动的功能应该是MySQL 5.7的虚拟列功能,通过传统的B+树索引即可实现对JSON格式部分属性的快速查询。使用方法是首先创建该虚拟列,然后在该虚拟列上创建索引:

然后可以通过添加的索引对用户名进行快速的查询,这和普通类型的列查询一样。而通过explain可以验证优化器已经选择了在虚拟列上创建的新索引:
mysql> explain select * from user where user_name='"Amy"'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: ref
possible_keys: idx_username
          key: idx_username
      key_len: 131
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
可以发现MySQL 5.7对于JSON格式堪称完美

摘自:http://www.innomysql.net/article/15319.html



修改json地址:
mysql> set @json='["apple", {"attr": [50, true], "name": "orange"}]';
Query OK, 0 rows affected (0.00 sec)

mysql> select json_insert(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+-----------------------------------------------------------+
| json_insert(@json, '$[1].attr[0]', 2, '$[2]', "pear")     |
+-----------------------------------------------------------+
| ["apple", {"attr": [50, true], "name": "orange"}, "pear"] |
+-----------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select json_replace(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+--------------------------------------------------------+
| json_replace(@json, '$[1].attr[0]', 2, '$[2]', "pear") |
+--------------------------------------------------------+
| ["apple", {"attr": [2, true], "name": "orange"}]       |
+--------------------------------------------------------+
1 row in set (0.00 sec)

mysql>  select json_set(@json, '$[1].attr[0]', 2, '$[2]', "pear");
+----------------------------------------------------------+
| json_set(@json, '$[1].attr[0]', 2, '$[2]', "pear")       |
+----------------------------------------------------------+
| ["apple", {"attr": [2, true], "name": "orange"}, "pear"] |
+----------------------------------------------------------+
1 row in set (0.01 sec)

mysql> select json_remove(@json, '$[1].attr[0]', '$[2]');
+-----------------------------------------------+
| json_remove(@json, '$[1].attr[0]', '$[2]')    |
+-----------------------------------------------+
| ["apple", {"attr": [true], "name": "orange"}] |
+-----------------------------------------------+
1 row in set (0.00 sec)
您查询的IP:121.35.46.0
本站数据:广东省深圳市 电信
参考数据1:广东深圳 电信
参考数据2:广东省深圳市 电信
download
C:\Users\admin>ping 121.35.46.0 -t

正在 Ping 121.35.46.0 具有 32 字节的数据:
来自 121.35.46.0 的回复: 字节=32 时间=60ms TTL=52
来自 121.35.46.0 的回复: 字节=32 时间=58ms TTL=52
来自 121.35.46.0 的回复: 字节=32 时间=58ms TTL=52
来自 121.35.46.0 的回复: 字节=32 时间=59ms TTL=52

Linux:
ping 10.78.72.90
ping -s 1500 -c 10 -a 10.70.39.254 10.78.72.90

10 packet(s) transmitted
10 packet(s) received
0.00% packet loss
round-trip min/avg/max = 111/111/113 ms

根据1秒=1000毫秒,也就是说111ms = 0.111s/一个包,那么10个1秒,60秒一分钟也就是10X60=600个包左右。
(应用工程师反映:循环写队列每秒仅12条,刚好相符合,得到验证。)
如何定义网络延迟程度:
  (网络延迟PING值越低速度越快)
  1~30ms:极快,几乎察觉不出有延迟,玩任何游戏速度都特别顺畅
  31~50ms:良好,可以正常游戏,没有明显的延迟情况
  51~100ms:普通,对抗类游戏能感觉出明显延迟,稍有停顿
  >100ms:差,无法正常游戏,有卡顿,丢包并掉线现象
  计算方法:1秒=1000毫秒(例:30ms为0.03秒)

摘自:http://www.jb51.net/network/61196.html
摘自华仔的黑夜路人 2016-11-16 黑夜路人 黑夜路人技术
1.今天这个话题我推荐个电子书, 嗯嗯, MySQL 官方的   mysql internals manual   另外就是姜神两本书, 结合起来看我觉得最好   毕竟姜神只是将了实现原理, 具体如何看源码却没有讲    --我不叫大脸猫

2.看 MYSQL得先看懂C++吧  --阿杜

3.InnoDB引擎是以C为主开发的 --我不叫大脸猫

4.看看redis的源码还行,压力不大,mysql的太难了,下不了爪    --孔乙己

5.对于普通人来讲,读mysql源码性价比略低,redis、nginx、php都可以先试读一下  --liyang

6.mysql 源码在lnmp架构中最难了,可以先从php 源码入手,然后redis   --taxuewuhen

7.先把mysql 内核原理看一遍,然后分模块分析源码  --秋天

8.可以从innodb读起  MySQL其实不是难度太大,就是比较杂,乱七八糟的很多  --廖强

9.innodb 技术含量蛮高的。  读明白了,大部分数据库、存储的问题都理解了。  --黑夜路人

10.最好一个功能点,比如主从同步等,通过gdb定位来阅读会好很多,其实也不复杂  --廖强

11.强哥用gdb -p还是用别的gdb方式阅读?  --周志

12.不是用gdb阅读,是用gdb找到对应代码处理的地方,针对性的看,可以忽略很多无关的东西  --廖强

13.一般用gdb我都找不到自己想要找的对应代码的位置,我就用gdb -p的,强哥一般用啥?  --周志

14.你别-p啊  自己重新编译,编译参数加上-g  --廖强

15.比如我看redis源码,直接gdb redis-cli   --周志

16.类似啊,直接启跟attach到进城上去差不多,但是必须加上-g参数编译  如果一开始就不知道入口在哪里,可以先info files,找到Entry point的地址,再b *地址,就可以看到入口文件了  --廖强

17.找到了,也给redis-cli添加了断点  想调试下这个函数sdssplitargs,我该怎么找到它呢  --周志

18.直接b函数名  --廖强



【链接】
MySQL · 源码分析 · 网络通信模块浅析
http://mp.weixin.qq.com/s?__biz=MzAwNjQwNzU2NQ==&mid=2650342817&idx=1&sn=bda66b2940d7fe20dfa881a1dd8b55ed&mpshare=1&scene=1&srcid=1115GFLqgSWVdbSTDVYWntAf#rd

淘宝Buy+负责人胡晓航谈干货:我们碰到了哪些“坑”?
http://media.weibo.cn/article?featurecode=20000180&from=timeline&id=2309404041700417887341&jumpfrom=weibocom&lfid=4015325827391301&luicode=10000370&oid=3678257112902716&sourceType=weixin

服务容错模式
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745508&idx=2&sn=73f76b6462f521374fb548c21386467e&chksm=bd12b5a98a653cbf829ea3558e3a7f1d90d7986717b439b9a6bfe9ec011861bd62a4fa103dd2&mpshare=1&scene=1&srcid=1114PCSc5RrYgRDtIImUYoKJ#rd

Hystrix 使用与分析
http://m.blog.csdn.net/article/details?id=50000511

又一个升级到PHP 7后性能提升50%的案例:Tumblr
http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=2653547882&idx=1&sn=12512269ddb4743c6c7978277643d28b&chksm=813a7cf2b64df5e406ad8ebee973da19d330b3785a134af577883e5f725fa28884d070ed9cf7&mpshare=1&scene=1&srcid=1115vhT3jmCZQ5qd7jtLKtf6#wechat_redirect

【揭秘】腾讯大数据98.8秒完成100TB数据排序的架构和算法
http://mp.weixin.qq.com/s?__biz=MzA3MDQ4MzQzMg==&mid=2665690467&idx=1&sn=9c7c37541ea9a0f6f6709133ac569888&chksm=842bb9e4b35c30f20d2f83070536e411f00c7b8e125f13db1c8f9081b3006ffa84f15cc7dcf1&mpshare=1&scene=1&srcid=11159tGabp6p0vqT5lXdZye4#rd
win8.1出现 called runscript when not marked in progress

1.打开任务管理器-详细信息-结束图片中选择的进程
exporer --》windows资源管理器。


2.然后在任务管理器左上角“文件“=>运行新任务:
要在资源管理器里运行,否则如果点win+R是没有以管理员权限创建此任务的勾选项的。


输入C:\\Windows\explorer.exe,并勾选”以系统管理权限创建此任务“,点击确定:

3.这样就可以继续安装了。



来自:http://www.cnblogs.com/mumuhuozaimengli/p/3984203.html
Swoole之多端口及多端口复合协议侦听:
https://www.zybuluo.com/Lancelot2014/note/560093
https://www.zybuluo.com/Lancelot2014/note/560299


固定包头协议,EOF协议:
https://www.zybuluo.com/Lancelot2014/note/418670

https://www.zybuluo.com/Lancelot2014/note/555800
https://www.zybuluo.com/Lancelot2014/note/556018
分页: 35/339 第一页 上页 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 下页 最后页 [ 显示模式: 摘要 | 列表 ]