自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

王安的博客

abcedfg

  • 博客(267)
  • 资源 (4)
  • 收藏
  • 关注

原创 protobuf 编码原理

Protocol Buffers(protobuf),它是 Google 开发的一种数据序列化协议(与 XML、JSON 类似)。效率高:Protobuf 以二进制格式存储数据,比如 XML 和 JSON 等文本格式更紧凑,也更快。序列化和反序列化的速度也很快。跨语言支持:Protobuf 支持多种编程语言,包括 C++、Java、Python 等。清晰的结构定义:使用 protobuf,可以清晰地定义数据的结构,这有助于维护和理解。向后兼容性:你可以添加或者删除字段,而不会破坏老的应用程序。

2024-04-15 17:44:36 1006

原创 golang 函数选项模式

函数选项模式直觉式的编程高度的可配置化很容易维护和扩展自文档对于新来的人很容易上手没有什么令人困惑的事(是nil 还是空)参考:t=N7T8。

2023-11-30 12:58:10 726

原创 设计模式-状态模式 golang实现

实现方法对比实现方法优点缺点分支逻辑简单、直接,易理解。对简单的状态机首选该方法实现。对于复杂的状态机来说,代码中充斥着⼤量的 ifelse 或者 switch-case 分⽀判断逻辑,可读性和可维护性差。易漏写或者错写某个状态转移。如果哪天修改了状态机 中的某个状态转移,我们要在冗⻓的分⽀逻辑中找到对应的代码进⾏修改,很容易改错,导致 bug。查表法查表法的代码实现更加清晰,可读性和可维护性更好。

2023-11-08 18:08:03 981 1

原创 go-zero数据库连接池 database/sql 源码学习

当通过 DB.SetConnMaxLifetime 设置 DB.maxLifetime 或通过 DB.SetConnMaxIdleTime 设置 db.maxIdleTime 时,DB均会调用 DB.startCleanerLocked,这个函数的作用是按需初始化 DB.cleanerCh,然后新起一个协程调用 DB.connectionCleaner。当 DB.PingDC 结束时,releaseConn 就会被调用,而这个方法的逻辑很简单,仅仅只是调用DB.putConn方法。

2023-10-29 11:45:57 721

原创 tinyproxy搭建http代理

【代码】tinyproxy搭建http代理。

2023-08-01 10:37:17 1574 1

原创 centos 安装supervisor 详解

执行以下命令二 配置supervisor1.在文件结尾[include]节点处把;改为files = conf.d/*.confa.在/usr/lib/systemd/system/目录下创建文件supervisord.service执行以下命令:d.验证是否为开机启动:#提示 enabled 表示成功。

2023-06-29 13:38:45 1082

原创 go-zero的服务发现源码阅读

go-zero的服务发现是在客户端实现的。在创建zRPC客户端的时候,通过init方法进行了自定义Resolver的注册。gozero注册了四个revlover builder 这里我们只看etcd reslover。

2023-05-25 17:13:09 1255 1

原创 服务发现原理与grpc源码解析

为什么需要服务发现在微服务架构中,在生产环境中服务提供方都是以集群的方式对外提供服务,集群中服务的IP随时都可能发生变化,如服务重启,发布,扩缩容等,因此我们需要及时获取到对应的服务节点,这个获取的过程其实就是“服务发现”。服务的注册(Service Registration)当服务启动的时候,应该通过某种形式(比如调用API、产生上线事件消息、在Etcd中记录、存数据库等等)把自己(服务)的信息通知给服务注册中心,这个过程一般是由微服务框架来完成,业务代码无感知。服务的维护(Service Mainta

2023-05-18 17:10:28 1147

原创 etcd和redis 区别和对比

redis更像是内存型缓存,虽然也有cluster做主从同步和读写分离,但节点间的一致性主要强调的是数据,并不在乎事务,因此读写能力很强,qps甚至可以达到10万+。redis支持更多的存储模式,包括KEY,STRING,HMAP,SET,SORTEDSET等等,因此redis本身就可以完成一些比如排序的简单逻辑。etcd是一种分布式存储,更强调的是各个节点之间的通信,同步,确保各个节点上数据和事务的一致性,使得服务发现工作更稳定,本身单节点的写入能力并不强。

2023-05-17 22:54:29 2198

翻译 Kubernetes kubectl 命令速查表

语法:选项说明:示例。

2023-05-17 15:59:31 404 1

原创 Golang GC 三色标记法

把图(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。(波面):已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向白色对象。(确定存活):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

2023-05-11 22:34:19 1300

原创 如何优化golang gc

通常,当使用堆管理器来管理内存时,垃圾回收时需要在堆中移动和调整不同的内存块,这会导致大量的内存拷贝。可以适当调整runtime.GOGC的值来减少GC的频率,根据应用程序的工作负载和内存使用模式,应适当调整该变量。GO语言采用的是三色标记法垃圾回收算法,这种算法采用的是并发标记,扫描完成后再进行清除工作,这意味着性能上可能会付出一些代价。虽然这不是最激进的解决方案,但它可以有效地减少GC的延迟。到目前为止,gc的标记工作(包括两次mark阶段的STW和并发标记)所用的CPU时间占总CPU的百分比。

2023-05-10 17:42:14 1031

原创 go-zero负载均衡算法源码阅读

负载均衡,p2c负载均衡算法gozero实现

2023-05-09 11:56:47 445

原创 golang 源码阅读-heap堆的实现

heap包定义了实现一个堆所需的结构和堆的操作方法。heap包中提供了一个Interface接口,只要实现了这个接口,就能将该结构当做堆来使用。heap/*Len() int //返回堆的长度Less(i, j int) bool //比较索引i的元素和索引j元素的大小Swap(i, j int) //交换索引i和索引j的元素*/

2023-04-27 13:48:20 263

原创 堆的基本原理

堆的基本原理

2023-04-27 12:13:31 581

原创 go container/list 源码阅读

go list 源码实现

2023-04-26 12:43:18 85

原创 表结构修改工具 pt-online-schema-change

pt-online-schema-change — Percona Toolkit Documentation

2023-03-14 16:06:51 77

转载 git cherry-pick详解

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 Cherry pick。

2023-02-06 16:32:52 212

原创 singleFIight模式 go官方扩展包实现

singleflight 主要是用来做并发控制,例如高并发场景下,N个请求同时查询一个redis key,如果能将这N个请求合并成一个redis查询,那么性能一定会提高很多。常见的场景比如防止缓存击穿。

2022-10-25 21:34:13 1444

原创 布隆过滤器原理与golang实现

维基百科布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点位(offset),把它们置为 1。判断是否存在时,只要看这些点是不是都是 1。如果这些点有任何一个 0,则被检元素不在;如果都是 1,则被检元素很在。这就是布隆过滤器的基本思想。//todo。

2022-10-19 20:48:53 660

原创 熔断原理与go代码实现

在一个系统中,一个服务通常会依赖许多其他的服务,并且服务在某些时候失败是不可避免的。如果我们失败的服务变得无响应,所有依赖它的服务也有变得无响应的风险。这就是所谓的 级联故障。

2022-10-17 17:41:33 580

翻译 应对过载-客户端限流算法

计算公式之前有介绍,当某个请求超过服务端超过资源的配额时,服务端会立即返回一个过载错误,该错误会比真正的业务逻辑 消耗的资源少的多。但是,返回过载错误仍然会消耗一定数量的资源。如果发送过载错误的数量很多,那么消耗的资源仍可能很大。客户端的过载保护可以很好的解决这个问题。

2022-10-16 21:50:31 192

原创 golang 实现时间滑动窗口

固定窗口就像是滑动窗口的一个特例,固定窗口是大小固定且不能随着时间而变化的。滑动时间窗口就是把一段时间片分为多个样本窗口,可以通过更细粒度对数据进行统计。然后计算对应的时间落在那个窗口上,来对数据统计;滑动时间窗口,随着时间流失,最开始的样本窗口将会失效,同时会生成新的样本窗口。例如 我们将1s划分为4个样本窗口,每个样本窗口对应250ms。

2022-10-12 18:50:25 1572

原创 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 1057

原创 应对过载- go-zero源码阅读

运维一个可靠的系统 一个根本要就是能够优雅的处理过载的情况。CPU资源的不足导致的负载上升是我们工作中最常见的,如果CPU资源不足以应对请求负载,一般来说所有的请求都会变慢,CPU负载过高会造成一系列的副作用,主要包括以下几项:正在处理的(in-flight) 的请求数量上升服务器逐渐将请求队列填满,意味着延迟上升,同时队列会用更多的内存线程卡住,无法处理请求cpu死锁或者请求卡主rpc服务调用超时cpu的缓存效率下降。

2022-09-26 22:33:44 514

原创 go-zero map reduce的代码实现 及使用示例

go map reduce

2022-08-23 21:27:11 1056

翻译 系统监控的四个黄金指标

Google SRE 定义了四个需要监控的关键指标。延迟(Latency),流量(Traffic),错误(Errors)和饱和度(Saturation)。正如google sre 所讨论的,如果您只能衡量服务的四个指标,请关注这四个指标。延迟 Latency延迟是服务处理传入请求和发送响应所用时间的度量。测量服务延迟有助于及早发现服务的缓慢。流量 Traffic流量可以更好地理解服务需求。通常称为服务 QPS(每秒查询数),流量是服务请求量的度量。此信号可帮助您决定何时需要扩大服

2022-05-08 23:11:53 2971

转载 PHP 出现 502 解决方案

nginx+php 出现502 bad gateway,一般这都不是nginx的问题,而是由于 fastcgi或者php的问题导致的,常见的有以下几种。 php.ini 的memory_limit 过小(如果有个别php程序进程需要占用极大内存时这个必须注意) php-fpm.conf 中max_children或者max_requests 设置不合理(设置过小会因为没有足够的cgi进程处理请求,设置过大会出现一会儿有响应正常,一会儿等很久才有响应的情况,一般情况下children 按 照内

2022-04-16 09:13:02 5443

原创 golang使用kafka

kafka 安装及基础概念介绍可以参考:kafka 安装、配置、启动_王安的博客-CSDN博客_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 5254

原创 redis源码浅析--二十二.监视器的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》redis 可以通过monitor命令,客户端可以将自己变成一个监视器,实时的接受并打印服务器当前处理的命令;一 成为监视者二 向监视器发送命令信息...

2021-04-20 19:33:40 244

原创 redis源码浅析--二十一.慢查询日志的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》redis的慢查询日志用于记录执行时间查过给定时长的命令请求;我们可以用慢查询日志来监视和优化查询速度;相关配置项:slowlog-log-slower-than执行时间超过slowlog-log-slower-than微秒的命令会记录到慢查询日志中 s...

2021-04-16 18:49:43 188

原创 redis源码浅析--二十.BIT MAP的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》推荐阅读:redis-Bitmaps 基础概念redis提供了SETBIT、GETBIT、BITCOUNT、BITOP 、BITFIELD(起始版本3.2.0)四个命令处理二进制位数组;一 位数组的表示redis使用字符串对象来表示位数组;因为SDS是二进制安全...

2021-04-13 20:05:40 289

原创 redis源码浅析--十九.排序的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》

2021-03-26 18:56:08 277

原创 redis源码浅析--十八.事务的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》Redis通过MULTI、EXEC、WATCH等命令实现事务。Redis事务将多个命令打包,然后一次性、按照顺序执行命令请求;在事务执行期间,服务器不会中断事务而去执行其他客户端请求;一 事务的实现1.1事务开始1.2命令入队1.3事务队列...

2021-03-19 17:23:05 234

原创 redis源码浅析--十七.发布与订阅的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》目录一 频道的订阅与退订1.1订阅频道1.2 取消订阅二 模式的订阅与退订2.1订约模式2.2取消订约模式三 发送消息四 查看订阅信息Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) .

2021-03-11 18:40:03 243

原创 redis源码浅析--十六.cluster集群的设计与实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》

2021-03-01 18:54:05 304 1

原创 redis集群简介

redis3.0推出了分布式解决方案 redis Cluster;当单机遇到了内存、并发、流量等瓶颈时,可以采用Cluster架构方案来达到负载均衡目的。一 理论基础分布式数据库首先要解决如何把整个数据集按照分区规则映射到多个节点上,每个节点负责整体数据的一个子集。常见的分区规则有哈希分区和顺序分区两种。下面介绍集中常见的哈希分区规则;节点取余分区 使用特定的数据,如Redis的键或用户ID,再根据节点数量N使用公式: hash(key)%N计算出哈希值,用来决定数据映射到哪一个节

2021-01-28 18:17:26 459

原创 redis源码浅析--十五.哨兵sentinel的设计与实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》推荐阅读 哨兵的的搭建:https://blog.csdn.net/qq_16399991/article/details/99968357...

2021-01-25 19:53:53 216

原创 redis源码浅析--十四.多机数据库的实现(二)--复制的实现SLAVEOF、PSYNY

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》推荐阅读 复制的搭建:https://blog.csdn.net/qq_16399991/article/details/99881319 复制的实现原理:https://blog.csdn.net/qq_16399991/article/details/109748991...

2020-12-26 17:25:20 251 1

原创 redis源码浅析--十四.多机数据库的实现(一)--新老版本复制功能的区别与实现原理

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation如有错误欢迎指正参考书籍:《redis的设计与实现》复制功能相关概念 搭建方法可以参考:https://blog.csdn.net/qq_16399991/article/details/99881319...

2020-11-19 20:13:34 232

dictAdd流程图.eddx

redis 字典实现程雪流程图,redis,dict,dictionaryadd

2019-12-04

Linux epoll模型详解.xmind

linux epoll 概念、优缺点、io复用 、脑图、Linux下的服务器模型:

2019-06-15

现代操作系统 配套视频教程

《现在操作系统》 配套视频课程。文件为百度云盘分享链接

2018-09-11

空空如也

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

TA关注的人

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