September 24, 2018
Git中的git reset的三种参数的区别
"我们平时在使用git的时候,经常会遇到需要撤销上次操作的需求,这时候需要用到git reset的这个命令,他的使用就是 “git-reset – Reset current HEAD to the specified state”, 注意这里主要操作的就是这个 HEAD。\n为了方便我们先了解一下 Git 的工作流程\n相信大家对这个图已经很熟悉了,其中index也叫stage暂存区或者暂存索引区。git reset 共有三个互斥参数分别为”–soft”、”–mixed(默认参数)” 和 “–hard”,每种参数表示一种恢复模式,下面我们将分别看一下这git reset 三个参数的用法区别。\n前提条件 我们仓库中的Git 提交顺序为 “A(a.txt) -\u0026gt; B(b.txt) -\u0026gt; C(c.txt)“,当前分支为master。 当前 HEAD 指向C,即 a47072e9f97eac4ac02c0abac82b26a9719663fc (HEAD -\u0026gt; master),我们以恢复到B(aad0c91e7b1d3577)点为准。\ntest1 git:(master) git …"
September 18, 2018
MySQL中对MVCC的理解总结
"一、MVCC简介 MVCC (Multiversion Concurrency Control),即多版本并发控制技术。InnoDB数据库的事务隔离级别就是通过UNDO和MVCC来实现的(ACID特性),旧数据存储在UNDO中,再通过DB_ROLL_PTR 回溯查找历史版本。\n二、MVCC原理 1、通过DB_ROLL_PT 回溯查找数据历史版本2、通过read view判断行记录是否可见\n理解这一块之前,我们必须先了解一下row的内部存储格式\n字段\u0008说明:\nDB_ROW_ID:长度6个字节。此值由InnoDB自动生成,聚集索引时使用。如果用户未显式指定表主键时,\u001b表优先使用第一个非null的唯一索引作为主键.否则使用DB_ROW_ID的值作为主键ID,聚集索引会使用此值。如果指定了表主键的话,则聚集索引使用指定的值。 DB_TRX_ID:6个字节的事务ID。标记了最后更新此记录的事务ID,每开起一个新事务,其值自动+1 DB_ROLL_PTR:7字节的回滚指针。指向当前记录项的undo log记录,找之前版本的数据需通过此指针。 MySQL中的MVCC原理\n首次 insert 记录 …"
September 12, 2018
MySQL之ICP、MRR、BKA、BNL
"Index Condition Pushdown(ICP) Index Condition Pushdown (ICP)是mysql使用索引从表中检索行数据的一种优化方式。\nICP原理 禁用ICP,存储引擎会通过遍历索引定位基表中的行,然后返回给MySQL Server层,再去为这些数据行进行WHERE后的条件的过滤。\n开启ICP,如果部分WHERE条件能使用索引中的字段,MySQL Server 会把这部分下推到存储引擎层,存储引擎通过索引过滤,把满足的行从表中读取出。ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数。\nICP的目标是减少从基表中全纪录读取操作的数量,从而降低IO操作\n对于InnoDB表,ICP只适用于辅助索引。\nICP标识 当使用ICP优化时,执行计划的Extra列显示 Using index condition提示\n相关参数 optimizer_switch=\u0026#34;index_condition_pushdown=on”; 可以通过 SET optimizer_switch = …"
September 4, 2018
IO多路复用机制详解(转)
"服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:\n(1)同步阻塞IO(Blocking IO):即传统的IO模型。\n(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。\n(3)IO多路复用(IO Multiplexing):即经典的 反应器Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。高性能并发服务程序使用IO多路复用模型+多线程任务处理的架构。\n(4)异步IO(Asynchronous IO):即经典的 Proactor设计模式,也称为异步非阻塞IO。不经常用。\n高性能I/O设计模式Reactor和Proactor: https://blog.csdn.net/xiongping_/article/details/45152333\nselect、poll、epoll之间的区别(搜狗面试)\n转自: …"
August 28, 2018
[译]Go里面的unsafe包详解
"unsafe包位置: src/unsafe/unsafe.go\n指针类型: ***类型:**普通指针,用于传递对象地址,不能进行指针运算。 **unsafe.Pointer:**通用指针,用于转换不同类型的指针,不能进行指针运算。 **uintptr:**用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象。uintptr 类型的目标会被 GC 回收。\nunsafe.Pointer 可以和 普通指针 进行相互转换。 unsafe.Pointer 可以和 uintptr 进行相互转换。 也就是说 unsafe.Pointer 是桥梁,可以让任意类型的指针实现相互转换,也可以将任意类型的指针转换为 uintptr 进行指针运算。\n一般使用流程: 第一步:将结构体 -\u0026gt; 通用指针unsafe.Pointer(struct) -\u0026gt; uintptr(通用指针)获取内存段的起始位置start_pos,并记录下来,第二步使用。 第二步:使用start_pos + unsafe.Offsetof(s.b) -\u0026gt; 将地址转为能用指 …"
August 28, 2018
golang中slice切片理解总结
"首先我们对切片有一个大概的理解,先看一下slice的内部结构,共分三部分,一个是指向底层数组的时候,一个是长度len,另一个就是slice的容量cap了。如cap不足以放在新值的时候,会产生新的内存地址申请。\n先看代码\npackage main import \u0026#34;fmt\u0026#34; func main() { // 创建一个切片,长度为9,容量为10 fmt.Println(\u0026#34;----- 1.测试切片变量append的影响(未申请新的内存空间)-----\u0026#34;) a := make([]int, 9,10) fmt.Printf( \u0026#34;%p len=%d cap=%d %vn\u0026#34; , a, len(a), cap(a), a) // 切片进行append操作,由于原来len(a)长度为9,而cap(a)容量为10,未达到扩展内存的要求,此时新创建的切片变量还指向原来的底层数组,只是数组的后面添加一个新值 // 此时一共两个切片变量,一个是a,另一个是s4。但共指向的一个内存地址 s4 := append(a,4) fmt.Printf(\u0026#34;%p …"