
golang
文章平均质量分 77
wangxiaoangg
这个作者很懒,什么都没留下…
展开
-
设计模式-状态模式 golang实现
实现方法对比实现方法优点缺点分支逻辑简单、直接,易理解。对简单的状态机首选该方法实现。对于复杂的状态机来说,代码中充斥着⼤量的 ifelse 或者 switch-case 分⽀判断逻辑,可读性和可维护性差。易漏写或者错写某个状态转移。如果哪天修改了状态机 中的某个状态转移,我们要在冗⻓的分⽀逻辑中找到对应的代码进⾏修改,很容易改错,导致 bug。查表法查表法的代码实现更加清晰,可读性和可维护性更好。原创 2023-11-08 18:08:03 · 1623 阅读 · 1 评论 -
singleFIight模式 go官方扩展包实现
singleflight 主要是用来做并发控制,例如高并发场景下,N个请求同时查询一个redis key,如果能将这N个请求合并成一个redis查询,那么性能一定会提高很多。常见的场景比如防止缓存击穿。原创 2022-10-25 21:34:13 · 1604 阅读 · 0 评论 -
布隆过滤器原理与golang实现
维基百科布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点位(offset),把它们置为 1。判断是否存在时,只要看这些点是不是都是 1。如果这些点有任何一个 0,则被检元素不在;如果都是 1,则被检元素很在。这就是布隆过滤器的基本思想。//todo。原创 2022-10-19 20:48:53 · 816 阅读 · 0 评论 -
熔断原理与go代码实现
在一个系统中,一个服务通常会依赖许多其他的服务,并且服务在某些时候失败是不可避免的。如果我们失败的服务变得无响应,所有依赖它的服务也有变得无响应的风险。这就是所谓的 级联故障。原创 2022-10-17 17:41:33 · 758 阅读 · 0 评论 -
golang 实现时间滑动窗口
固定窗口就像是滑动窗口的一个特例,固定窗口是大小固定且不能随着时间而变化的。滑动时间窗口就是把一段时间片分为多个样本窗口,可以通过更细粒度对数据进行统计。然后计算对应的时间落在那个窗口上,来对数据统计;滑动时间窗口,随着时间流失,最开始的样本窗口将会失效,同时会生成新的样本窗口。例如 我们将1s划分为4个样本窗口,每个样本窗口对应250ms。原创 2022-10-12 18:50:25 · 2033 阅读 · 0 评论 -
golang map 并发读写 sync.Map 实现原理
通过 read 和 dirty 两个字段将读写分离,读的数据存在只读字段 read 上,将最新写入的数据则存在 dirty 字段上读取时会先查询 read,不存在再查询 dirty,写入时则只写入 dirty读取 read 并不需要加锁,而读或写 dirty 需要加锁,cory dirty到read时需要加锁另外有 misses 字段来统计 read 被穿透的次数(被穿透指需要读 dirty 的情况),超过一定次数则将 dirty 数据同步到 read 上。原创 2022-09-29 20:36:27 · 1510 阅读 · 0 评论 -
应对过载- go-zero源码阅读
运维一个可靠的系统 一个根本要就是能够优雅的处理过载的情况。CPU资源的不足导致的负载上升是我们工作中最常见的,如果CPU资源不足以应对请求负载,一般来说所有的请求都会变慢,CPU负载过高会造成一系列的副作用,主要包括以下几项:正在处理的(in-flight) 的请求数量上升服务器逐渐将请求队列填满,意味着延迟上升,同时队列会用更多的内存线程卡住,无法处理请求cpu死锁或者请求卡主rpc服务调用超时cpu的缓存效率下降。原创 2022-09-26 22:33:44 · 681 阅读 · 0 评论 -
go-zero map reduce的代码实现 及使用示例
go map reduce原创 2022-08-23 21:27:11 · 1340 阅读 · 0 评论 -
golang使用kafka
kafka 安装及基础概念介绍可以参考:kafka 安装、配置、启动_王安的博客-优快云博客_kafka安装启动本文主要介绍confluent-kafka-go的使用方法。confluent-kafka-go,简单易用,并且表现稳定,是kafka官网推荐的golang package。https://github.com/confluentinc/confluent-kafka-go一.下载go clientgo get -v github.com/confluentinc/con...原创 2021-12-11 20:39:29 · 6041 阅读 · 0 评论 -
golang 实现redis sentinel 哨兵 客户端
redis主从复制搭建 可以参考:https://blog.youkuaiyun.com/qq_16399991/article/details/99881319redis 哨兵(sentinel)安装部署可以参考:https://blog.youkuaiyun.com/qq_16399991/article/details/99968357这里只简单实现里功能,可根据要进行封装优化:pack...原创 2019-08-23 21:22:40 · 3811 阅读 · 1 评论 -
golang获取本周、上周 周一日期
https://studygolang.com/articles/19021time.Weekday类型可以做运算,强制转int,会得到偏差数。默认是 Sunday 开始到 Saturday 算 0,1,2,3,4,5,6所以只有Monday减去Sunday的时候是正数,特殊处理下就可以了。/**获取本周周一的日期*/func GetFirstDateOfWeek() ...原创 2019-08-06 11:36:42 · 13378 阅读 · 2 评论 -
golang中字符串和各种int类型之间的相互转换方式:
string转成uint64:argUint64, _ := strconv.ParseUint(*arg, 10, 64)string转成int:int, err := strconv.Atoi(string)string转成int64:int64, err := strconv.ParseInt(string, 10, 64)int转成string:string :...原创 2019-07-25 21:50:29 · 5640 阅读 · 1 评论