自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

惜暮

github.com/louyuting

  • 博客(338)
  • 资源 (1)
  • 收藏
  • 关注

原创 Redis的单线程模型怎么理解?

Redis的单线程模型怎么理解?文件事件时间事件事件管理器创建文件事件执行文件事件删除文件事件理解redis的单线程模型之前,需要知道一些redis的基础数据结构以及用法,本文重点不在这块,可参考:从应用到底层 36张图带你进入Redis世界《我们一起进大厂》系列- Redis基础本文分析基于 redis 2.4 源码:Redis的单线程模型是基于事件模型,redis自己实现了一个单线程的非常简洁的ae event事件驱动机制。当然redis的时间模型也是基于epoll(或者其余kqueue、po

2021-01-07 16:01:16 1370

原创 Sentinel Go 核心统计结构滑动窗口的深度解析

Sentinel Go 核心模块分析之滑动窗口统计结构设计Sentinel Go 系列文章:Sentinel Go 核心模块分析之底层组件运行pipeline设计Sentinel Go 核心模块分析之滑动窗口统计结构设计Sentinel Go 核心模块分析之流量控制设计Sentinel Go 核心模块分析之熔断降级设计Sentinel Go 核心模块分析之热点参数流控设计Sentinel Go 核心模块分析之动态数据源扩展设计...

2021-01-01 18:43:41 1581 1

原创 etcd Backend存储引擎实现原理

文章目录etcd raft存储层原理etcd KV存储层原理Backend 存储引擎读事务ReadTX并发读事务ConcurrentReadTx读事务的range查询读写事务 batchTxbatchTx的批量提交MVCC索引与存储实现Revision概念keyIndex 和 treeIndexkeyIndextreeIndex索引的恢复store存储的实现etcd系列文章包括:raft 算法原理etcd raft算法库原理etcd存储层原理etcd网络层原理etcd Watch原理etcd

2020-11-17 23:32:02 1819 1

原创 深入学习CGO

深入学习CGO快速入门基础知识import "C" 语句`#cgo`语句GO与C的类型转换CGO函数调用CGO内部机制CGO内存模型C++类封装成C APICGO调用在go runtime 层面的处理CGO的静态/动态库封装以及编译链接参数CGO定位内存泄露CGO性能CGO最佳使用场景总结参考文献:很多场景下我们希望在Go中利用好已有的C/C++库,Go语言通过自带的一个叫CGO的工具来支持C语言函数调用。本文主要focus在 Go调用C函数的场景。快速入门CGO 一般面向C 的接口编程,下面给出一

2020-08-24 21:55:34 4996 3

原创 golang sync.Mutex互斥锁的实现原理

golang sync.Mutex互斥锁的实现原理数据结构与状态机Lock(1)正常模式(2) 饥饿模式Unlocksync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机sync.Mutex 由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制

2020-05-23 14:18:30 2890 3

原创 伪共享与CPU cache line

伪共享与CPU cache line

2020-05-21 21:30:46 596

原创 golang sync.Pool在1.14中的优化

golang sync.Pool在1.14中的优化sync.Pool在1.12中实现的原理简述1.14 Pool 数据结构poolChainpoolChain.popHead()poolChain.pushHead()poolChain.popTail()poolDequeue数据结构pack/unpackpoolDequeue.pushHeadpoolDequeue.popHeadpoolDequeue.popTail数据结构总结Pool.PutPool.Getvictim的GC优化总结本文基于gol

2020-05-20 16:08:28 1600

原创 Caffeine高性能缓存设计

Caffeine高性能缓存设计是否需要缓存选择合适的缓存Caffeine 的使用Caffeine高性能设计W-TinyLFU 淘汰算法的整体设计LRU和LRU的缺点TinyLFU统计频率Count–Min Sketch算法频率统计Count–Min Sketch的保新机制增加一个小window淘汰策略expireEntries 方法evictEntries 方法Pacer in TinyLFU异步...

2020-04-25 22:24:14 3056 1

原创 位运算之补码

位运算之补码补码理解计算机数值的加法利用补码可以用加法来计算减法位运算在我们开发工作中经常遇到,在一些性能优化的场景经常会出现位运算的场景,比如Java的HashMap里面就是不是通过取余操作而是通过 (n - 1) & hash 来计算key的index的(table array的length是2的n次方)。程序中的整数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在...

2020-04-22 19:21:21 3616 2

原创 常用缓存淘汰算法LFU、LRU、2Q、ARC

常用缓存淘汰算法LFU、LRU、2Q、ARC、FIFOLFULRULFULRU

2020-04-07 22:23:01 2308

原创 Etcdv3 client watcher原理分析

Etcdv3 client watcher原理分析背景etcdv3 client watcher整体架构源码分析背景最近在实现高可用流控防护组件sentinel的golang版本 ,扩展数据源这一块,在golang生态里面是etcd是非常重要的一个角色。需求是这样,每个集成sentinel的app instance会与etcd建立长连接来做动态数据源的更新。由于动态数据源的类型有多个,在Jav...

2020-03-28 17:17:07 1497

原创 Java map和golang map的一些点

Java map和golang map的一些点hash函数Javagolang内存存储模型:JavaConcurrentHashMapJDK7的分段锁思想JDK8的红黑树golang背景:Java 1.8.40Golang 1.13.5hash函数Java哈希函数代码如下:static final int hash(Object key) { int h; ...

2020-02-11 22:38:14 1101

原创 golang 对象(struct) hash原理

golang 对象hash原理map里面的key的hash是怎么实现的golang里面的对象的hash原理map里面的key的hash是怎么实现的源码:src/runtime/map.gogolang的map是内置关键字,不管是get还是set都需要通过key的hash找到对应的存储实体。具体的hash过程如下代码:type maptype struct { typ _ty...

2020-02-04 22:56:36 4739 1

原创 golang interface 与 反射

golang interface 与 反射golang interface 使用场景golang interface 数据结构golang interface 一些使用场景原理函数参数是 interface 的成本interface{}和带方法的interface的赋值过程动态类型与动态分发是如何实现的,动态分发什么时候进行,并且有什么样的调用成本如何进行类型转换如何进行断言,断言的成本有多高为什...

2020-02-01 21:45:28 2808

原创 golang type assertion and unsafe.Pointer 性能对比

type assertion performance类型断言性能对比 unsafe.Pointer

2020-01-17 21:41:42 1145

原创 golang atomic.Value实践以及原理

golang atomic.Value实践以及原理数据结构StoreLoad一些总结最近一个项目中某个对象需要持有一个统计对象,并且需要能够原子的更新这个统计对象(并发读写场景下),避免data race。为了避免对象的copy, 肯定是要持有这个统计对象的指针了。 此外,这个统计对象其实是统计的模型,需要能够随时替换成其余的统计实现。所以很自然的选用了 interface{}来保存。type...

2020-01-15 23:18:59 10826

原创 golang sync.Map 原理以及性能分析

go sync.Map 原理分析go mapsync.Map数据结构go 并发安全的mapsync.Map适用的适用场景

2020-01-12 11:25:29 7676

原创 golang 记一次data race排查过程

golang 记一次data race排查过程

2020-01-04 17:48:20 3571

原创 golang unsafe.Pointer使用原则以及 uintptr 隐藏的坑

uintptr GC 非类型安全指针unsafe.Pointer 使用模式reflect.SliceHeader的缺陷

2020-01-04 12:14:34 5632 6

原创 golang data race 竞态条件

golang data race, race condition

2019-12-20 00:37:20 1908

原创 golang垃圾回收浅析

GC常见垃圾回收算法引用计数标记清除三色标记算法复制算法分代收集算法golangGC的发展golang GC 三色标记主要流程写屏障三色标记状态的记录扫描与对象元信息GC 的触发gcTriggerHeapgcTriggerTimegcTriggerCycle辅助GCGC Pacer根对象标记队列GC的流程Phase1:标记前准备(STW)Phase2 并发标记Phase3:标记终止(STW)Phase4:并发回收

2019-12-09 23:50:36 2312

原创 golang 内存分配深度分析

golang runtime的另外一大主题就是内存分配器,内存分配策略与协程栈、堆、GC等话题息息相关。

2019-12-01 21:09:13 3870 1

原创 golang error处理

golang error处理error 是什么?存在的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 的Error 升级本文主要讲解golang中error的使用以及原理。主要包括以下话题。error是什么error 面临的问题舍弃的try提案社区对于error堆栈解决方案go 1.13 对于error的提升error 是什么?在 golang 中我们使用 e...

2019-11-04 21:55:32 1330

原创 golang 逃逸分析与栈、堆分配分析

golang 逃逸分析与栈、堆分配分析Question什么是堆?什么是栈?逃逸分析在什么阶段确立逃逸为什么需要逃逸go怎么确定是否逃逸第一:编译器命令第二:反编译命令查看实际案例1.指针2. 不确定类型总结我们在写 golang 代码时候定义变量,那么一个很常见的问题,申请的变量保存在哪里呢?栈?还是堆?会不会有一些特殊例子?这篇文章我们就来探索下具体的case以及如何做分析。还是从实际使用场...

2019-10-31 23:47:47 5209 2

原创 golang defer性能损耗和实际使用场景

golang defer性能损耗和实际使用场景基准测试defer开销实际场景结论我们常常听到别人说:”defer 在栈退出时执行,会有性能损耗,尽量不要用。“ 前面的博客 defer原理 我们分析了defer延迟调用的底层实现原理 。下面我们就基于那篇原理分析文章,来分析一下 defer 延迟调用的性能损耗。基准测试package mainimport ( "sync" "testi...

2019-10-28 00:05:30 1870

原创 GC:标记清除算法

本文主要介绍标准的标记-清除算法的过程,优缺点,以及做的一些优化过程。GC Mark-Sweep Algorithm1.GC标记清除算法1.1 标记阶段1.2 标记阶段算法1.3 清除阶段算法1.4 已回收空闲内存空间再分配1.5 合并(内存碎片整理)2.GC标记清除算法的优缺点3. GC标记清除算法的优化3.1 multi-size空闲链表优化分配速度1.GC标记清除算法标记清除算法主...

2019-10-27 22:51:41 1009

原创 golang panic和recover 实现原理

golang panic和recover 实现原理思考1.为什么go 进程会终止2. 为什么不会中止运行3.不设置 defer 行不4. 为什么起个 goroutine 就不行数据结构panic恢复 recover panicpanic 抛出总结:这篇文章是系列文章中的第二篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括gol...

2019-10-27 22:49:52 5111 3

原创 golang defer原理

golang defer原理defer的特性1. 延迟调用2. 后进先出3. defer 作用域4. 异常处理这篇文章是系列文章的第一篇,系列文章主要包括:golang defer的原理golang panic和recover()函数的原理(包括golang对于错误处理方式)defer性能损耗的讨论以及最重要的应用场景defer在golang 1.13 上的性能defer的特性首...

2019-10-25 00:12:48 1963

原创 Golang的内存对齐

Golang的内存对齐测试demo:内存对齐为什么要关心对齐为什么要做对齐默认对齐系数成员对齐:整体对齐对齐规则分析流程成员对齐整体对齐结果小结巧妙的结构体分析流程成员对齐整体对齐结果总结测试demo:我们先来看一个demo:type Part1 struct { a bool b int32 c int8 d int64 e byte}我们先来看一下Part1里面的各个数据...

2019-10-14 22:01:40 1938 2

原创 golang类型转换与类型断言

golang类型转换与断言主要内容:golang语言特点:强类型;

2019-09-23 16:47:12 621

原创 go tool 命令

go 编译命令go toolgo buildgo testgo tool(1) go tool compile -S main.go反编译代码为汇编代码go buildgo build 命令用于编译我们指定的源码文件或代码包以及它们的依赖包。(2) go build -gcflags=-m main.go打印出编译器逃逸分析的过程,使用 -m 参数。go testgo test...

2019-09-22 17:27:02 6772

原创 golang汇编语言基础

Go汇编语言是一个不可忽视的技术。因为哪怕只懂一点点汇编,也便于更好地理解计算机原理,也更容易理解Go语言中动态栈/接口等高级特性的实现原理。Stacks由于 Go 程序中的 goroutine 数目是不可确定的,并且实际场景可能会有百万级别的 goroutine,runtime 必须使用保守的思路来给 goroutine 分配空间以避免吃掉所有的可用内存。也由于此,每个新的 gorouti...

2019-09-22 17:06:19 5102

原创 golang的值接收者和指针接收者的区别

golang的值接收者和指针接收者的区别方法值接收者和指针接收者两者分别在何时使用方法方法能给用户自定义的类型添加新的行为。方法和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法。接收者可以是值接收者,也可以是指针接收者。我们在调用方法的时候,值类型既可以调用值接收者的方法,也可以调用指针接收者的方法;指针类型既可以调用指针接收者的方法,也可以调用值接收者的方法...

2019-09-17 23:05:56 4247 7

原创 Golang map实践以及实现原理

Map实践以及实现原理实例实例

2019-09-17 10:36:24 12191 11

原创 golang unsafe实践与原理

golang unsafe指针类型unsafe为什么有 unsafeunsafe实现原理指针类型unsafe为什么有 unsafeunsafe 实现原理unsafe 使用实践获取slice长度获取map长度Offsetof 获取成员偏移量string 和 slice 的零拷贝相互转换总结指针类型关于指针的好处这里就不描述了。golang是一种强类型的语言,gola...

2019-09-01 23:30:24 1567 3

原创 golang slice实践以及底层实现

slice实践以及底层原理Topic:slice是传值还是传地址slice作为函数入参的各种坑切片的数据结构切片的创建切片的扩容切片的拷贝

2019-08-16 00:15:59 4162 15

原创 Golang 的 sync.Pool设计思路与原理

sync.Pool设计思路与原理使用实例底层数据结构PutGetRuntime 垃圾回收Hook总结使用实例sync.Pool设计的目的是用来保存和复用临时对象,以减少内存分配,降低CG压力。Pool对外暴露的主要有三个接口:func (p *Pool) Get() interface{}func (p *Pool) Put(x interface{})New func() int...

2019-05-29 13:44:49 7500 5

原创 Fasthttp里面 goroutine pool 实现原理

Fasthttp里面 goroutine pool 实现原理应用实例源码分析调用链路分析workerPool 的 start 和 stopworkerPool 的 Serve逻辑架构图这篇文章主要讲解fasthttp 这个http库关于协程池做的优化原理;应用实例fasthttp 是一个非常优秀的web server框架,github上的benchmark号称比官方的net/http快1...

2019-05-26 14:26:51 2163

原创 goroutine pool的简单实现

goroutine pool的简单实现golang web server原理粗糙版本的goroutine pool升级版 goroutine pool这篇文章从go提供的web server的出发,理解go web server的实现方式,提出goroutine pool的重要性,然后自己实现一个简单版本的goroutine poolgolang web server原理我们先来看一个非...

2019-05-26 00:22:32 1540

原创 【树结构】Trie字典树

字典树概念使用场景:实现1. 数据模型2. 添加字符串3. 删除操作4. 获取单词频率5. 测试概念Trie树的名字有很多,比如字典树,前缀树等等。下面我们有and,as,at,cn,com这些关键词,那么如何构建trie树呢?从上面的图中,我们或多或少的可以发现一些好玩的特性。 第一:根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 第二:从根节点到某一节点,路径上经...

2019-03-26 00:06:54 440

MSP430按键中断

按键中断改变参数,按键属于中断输入,随时改变你的变量

2014-08-11

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除