Golang
文章平均质量分 82
CoLiuRs
菜鸟。
展开
-
电商系统价格字段的后端存储设计
在电商系统中,价格是一个核心数据元素,其存储设计直接影响系统的性能、可靠性和可扩展性。本文将详细探讨价格字段的数据库设计和相关接口设计。1.1 表结构1.2 分片策略对于大规模系统,可以考虑按product_id进行分片,以提高查询效率和系统扩展性。2.1 价格查询接口2.2 价格设置接口2.3 批量价格更新接口3.1 缓存策略3.2 并发控制3.3 数据验证3.4 日志和审计3.5 性能优化。原创 2024-08-11 11:42:55 · 750 阅读 · 0 评论 -
HBase:大数据中的NoSQL
Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化或者半结构化,非结构化的数据,底层上的数据是以二进制流的形式存储在 HDFS 上的数据块中的Go 读写HBase原创 2023-10-17 16:47:17 · 310 阅读 · 0 评论 -
TCP的粘包、拆包、解决方案以及Go语言实现
TCP 不管发送端要发什么,都基于字节流把数据发到接收端。这个字节流里可能包含上一次想要发的数据的部分信息。接收端根据需要在消息里加上识别消息边界的信息。不加就可能出现粘包问题UDP 是基于数据报的传输协议,每个数据报都是独立传输的(接收端一次只能接受一条独立的消息),不会有粘包问题。原创 2023-06-29 10:30:52 · 1589 阅读 · 1 评论 -
Go mmap 文件内存映射
mmap是个很好用的内存映射工具,它可以将文件映射到内存中,可以方便地操作文件。原创 2023-06-20 18:31:21 · 2262 阅读 · 0 评论 -
Go 存储系列:Hash存储引擎 Bitcask
Bitcask 是一种底层格式为日志模样的 kv 存储,就是只追加,保证文件是一直顺序写入的,写入性能非常好大部分接触的KV存储引擎是可能都是Redis。Redis的所有数据都是装在内存的,也可以根据配置持久化在磁盘里面,但是读都是从内存里面读的,这意味着redis的读写速度都非常快。但是这有一个限制,那就是单机Redis存储的数据不能大于内存本身。而Bitcask的最大限制是内存必须装得下所有的key,因为Bitcask的value是存在磁盘上的。原创 2023-05-26 18:50:56 · 1304 阅读 · 1 评论 -
RPC 实战与核心原理分析
通过分析了RPCX框架的实现原理,我们大概知道了一次RPC请求到底发生了什么事情。我们也可以知道RPC 主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。HTTP 主要用于对外的异构环境,浏览器接口调用,App 接口调用,第三方接口调用等。长链接。不必每次通信都要像 HTTP 一样去 3 次握手,减少了网络开销。注册发布机制。RPC 框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。安全性,没有暴露资源操作。微服务支持。原创 2022-09-21 17:30:57 · 1925 阅读 · 0 评论 -
Go 内存释放策略:MADV_DONTNEED 和 MADV_FREE
Go 内存释放策略:MADV_DONTNEED 和 MADV_FREE, Go 的 pprof 内存和服务器RES 为什么对不上?原创 2022-09-16 11:10:02 · 3016 阅读 · 0 评论 -
RPC 核心原理理论分析
RPC 的全称是 Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现。从业务角度来看,RPC有两个作用从技术角度来看,RPC有这几个作用。原创 2022-09-09 19:33:36 · 953 阅读 · 0 评论 -
性能优化究竟应该怎么做
在高并发系统中,业务往往想提高系统的性能,降低接口的延迟,提高用户体验。本文介绍如何提供系统服务的一些参考方法。原创 2022-08-28 11:38:41 · 723 阅读 · 0 评论 -
Redis的事务,Go+lua
Redis的事务,Go+luaRedis 事务Redis的基本事务(basic transaction)需要用到MULTI命令和EXEC命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止。当一个事务执行完毕之后,Redis才会处理其他客户端的命令。Redis事务在执行的中途遇到错误,不会回滚,而是继原创 2022-05-10 23:55:00 · 638 阅读 · 0 评论 -
缓存数据一致性,雪崩,大Key,热Key问题解决方案
使用缓存为什么使用缓存缓存就是数据交换的缓冲区(称作Cache),目的就是提高我们的接口性能,特别是那些需要大量CPU计算和I/O获取的数据。使用缓存带来的问题缓存虽然能够提高应用程序的性能,但也会带来一些问题。比如:缓存失效,缓存击穿,缓存雪崩,数据一致性问题缓存雪崩缓存失效为什么会带来问题呢?试想一下,单个的缓存失效其实并不会引发多大的问题,问题在于当大量的Key同时失效时,在高并发的情况下,大量的请求同时到数据库层,会给数据库层带来压力,从而引发其他的问题。解决方案优化过期时间既然是原创 2022-05-10 00:57:46 · 1215 阅读 · 0 评论 -
Prometheus监控业务指标
Prometheus是一个开源的监控系统和告警工具,支持多维数据指标, 可以给一条数据打上多个标签, 在查询时根据这些标签做过滤支持PromQL, 可以非常灵活地查询和汇总需要地数据支持图形界面可视化展示, 如grafana等Prometheus架构Prometheus Server 是普罗米修斯的核心服务,提供了对外的HTTP服务以及数据存储, 它将数据存储在时序数据库中.普罗米修斯支持主动和被动方式收集指标数据, 即我们常说的pull模式和push模式. 普罗米修斯会通过配置job/原创 2022-04-28 15:52:51 · 4851 阅读 · 0 评论 -
实现延迟队列的几种方案
背景实际项目当中,经常会使用延迟队列,执行一些延迟任务,比如:如果第一次通知失败,就延迟 X 分钟再通知一次,这在构建webhook的项目中很常见。如果用户成功消费,X 天后没有评论,就默认给予好评。这些任务具有的共同点可以抽象为:在某项任务执行完毕后,延迟一定时间执行另外一项任务。我们需要什么延迟队列:一种带有 延迟功能 的消息队列延时队列模型,就是将未来执行的事件提前存储好,然后不断扫描这个存储,触发执行时间则执行对应的任务逻辑可以选择的技术方案定时扫表服务启动时,开启一原创 2022-04-17 20:56:41 · 5277 阅读 · 0 评论 -
微服务架构熔断设计分析
服务雪崩效应微服务系统有多个系统组成,但由于某些原因(到达性能极限、未知bug、网络分区等)导致访问上游很慢,这时如果没有服务的熔断与降级那么调用者服务会因为上游异常而积累过多请求导致产生大量等待请求,进而调用者服务也会引发访问慢或中止服务的问题,从而引发其他系统问题,如此一来,由上游本身的问题而引发依赖服务的整个链路都出问题,这就是典型的服务雪崩效应。原创 2022-04-13 22:12:47 · 2950 阅读 · 0 评论 -
Go-Redis 使用与源码分析
通常,连接错误记录是读多写少的,所以采用读写锁来保证该记录的并发安全(读写锁在该场景下性能更佳)。// 加锁 p . lastDialErrorMu . RLock() err := p . lastDialError。原创 2021-09-14 01:03:42 · 1766 阅读 · 0 评论 -
Go 处理文件BOM头问题
Go 处理文件BOM头问题背景开发中遇到一个上传文件的需求,通过规定上传的文件会将数据按行排列。 Bug复现为,当上传的文件是csv (Win)系产品上传的时,会在文首解析出不可显的字符,导致后端在解析时会校验错误。给用户返回失败。用vim -b ./data.csv 打开文件发现了文首的不可见字符\<feff>。后来才知道这个是UTF编码自带的编码顺序标记。所以本文接下来分别介绍下,BOM的详细信息,以及我在golang的服务中是怎么处理这种兼容的状况的。BOM的详细信息U原创 2021-08-28 15:34:44 · 1548 阅读 · 0 评论 -
Go 图片生成处理
Go 图片生成处理在一次需求中使用Go做图片处理,简单来说,就是生成一张图片带有水印+文字。使用的, 特定写下此文,介绍一些在Go中处理图片的方式和一些第三库的使用。对于图片的处理,后端通常来说有两种方式,前端处理的方式我就不列了,因为我也不熟悉。后端使用标准库或者第三库使用代码生成,这里我们主要介绍,第三方库:github.com/fogleman/gg后端生成HTML,再用 github.com/chromedp/chromedp 渲染HTML保存为图片。Go gg 图片处理第三方库:g原创 2021-07-29 01:23:08 · 4276 阅读 · 3 评论 -
Go 中的竞争条件
编写多线程应用程序是一项重要的工作,在使用Go 开发程序过程中,我们避免不了要使用多协程。解释竞争条件是如何发生的,以及如何使用 Go 同步数据访问。什么是竞态条件?当多个线程/协程尝试访问和修改相同的数据(内存地址)时,就会出现竞争条件。例如,如果一个线程/协程试图增加一个整数而另一个线程试图读取它,这将导致竞争条件。另一方面,如果变量是只读的,就不会有竞争条件。在 Go 中,当使用 Goroutines 时,线程是隐式创建的。让我们尝试创建一个竞争条件。最简单的方法是使用多个 goroutines原创 2021-07-24 23:52:27 · 308 阅读 · 0 评论 -
Go Slice实现原理分析
Go Slice实现原理分析认识 Slice一种可变长度的数操作make :创建Slice,可以提前分配内存,append:往Slice添加元素package mainimport ( "fmt") func main() { slice := make([]int, 0, 1) // 7 runtime.makeslice slice = append(slice, 1) slice = append(slice, 2) // 9 runtime.原创 2021-07-24 19:29:57 · 307 阅读 · 3 评论 -
Go and Python HMAC 使用
hmac是Hash-based Message Authentication Code的简写,就是指哈希消息认证码,包含有很多种哈希加密算法,sha256是其中一种。在不同的语言中有不同的使用方式,下面介绍Go 和 Python 中的使用方法Gopackage mainimport ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt")func main() { SECRET := "1" sigHash := hmac.New(原创 2021-07-14 00:15:04 · 612 阅读 · 0 评论 -
Go缓存系列之: 缓存的设计
缓存缓存是我们开发过程中必不可少的一项提供接口性能的方式,但是,对项目引入缓存也会带来问题,比如缓存穿透,HotKey,缓存雪崩,缓存击穿,缓存一致性的问腿。所以,我们可能在缓存库中加入一些解决方案。设计的目标我们的目标是设计一个通用的缓存库。设计的目标如下基本操作提供基础操作,创建和删除缓存。// Cache ...type Cache interface { Set(ctx context.Context, key string, value interface{}, expiratio原创 2021-07-11 23:21:04 · 1637 阅读 · 0 评论 -
Go缓存系列之: GroupCache使用与分析
groupcache一句话描述groupcache 是一个分布式缓冲库简介groupcache是什么?groupcache是一个分布式缓冲库是Server又是 Client与其他peer相连热点缓存副本Examplegit clone git@github.com:colinrs/groupcache-db-example.gitcd groupcache-db-examplemake rungit@github.com:colinrs/groupcache-db-exam原创 2021-06-29 23:41:54 · 2562 阅读 · 3 评论 -
Go缓存系列之: BigCache使用与分析
BigCache快速、并发、驱逐的内存缓存写入以保留大量条目而不影响性能。 BigCache 将条目保留在堆上,但省略了 GC。 为了实现这一点,需要对字节片进行操作,因此在大多数用例中都需要缓存前面的条目(反)序列化。简单使用package mainimport ( "fmt" "time" "github.com/allegro/bigcache")func main() { cache, _ := bigcache.NewBigCache(bigcache.Default原创 2021-06-25 00:53:29 · 7392 阅读 · 9 评论 -
Go缓存系列之: FreeCache使用与分析
freecache一句话描述Go缓存库,具有零GC开销和高并发性能简介freecache是什么?使用FreeCache,您可以在内存中缓存无限数量的对象,而不会增加延迟和降低吞吐量。为什么选择freecache?支持存储大量数据条目零 GC协程安全访问过期时间支持接近LRU的淘汰算法严格的内存使用迭代器支持性能如何下面基准测试与内置Map的比较结果,“Set”性能比内置Map快约2倍,“Get”性能比内置Map慢约1/2倍。 由于它是单线程基准测试,因此在多线程环境中,Fr原创 2021-06-25 00:44:50 · 5731 阅读 · 0 评论 -
Go缓存系列之: GoCache使用与分析
go-cachego-cache 一句话描述基于内存的 K/V 存储/缓存 : (类似于Memcached),适用于单机应用程序简介go-cache是什么?基于内存的 K/V 存储/缓存 : (类似于Memcached),适用于单机应用程序 ,支持删除,过期,默认Cache共享锁,大量key的情况下会造成锁竞争严重为什么选择go-cache?可以存储任何对象(在给定的持续时间内或永久存储),并且可以由多个goroutine安全地使用缓存。Examplepackage mainimp原创 2021-06-25 00:42:40 · 14954 阅读 · 2 评论 -
分布式实时消息平台NSQ: NSQLookup & NSQAdmin设计原理
NSQLookup设计原理nsqlookup是管理中心,负责管理拓扑信息。nsqd节点在启动的时候会向nsqlookup进行注册,并且nsqd节点通过nsqlookup广播话题(topic)和通道(channel)信息。消费者通过查询nsqlookupd来发现指定话题(topic)的nsqd,并与nsqd建立连接进行通信和订阅。NSQLookup源码实现启动流程main 函数:apps/nsqlookup/main.go启动流程基本上和nsqd查不多,主要是Main 是主要的入口逻辑type N原创 2021-06-18 01:06:06 · 813 阅读 · 2 评论 -
Go 语言工程管理: Go 语言如何进行代码检查和优化
Go 语言如何进行代码检查和优化LintingLinting 是识别和报告代码中发现的模式的过程,目的是在开发周期的早期提高一致性并捕获错误。 这在团队合作时特别有用,因为它有助于使所有代码看起来都一样,无论是谁编写的,从而降低复杂性并使代码更易于维护。golangci-lintgolangci-lint is a Go linters aggregator. 集合了各种检查工具如何安装# 安装go get github.com/golangci/golangci-lint/cmd/gola原创 2021-06-08 00:38:06 · 2574 阅读 · 0 评论 -
分布式实时消息平台NSQ: NSQD设计原理
NSQD设计原理nsqd 是一个负责接收、排队、转发消息到客户端的守护进程。NSQD源码实现启动流程main 函数:apps/nsqd/main.go// "github.com/judwhite/go-svc"// program 实现了 go-svc 定义的接口,type program struct { once sync.Once nsqd *nsqd.NSQD // nsqd 实例}func main() { prg := &program{} // S原创 2021-06-08 00:02:11 · 797 阅读 · 0 评论 -
Go 语言异常处理
Go 语言异常处理错误处理:如何通过 error、deferred、panic 等处理错误?error在 Go 语言中,错误是可以预期的,并且不是非常严重,不会影响程序的运行。对于这类问题,可以用返回错误给调用者的方法,让调用者自己决定如何处理。在 Go 语言中,error 是一个接口,定义如下type error interface { Error() string}如何New出一个函数,可以使用 errors.New(), fmt.Errorf("")Go 1.13 版本的 er原创 2021-06-06 00:35:19 · 259 阅读 · 0 评论 -
分布式实时消息平台NSQ: 整体架构
分布式实时消息平台NSQ- 整体架构介绍NSQ是一个基于Go语言的分布式实时消息平台,其设计目标是为在分布式环境下运行的去中心化服务提供一个强大的基础架构。NSQ具有分布式、去中心化的拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。NSQ非常容易配置和部署,且具有最大的灵活性,支持众多消息协议。术语Topic: 一个可供订阅的话题,是消息的分类概念。channel: 一个通道(channel)是消费者订阅了某个话题的逻辑分组. 一个Topic有可以分为多个C原创 2021-06-03 01:08:02 · 2250 阅读 · 1 评论 -
为什么要写设计方案或者项目文档
为什么要写设计方案或者项目文档撸代码前,写下设计方案为什么要写设计方案解决一个复杂的问题,一般要经过几个不同的步骤。其中最重要的是问题发现阶段,分析阶段,和构建交付阶段。在分析阶段,工程师们研究哪些方案可以解决客户需求。一个设计方案,不代表已经有了可以上线的代码,虽然在验证方案的过程中,有可能会写一些代码。设计方案,是分析阶段的成果,它告诉大家: 你是怎么解决问题的?你的方案是什么?写设计方案的好处写下来一次,随时随地用产品经理: 保证对问题一致的理解,并且知道方案的优势及其劣势,不会到后期发原创 2021-05-28 00:49:31 · 994 阅读 · 0 评论 -
基于Gin Web 框架封住自己的业务框架
基于Gin Web 框架封住自己的业务框架在使用Gin开发过程中遇到的问题繁琐的请求绑定、参数检查、异常处理、Error日志等,太多重复低效的代码,淹没了真正的业务逻辑基于Gin Web 框架封装需要支持的地方原则:尽量保持和Gin 的API 一致聚焦痛点问题自动请求绑定:框架自动绑定请求到具体结构,开发同学可以直接处理业务参数校验:抽离校验过程,框架自动调用,开发同学只需要定义具体校验内容错误处理方案:设计清晰的错误处理流程更多的中间件支持提供的其他功能优雅重启: 监听原创 2021-05-23 20:21:53 · 249 阅读 · 0 评论 -
原生 http 实现和 gin 对比
原生 http 实现和 gin 对比net/http 和 gin 的关系net/httpnet/http 是 Go 语言中原生的 http 实现,可以提供 http 服务器的功能,其中默认的 DefaultServeMux 提供了基础的路有功能。net/http 提供了良好的抽象:Server,Listener,Conn,HandlerFunc,Handler 定义了一整套http 请求的处理流程。net/http 也存在一些问题请求响应编解码繁琐默认的mutex性能问题时间复杂度:原创 2021-05-22 00:56:45 · 2157 阅读 · 1 评论 -
Gin Web 框架使用和流程分析
Gin Web 框架的使用和流程分析Demopackage mainimport ( "log" "net/http" "github.com/gin-gonic/gin")func HelloWorld(c *gin.Context) { c.String(http.StatusOK, "pong")}func main() { r := gin.Default() // 获取一个Gin的实例:Engine,gin的核心数据结构 r.Use(gin.L原创 2021-05-18 23:32:59 · 873 阅读 · 0 评论 -
Go 原生 HTTP Server 启动流程分析
Go 原生 HTTP Server 启动流程分析HTTP 服务使用Web 服务器是我们在平时开发过程中避免不了需要接触的内容,大致了解HTTP的实现原理或者启动流程有助于平时的开发 或者利用一些现有的Web 服务器框架进行二次封装。下面我们将来分析下Go 原生的HTTP 服务是如何使用、它的启动流程是什么样的简单使用package main import ( "context" "fmt" "net/http" "os" "os/signal"原创 2021-05-16 16:37:31 · 1017 阅读 · 0 评论 -
Golang 实现依赖注入
Golang 实现依赖注入什么是依赖注入和使用 uber.org/dig 对 Go 项目进行依赖注入使用 google/wire 对 Go 项目进行依赖注入原创 2021-05-08 00:53:01 · 2950 阅读 · 2 评论 -
Mac 下 Vscode 配置 Golang 开发环境
Mac 下 Vscode 配置 Golang 开发环境settings.json 配置{ "python.defaultInterpreterPath": "/Users/yichuan.deng/mkt/env/bin/python", "editor.fontSize": 16, "editor.formatOnPaste": true, "editor.formatOnSave": true, "editor.formatOnType": true,原创 2021-03-27 23:01:29 · 2105 阅读 · 0 评论 -
Go 解决私有代码依赖问题
Go 解决私有代码依赖问题在做Go 项目的时候,我们经常会遇到项目依赖私有代码的时候,这个时间如果go开启了mod,可能会不是非常好处理,这里我根据我的go使用经验,总结出两种方法:依赖代码放在${GOPATH}/src 下go get 配置可以拉取私有gitlab项目依赖代码放在${GOPATH}/src下这种方法比较简单,无需修改任何配置,直接将代码放在 ${GOPATH}/src, 在编译go项目的时候go就可以找到对应的依赖包位置go get拉取gitlab项目这种方式经过两步:原创 2020-11-07 00:29:41 · 1377 阅读 · 0 评论 -
ffly-plus 又又又一个`gin` demo项目,带你快速上手用`gin`进行`web`开发!!!!
ffly-plus又又又一个gin demo项目,带你快速上手用gin进行web开发, 在这个demo项目中,你可以学到项目结构设计、gorm的使用、gin中间件的编写、DB设计规范、Swagger文档生成、配置文件解析库viper使用、使用JWT进行身份鉴权认证、使用sentinel-go进行QPS限制、Makefile文件编写、项目文档结构设计和相关内容编写github: https://github.com/colinrs/ffly-plusffly-plus一款适合于快速开发业务的 Go G原创 2020-10-30 01:03:54 · 674 阅读 · 0 评论 -
golang 编程规范 - Code Review 规范
gofmt所有代码在发布前均使用gofmt进行修正。Comment Sentences(注释应当是一个完整的句子)所有的注释都应该是一个完整的句子。句子应该以主语开头,句号结尾。这样做,能使注释在转化成godoc时有一个不错的格式。Declaring Empty Slices(声明空数组分片)当你需要时,声明空的数组分片。这是一个推荐的做法:var t []string这是不好的:t := []string{}原因是,前者能避免分配内存空间。有些时候,可能你从没向这个数组分片里面a转载 2020-05-19 01:06:00 · 621 阅读 · 0 评论