June 14, 2018
时间复杂度:O(1)、O(n)、O(n²)、O(nlogn)等
"\u003cp\u003e\u003ca href=\"https://blog.csdn.net/qq_27093465/article/details/70690749\"\u003ehttps://blog.csdn.net/qq_27093465/article/details/70690749\u003c/a\u003e\u003c/p\u003e"
June 13, 2018
分布式事务XA解决方案之两阶段提交(2PC)
"\u003cp\u003e对于三阶段提交请参考:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/binyue/p/3678390.html\"\u003ehttps://www.cnblogs.com/binyue/p/3678390.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.cnblogs.com/charlesblc/p/6289348.html\"\u003ehttps://www.cnblogs.com/charlesblc/p/6289348.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在 \u003ca href=\"https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C\" title=\"计算机网络\"\u003e计算机网络\u003c/a\u003e 以及 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93\" title=\"数据库\"\u003e数据库\u003c/a\u003e 领域内, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英语:Two-phase Commit)是指,为了使基于 \u003ca href=\"https://zh.wikipedia.org/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F\" title=\"分布式系统\"\u003e分布式系统\u003c/a\u003e 架构下的所有节点在进行 \u003ca href=\"https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1\" title=\"数据库事务\"\u003e事务\u003c/a\u003e 提交时保持一致性而设计的一种 \u003ca href=\"https://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95\" title=\"算法\"\u003e算法\u003c/a\u003e(Algorithm)。通常, \u003cstrong\u003e二阶段提交\u003c/strong\u003e 也被称为是一种 \u003cstrong\u003e协议\u003c/strong\u003e(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 \u003ca href=\"https://zh.wikipedia.org/wiki/ACID\" title=\"ACID\"\u003eACID\u003c/a\u003e 特性,需要引入一个作为 \u003cstrong\u003e协调者\u003c/strong\u003e 的组件来统一掌控所有节点(称作 \u003cstrong\u003e参与者\u003c/strong\u003e)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为: \u003cstrong\u003e参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e需要注意的是, \u003cstrong\u003e二阶段提交\u003c/strong\u003e(英文缩写: \u003cstrong\u003e2PC\u003c/strong\u003e)不 …\u003c/p\u003e"
June 12, 2018
了解MySQL中的字符集
"\u003cp\u003e\u003ca href=\"https://dev.mysql.com/doc/refman/5.7/en/charset.html\"\u003ehttps://dev.mysql.com/doc/refman/5.7/en/charset.html\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e平时我们只说了字符集这个概念,另外还有对应的“\u003cstrong\u003e字符序\u003c/strong\u003e”。一个字符集(如utf8)对应多个字符序(utf8_general_ci、utf8_german2_ci等),每个\u003cstrong\u003e字符集\u003c/strong\u003e都有一个默认“\u003cstrong\u003e字符序\u003c/strong\u003e”。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e什么是字符集、字符序?简单的来说:\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e字符集(character set):定义了字符以及字符的存储编码。\u003c/li\u003e\n\u003cli\u003e字符序(collation):定义了字符的比较规则。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e可以通过命令查看字符集、字符序信息:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eSHOW CHARACTER SET;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在我们开发中,一般要保持服务器端的字符集与客户端的字符集保持一致,不然容易出现乱码的情况。\u003c/p\u003e\n\u003cp\u003eMySQL提供了不同级别的设置,包括\u003cstrong\u003eserver\u003c/strong\u003e级、\u003cstrong\u003edatabase\u003c/strong\u003e级、\u003cstrong\u003etable\u003c/strong\u003e级、\u003cstrong\u003ecolumn\u003c/strong\u003e级,可以提供非常精准的设置。\u003c/p\u003e\n\u003cp\u003e参考文章: \u003ca href=\"https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html\"\u003ehttps://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html\u003c/a\u003e\u003c/p\u003e"
June 11, 2018
Linux下对进程通信管理的信号机制概述
"\u003cp\u003e今天看到了篇使用golang实现的系统无感重启的文章, \u003ca href=\"https://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\"\u003ehttps://gravitational.com/blog/golang-ssh-bastion-graceful-restarts/\u003c/a\u003e,一般用来平滑处理一些系统服务,避免先停止再启用导致的服务不可用的情况。其中用到了信号机制,这里找了一些文章主要有来介绍这方面的文章,以便加深理解。 \u003ca href=\"https://blog.csdn.net/junyucsdn/article/details/50519248\"\u003ehttps://blog.csdn.net/junyucsdn/article/details/50519248\u003c/a\u003e \u003ca href=\"https://blog.csdn.net/tiany524/article/details/17048069\"\u003ehttps://blog.csdn.net/tiany524/article/details/17048069\u003c/a\u003e \u003ca href=\"https://my.oschina.net/chenliang165/blog/125825\"\u003ehttps://my.oschina.net/chenliang165/blog/125825\u003c/a\u003e\u003c/p\u003e"
June 7, 2018
MySQL中的sql_mode模式
"\u003cp\u003e官方文档: \u003ca href=\"https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\"\u003ehttps://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-setting\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e一、模式分类\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e在MySQL8.0中主要包括以下几种模式\u003c/p\u003e\n\u003ctable\u003e\n \u003cthead\u003e\n \u003ctr\u003e\n \u003cth\u003e\u003cstrong\u003eONLY_FULL_GROUP_BY\u003c/strong\u003e\u003c/th\u003e\n \u003cth\u003e对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么将认为这个SQL是不合法的,因为列不在GROUP BY从句中\u003c/th\u003e\n \u003c/tr\u003e\n \u003c/thead\u003e\n \u003ctbody\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eSTRICT_TRANS_TABLES\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_IN_DATE\u003c/strong\u003e\u003c/td\u003e\n \u003ctd\u003e在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。\u003c/td\u003e\n \u003c/tr\u003e\n \u003ctr\u003e\n \u003ctd\u003e\u003cstrong\u003eNO_ZERO_DATE …\u003c/strong\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e"
June 7, 2018
了解MySQL中的驱动表
"\u003cp\u003e\u003cstrong\u003e一、为什么要用小表驱动大表\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1、驱动表的定义\u003c/p\u003e\n\u003cp\u003e当进行多表连接查询时, [驱动表] 的定义为:\u003c/p\u003e\n\u003cp\u003e1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表]\u003c/p\u003e\n\u003cp\u003e2)未指定联接条件时,行数少的表为[驱动表](重要)\u003c/p\u003e\n\u003cp\u003e忠告:如果你搞不清楚该让谁做驱动表、谁 join 谁,请让 MySQL 运行时自行判断\u003c/p\u003e\n\u003cp\u003e既然“未指定联接条件时,行数少的表为[驱动表]”了,而且你也对自己写出的复杂的 Nested Loop Join 不太有把握(如下面的实例所示),就别指定谁 left/right join 谁了,请交给 MySQL优化器 运行时决定吧。\u003c/p\u003e\n\u003cp\u003e2、mysql关联查询的概念:\u003c/p\u003e\n\u003cp\u003eMySQL 表关联的算法是 \u003ca href=\"http://lizhen3708693.iteye.com/blog/1631406\"\u003eNest Loop Join(嵌套循环)\u003c/a\u003e,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。\u003c/p\u003e\n\u003cp\u003e例: user表10000条数据,class表20条数据\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSELECT * FROM user u LEFT JOIN class c u.userid=c.userid\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e这样则需要用user表循环10000次才能查询出来,而如果 …\u003c/p\u003e"
April 26, 2018
U盘安装Centos7.4
"\u003cp\u003e启动盘制作教程: \u003ca href=\"https://www.cnblogs.com/yeeo1/p/7306611.html\"\u003ehttps://www.cnblogs.com/yeeo1/p/7306611.html\u003c/a\u003e \u003ca href=\"http://blog.51cto.com/mifan6/2070118\"\u003ehttp://blog.51cto.com/mifan6/2070118\u003c/a\u003e\u003c/p\u003e"
April 20, 2018
使用docker-compose 快速创建一个mysql 数据库容器
"\u003cp\u003e\u003cstrong\u003e//创建一个独立的容器目录\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir docker-db\ncd docker-db\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003e前提、创建 docker Compose 配置文件\u003c/strong\u003e\n#vi docker-compose.yml 文件,内容如下\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eversion: \u0026#39;3.6\u0026#39;\nservices:\n\n db:\n image: hub.c.163.com/library/mysql:5.7\n restart: always\n environment:\n MYSQL_ROOT_PASSWORD: 123456\n MYSQL_DATABASE: wordpress\n MYSQL_USER: root\n MYSQL_PASSWORD: 123456\n MYSQL_ALLOW_EMPTY_PASSWORD: \u0026#34;yes\u0026#34;\n ports:\n - \u0026#34;33061:3306\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eimage也可以直接写mysql:5.7 …\u003c/p\u003e"
March 29, 2018
MySQL InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析
"\u003cp\u003eInnoDB是一个支持行锁的存储引擎,锁的类型有:共享锁(S)、排他锁(X)、意向共享(IS)、意向排他(IX)。为了提供更好的并发,InnoDB提供了非锁定读:不需要等待访问行上的锁释放,读取行的一个快照。该方法是通过InnoDB的一个特性:MVCC来实现的。\u003c/p\u003e\n\u003ch1 id=\"innodb有三种行锁的算法\"\u003e\u003cstrong\u003eInnoDB有三种行锁的算法\u003c/strong\u003e\u003c/h1\u003e\n\u003cp\u003e1,Record Lock:单个行记录上的锁。\u003c/p\u003e\n\u003cp\u003e2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。\u003c/p\u003e\n\u003cp\u003e3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e锁的是索引,并不是记录。\u003c/strong\u003e\n记录锁(Record Lock): 单个索引行记录上的锁\n间隙锁(Gap Lock):一般是针对非唯一索引而言的.\n后码锁(Next-Key Lock):记录锁和间隙锁的结合,对于InnoDB中,更新\u003cstrong\u003e非唯一索引\u003c/strong\u003e对应的记录,会加上Next-Key Lock。在RR下如果where未使用索引会使用全表扫描,这个时候会有Next-Key Lock。如果更新记录为空,就不能加记 …\u003c/p\u003e"
March 29, 2018
聚簇索引概念(Myisam与Innodb索引的区别)转推荐
"\u003cp\u003emyisam的主索引和次索引都指向物理行,下面来进行讲解\u003c/p\u003e\n\u003cp\u003einnodb的主键下存储该行的数据,此索引指向对主键的引用\u003c/p\u003e\n\u003cp\u003emyisam的索引存储图如下,可以看出,无论是id还是cat_id,\u003cstrong\u003e下面都存储有存储物理地址的值。通过主键索引或者次索引来查询数据的时候,都是先查找到\u001b数据地址,然后再到物理位置上去寻找数据\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/myisam-index-struct.png\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003einnodb的索引存储图如下,我们会发现,\u003cstrong\u003e主键索引下面直接存储有数据,而次索引下,存储的是主键的id(不同于MyISAM,存储的是内容数据的物理地址)\u003c/strong\u003e。通过主键查找数据的时候,就会很快查找到数据,但是通过次索引查找数据的时候,需要先查找到对应的主键id,然后才能查找到对应的数据。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/innodb-index-struct.png\" alt=\"\"\u003e][2]\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\nInnoDB的主索引文件上 直接存放该行数据,称为聚簇索引,次索引指向对\u003cstrong\u003e主键的引用\u003c/strong\u003e.\nMyisam中, 主索引和次索引,都指向物理行(\u003cstrong\u003e磁盘位置\u003c/strong\u003e).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e注意:对InnoDB来说,\u003c/strong\u003e\n1: 主键索引 既存储索引值,又在叶子中存储行的数据\n2: 如果没有主键, 则会Unique key做主键\n3: 如果没有unique,则系统生成一个内部的rowid做主键.\n4: \u003cstrong\u003e像innodb …\u003c/strong\u003e\u003c/p\u003e"
March 27, 2018
IE浏览器报Promise错误的解决办法
"\u003cp\u003e说明ie浏览器不支持Promise,可搜索关键字 polyfill,引入以下库即可\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://cdn.polyfill.io/v2/polyfill.min.js?features=es6\"\u003ehttps://cdn.polyfill.io/v2/polyfill.min.js?features=es6\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e官方文档: \u003ca href=\"https://cdn.polyfill.io/v2/docs/\"\u003ehttps://cdn.polyfill.io/v2/docs/\u003c/a\u003e\n参考: \u003ca href=\"https://www.cnblogs.com/XHappyness/p/7919610.html\"\u003ehttps://www.cnblogs.com/XHappyness/p/7919610.html\u003c/a\u003e\n参考: \u003ca href=\"https://www.jianshu.com/p/2888a8e204e8\"\u003ehttps://www.jianshu.com/p/2888a8e204e8\u003c/a\u003e\u003c/p\u003e"
March 12, 2018
linux下git版本过底引起的无法git clone的解决方案
"\u003cp\u003e刚安装的新系统,git版本为1.8.3,使用git clone命令的时候,提示“… Peer reports incompatible or unsupported protocol version”\u003c/p\u003e\n\u003cp\u003e只需要升级一下基本包即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo yum update nss curl \u003cspan style=\"color:#75715e\"\u003e# nss为名称解析和认证服务 curl为网络请求库\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
March 8, 2018
Go中slice作为参数传递的一些“坑”
"\u003cp\u003e看明白了这篇文章,下面的例子基本也就明白了\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epackage main\n\nimport \u0026#34;fmt\u0026#34;\n\nfunc main() {\n\ta := []int{1,2,3}\n\tabc(a)\n\tfmt.Println(a)\n}\nfunc abc(a []int) {\n\ta[0] = 2 //修改后还是原来的a\n\ta = append(a, 4) // 此a非原a,使用append导致了重新分配内存地址(存储空间不足,系统自动分配一块新的足够大的内存地址,此时a的物理内存地址已经发行了变化,并将原来a的值copy一份到新的内存地址,所以这里修改的只是新内存地址的值,原来内存地址的值并没有改变),试着删除这行运行一次再看结果\n\tfmt.Println(a)\n\n\ta[0] = 7 // 新a,因为上面执行了append\n\tfmt.Println(a)\n\n\tfmt.Printf(\u0026#34;\\n===\\n\u0026#34;)\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e解释:\n[\u003cimg src=\"https://blog--static.oss-cn-shanghai.aliyuncs.com//uploads/2023/09/golang_slice_append.png\" alt=\"\"\u003e][1]\u003c/p\u003e"
March 3, 2018
golang中string rune byte 三者的关系
"\u003cp\u003e\u003ccode\u003eGo\u003c/code\u003e 语言中 \u003ccode\u003ebyte\u003c/code\u003e 和 \u003ccode\u003erune\u003c/code\u003e 实质上就是 \u003ccode\u003euint8\u003c/code\u003e 和 \u003ccode\u003eint32\u003c/code\u003e 类型。 \u003ccode\u003ebyte\u003c/code\u003e 用来强调数据是 \u003ccode\u003eraw data\u003c/code\u003e,而不是数字;而 \u003ccode\u003erune\u003c/code\u003e 用来表示 \u003ccode\u003eUnicode\u003c/code\u003e 的 \u003ccode\u003ecode point\u003c/code\u003e。参考 \u003ca href=\"https://golang.org/ref/spec#Numeric_types\"\u003e规范.\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e在Golang中 string 底层是用byte字节数组存储的,并且是不可以修改的。\u003c/p\u003e\n\u003ch1 class=\"postTitle.wp-block-heading\" id=\"go语言中的byte和rune区别对比\"\u003eGo语言中的byte和rune区别、对比\u003c/h1\u003e\n\u003cp\u003e例如\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003es:=\u0026#34;Go编程\u0026#34;\nfmt.Println(len(s)) //输出结果应该是8因为中文字符是用3个字节存的(2+3*2=8)。\nfmt.Printf(\u0026#34;%d\u0026#34;, len(string(rune(\u0026#39;编\u0026#39;)))) //经测试一个汉字确实占用3个字节,所以结果是3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e如果想要获得字符个数的话,需要先转换为rune切片再使用内置的len函数\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efmt.Println(len([]rune(s))) // 结果就是4了。\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e所以用string存储unicode的话,如果有中文,按下标是访问不到的,因为你只能得到一个byte。 要想访问中文的话,还是要用rune切片,这样就能按下表访问。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e总结:\u003c/strong\u003e\n\u003ccode\u003erune …\u003c/code\u003e\u003c/p\u003e"
February 21, 2018
解决mac下brew link python3出错brew Error: Permission denied @ dir_s_mkdir – /usr/local/Frameworks
"\u003cp\u003emac上默认的python版本为2.7.10版本,需要升级到python3 版本,通过brew升级\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$brew install python3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e提示错误\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e$ brew install python3 Warning: python3 3.6.3is already installed, it‘s just not linked. You can use \u003ccode\u003ebrew link python3\u003c/code\u003e to link this version. $ brew link python3 Linking /usr/local/Cellar/python3/3.6.3… Error: Permission denied @ dir_s_mkdir\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e发现\u003ccode\u003e/usr/local/\u003c/code\u003e下没有路径\u003ccode\u003e/usr/local/Frameworks\u003c/code\u003e\n需要新建该路径,并修改权限\u003c/p\u003e\n\u003cp\u003e解决:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ sudo mkdir /usr/local/Frameworks\n$ sudo chown $(whoami):admin /usr/local/Frameworks\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e成功:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ brew link python3\nLinking …\u003c/code\u003e\u003c/pre\u003e"