分布式系统的死锁处理

产生死锁的必要条件 互斥使用:进程对其申请的资源进行排他控制,其他申请资源的进程必须等待。 不可剥夺:占用资源的进程只能自己释放资源,不能被其他

初识分布式系统

集中式系统 在学习分布式之前,先了解一下与之相对应的集中式系统是什么样的。 集中式系统用一句话概括就是:一个主机带多个终端。终端没有数据处理能力

etcd的MVCC

MVCC MVCC(Multi-version Cocurrent Control)即多版本并发控制技术,多用于数据库中的事务管理,其基本思想是保存一个数据的多个历史版

etcd的事务机制

事务机制 序列化(访问序列化) 像etcd这类分布式一致性系统时常要处理非常多的来自不同并发客户端的并发请求。尽管有众多并发的读和写,原子性依然

用eTcd实现选举

选举 etcd的选举则需要在我们熟悉它的一系列基本概念后,调动我们充分的想象力: 1、MVCC,key存在版本属性,没被创建时版本号为0; 2、C

etcd2和3的区别

从 etcd2 到 etcd3 etcd 最早是被设计用来解决 CoreOS 升级时机器的协调问题的。现在它被用于分布式网络、服务发现、配置管理、任务调度和负载均衡等服务中。原始设计的部

分布式锁的实现

为何需要分布式锁 一般我们使用分布式锁有两个场景: 效率:使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪费资源。比如用户付了钱之后有可

Golang读写Excel

简介 Excelize 是 Go 语言编写的用于操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的 XLSX 文档。相比较其他的开源类

etcd:从应用场景到实现原理的全方位解读

很多人对这个问题的第一反应可能是,它是一个键值存储仓库,却没有重视官方定义的后半句,用于配置共享和服务发现。 A highly-available key value store for shared configuration and service discovery. 实际上,e

Go如何操作etcd

ETCD ETCD是用于共享配置和服务发现的分布式,一致性的KV存储系统。ETCD是CoreOS公司发起的一个开源项目,授权协议为Apache。 核心

MySQL批量SQL插入性能优化

对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个

Go中的map和slice查询性能对比

看到标题,第一反应,map肯定秒杀slice啊,我当时也是这么想的,毕竟前者的查询复杂度是O(1),后者是O(n)。 1 2 3 4 5 6 7 8 9 10 11 12

Go中的slice和map的比较方法

思路 开发中经常会遇到需要比较两个slice或map包含的元素是否完全相等的情况,一般来说有两个思路: reflect比较的方法 循环遍历比较的方

Go中的interface{}比较方法

类型不确定 在不确定类型需要反射的时候,DeepEqual是我们不可不用的强大工具。 比如: 1 2 3 4 5 6 7 func main(){ m1:=map[string]interface{}{"a":"1", "b":2, "c":3}; m2:=map[string]interface{}{"a":1, "c":"3", "b":2}; fmt.Println(`reflect.DeepEqual(m1["a"],m2["a"]`,reflect.DeepEqual(m1["a"],m2["a"])); fmt.Println(`reflect.DeepEqual(m1["b"],m2["b"]`,reflect.DeepEqual(m1["b"],m2["b"])); } 执行结果: 1 2 3

DeepEqual浅析

规则 不同类型的值不会深度相等 Values of distinct types are never deeply equal. 1 2 3 4 5 6 7 8 9 10 type S1 struct { Field int } type S2 struct { Field int } func main() { fmt.Println(reflect.DeepEqual(S1{1}, S2{1})) } 对应输出false 当两个数组的元素对

Go和HTTPS

HTTPS简介 日常生活中,我们上网用的最多的应用层协议就是HTTP协议了,直至目前全世界的网站中大多数依然只支持HTTP访问。 使用Go创建一

Go的map使用实践

初始化 使用 map 的时候需要注意,你需要显式地初始化才能对 map 进行操作. 1 2 var m map[string]string m["a"]="sssss" 上面的代码会报 panic: assignment to entry in nil map ,必须用内建的 make() 函数才行. 1 2 m:=make(map[string]string) m["a"]="sssss" key

Go中的内置类型比较

概念 首先区分几个概念:变量可比较,可排序,可赋值 可赋值 规范里面对赋值是这么定义的:https://golang.org/ref/spec#A

Go语言的浮点数计算

浮点数计算不精确 浮点数与整数计算 先看两个case 1 2 3 4 5 6 7 // case1: 135.90*100 ==== // float32 var f1 float32 = 135.90 fmt.Println(f1 * 100) // output:13589.999 // float64 var f2 float64 = 135.90 fmt.Println(f2 * 100) // output:13590 浮点数在单精度下, 13