自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ch3nnn的博客

折腾不息 · 乐此不疲 _个人博客: ch3nnn.cn

  • 博客(377)
  • 资源 (2)
  • 收藏
  • 关注

转载 Loki & Promtail 详解

Loki 是受 Prometheus 启发的水平可扩展、高可用、多租户日志聚合系统。非常适合采集 Kubernetes Pod 的日志,关键 Loki 还易于操作且更加轻量级(相比 ELK/EFK/EFLK )。首先,在 Grafana 添加 Prometheus 数据源,URL 只需要填入 http://loki-ip:3100/loki 即可将 LogQL 查询转换为 Prometheus 指标。关于更多 Loki 和 Promtail 配置,以及日志的告警,推荐直接看官方文档,已经很详细了。

2023-03-17 17:34:05 4428

原创 Golang-GMP模型

Go 为了自身 goroutine 执行和调度的效率,自身在 runtime 中实现了一套 goroutine 的调度器,下面通过一段简单的代码展示一下 Go 应用程序在运行时的 goroutine,方便大家更好的理解。for i := 0;i < 4;i ++ {5说明当前这个应用程序中存在goroutine的数量是5,事实上也符合我们的预期。

2023-03-10 10:55:40 466

原创 Filebeat轻量型日志采集器-自定义processors处理器

filebeat通常以配置文件的方式加载插件。让定义一下自定义配置。filebeat.inputs : - type : log paths : - example/example.log processors : # 自定义处理器插件 - parse_text : file_has_suffix : example.log output.console : pretty : true。

2023-02-26 22:07:37 1541

原创 Golang-数组与切片常见错误及陷阱

值得注意的是,不管传的是 slice 还是 slice 指针,如果改变了 slice 底层数组的数据,会反应到实参 slice 的底层数据。若传的是 slice 的指针,在调用者看来,是会被改变原 slice 的。在 Go 中,数组是不常见的,因为其长度是类型的一部分,限制了它的表达能力,比如 [3]int 和 [4]int 就是不同的类型。myAppend 函数里,虽然改变了 s,但它只是一个值传递,并不会影响外层的 s,因此第一行打印出来的结果仍然是 [1 1 1]。容量刚好够,直接追加。

2023-02-15 17:43:05 692

原创 图数据库-Neo4j

Neo4j是由 Java 实现的开源 NoSQL 图数据库。Neo4j实现了专业数据库级别的图数据模型的存储。与普通的图处理或内存数据库不同,Neo4j 提供了完整的数据库特性,包括 ACID 事务的支持、集群支持、备份与故障转移等,这使其适合于企业级生产环境下各种应用。

2023-02-06 15:45:37 1407

转载 Cypher查询语言--Neo4j中的SQL

可选关系是一个可选描述模式的方法,但在真正图中可能没有匹配(节点可能没有或者没有此类关系时),将被估值为null。这意味着:找出两点间的一条最短路径,最大关系长度为15.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。一个限制点是为模式匹配的从开始点出发的一条关系或一个节点。如:这个有个查询,通过遍历图找到索引里一个叫John的朋友的朋友(不是他的直接朋友),返回John和找到的朋友的朋友。当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。

2023-02-06 15:18:12 558

原创 Graph Database 图数据库

图数据库(Graph Database)是基于图论实现的一种新型NoSQL数据库。它的数据存储结构和数据的查询方式都是以图论为基础的。图论中图的基本元素为节点和边,在图数据库中对应的就是节点和关系。节点关系节点之间关系。

2023-02-06 15:11:53 749

转载 count(*) 和 count(1) 有什么区别?哪个性能最好?

当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count()、count(字段) 等。到底哪种效率是最好的呢?是不是 count() 效率最差?我曾经以为 count() 是效率最差的,因为认知上会读取所有表中的字段,所以凡事带有字符的就觉得会读取表中所有的字段,当时网上有很多博客也这么说。但是,当我深入 count 函数的原理后,被啪啪啪的打脸了!不多说, 发车!

2023-02-02 18:00:04 627

转载 开箱即用的微服务框架 Go-zero(进阶篇)

之前我们简单介绍过 Go-zero 详见《Go-zero:开箱即用的微服务框架》。这次我们从动手实现一个 Blog 项目的用户模块出发,详细讲述 Go-zero 的使用。特别说明本文涉及的所有资料都已上传 Github 仓库 “kougazhang/go-zero-demo”, 感兴趣的同学可以自行下载。

2023-01-13 14:10:14 2146

转载 go-zero:开箱即用的微服务框架

goctl 是 go-zero 微服务框架下的代码生成工具。使用 goctl 可显著提升开发效率,让开发人员将时间重点放在业务开发上。goctl 的命令可归纳为如下几类:API 命令,快速生成一个 API 服务rpc 命令,支持 proto 模板生成和 rpc 服务代码生成model 命令,目前支持识别 mysql ddl 进行 model 层代码生成plugin 命令,支持针对 API 自定义插件其他命令,目前是发布相关。

2023-01-13 14:09:29 884

原创 Golang: 值传递还是引用传递

本部分引用 Go 官方 FAQ 的 “When are function parameters passed by value?”,内容如下。如同 C 系列的所有语言一样,Go 语言中的所有东西都是以值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就像有一个赋值语句将值赋给参数一样。传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。其指的是在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

2023-01-09 18:03:16 528

原创 减小 Go 代码编译后的二进制体积

减小编译后的二进制的体积,能够加快程序的发布和安装过程。使用编译选项后,体积从原来的 9.8M 下降了 20% 到 7.8M,使用 upx 压缩后,体积进一步下降 60% 到 3M。累进下降约 70%。如果对编译后的体积没什么要求的情况下,可以不使用 upx 来压缩。可以看到,使用 upx 后,可执行文件的体积从 9.8M 缩小到了 5M,缩小了 50%。是一个常用的压缩动态库和可执行文件的工具,通常可减少 50-70% 的体积。接下来,我们看一下,如果只使用 upx 压缩,二进制的体积可以减小多少呢。

2023-01-03 00:07:34 1092 1

转载 入门篇:从 etcd 名字的由来,到安装部署和使用姿势

当然,也有其他组件可以提供配置共享和服务注册和发现的功能,比如最为广泛和大家最为熟知的 Zookeeper,也被很多 Java 系的知名开源项目认可和使用,比如:Hadoop、HBase、Kafka 等。该脚本创建包含 3 个 etcd 成员节点的集群,每个集群成员都接收键值的读取和写入。以上,就是今天的全部内容,几乎包含了 etcd 安装和使用的各种姿势,欢迎各位号友敬请尝试。当一个 key 被绑定到一个租约上时,它的生命周期与租约的生命周期即绑定。注:运行过程中,可能会涉及权限问题,授权即可。

2022-12-20 09:48:53 489

转载 手撸源码系列 - cache2go

cache2go 是一个并发安全、带有自动过期机制的缓存库。通过阅读源码我们可以掌握:作者是如何维护缓存数据的;作者是如何使用 sync.RWMutex 保证并发安全,有哪些值得借鉴的技巧;自动过期机制是如何实现的(这块代码思路值得学习);这个库还提供了如下功能:可以配置添加、删除、访问数据时的回调函数;为每个 item 单独设置存活时间;记录每个 item 的最近访问时间、创建时间、访问次数等;按照访问次数排序;

2022-11-05 13:00:43 82

转载 深入 Go 并发原语 — Channel 底层实现

作为 Go 并发原语的第一篇文章,一定绕不开 Go 的并发哲学。从 Tony Hoare 写的 Communicating Sequential Processes 这篇文章说起,这篇经典论文算是 Go 语言并发原语的根基。

2022-11-03 18:28:54 826 1

转载 深入解析 Go 中 Slice 底层实现

切片是 Go 中的一种基本的数据结构,使用这种结构可以用来管理数据集合。切片的设计想法是由动态数组概念而来,为了开发者可以更加方便的使一个数据结构可以自动增加和减少。但是切片本身并不是动态数据或者数组指针。切片常见的操作有 reslice、append、copy。与此同时,切片还具有可索引,可迭代的优秀特性。

2022-11-03 18:18:30 253

转载 深入Go的Map使用和实现原理

最后我们分析一下go的整体内存结构,阅读一下map存储的源码,如下图所示,当往map中存储一个kv对时,通过k获取hash值,hash值的低八位和bucket数组长度取余,定位到在数组中的那个下标,hash值的高八位存储在bucket中的tophash中,用来快速判断key是否存在,key和value的具体值则通过指针运算存储,当一个bucket满时,通过overfolw指针链接到下一个bucket。接下来我们一探究竟。看了上面的map创建,初始化,增删改查等操作,我们发现go的api其实挺简单易学的。

2022-11-03 18:08:14 334

原创 Go 语言 怎么使用 Content 控制 goroutine 协程关闭

从源码中可以看到,在调用链的过程中,会调用一个goroutine同时监听parent.Done()和child.Done(),当有parent.Done()关闭的时候就会调用child.cancel的方法来取消上下文,同时会在构造树上将该child节点删掉,删掉此child节点之后,还会轮训的将此child节点的child节点全部都调用cancel函数使其退出,最终实现了此parent节点的全部孩子节点都退出。简单来说,context就是在golang中防止内存泄露来进行goroutine并发控制的。

2022-10-24 18:39:13 1120

原创 Go 语言 设计模式-装饰模式

装饰模式是一种结构型设计模式, 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。

2022-10-07 23:13:45 190

原创 Go 语言 设计模式-组合模式

组合是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。对于绝大多数需要生成树状结构的问题来说, 组合都是非常受欢迎的解决方案。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。

2022-09-21 20:30:00 241

原创 Go 语言 设计模式-桥接模式

桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。层次结构中的第一层 (通常称为抽象部分) 将包含对第二层 (实现部分) 对象的引用。抽象部分将能将一些 (有时是绝大部分) 对自己的调用委派给实现部分的对象。所有的实现部分都有一个通用接口, 因此它们能在抽象部分内部相互替换。

2022-09-19 22:00:00 312

原创 Go 语言 设计模式-适配器模式

适配器是一种结构型设计模式, 它能使不兼容的对象能够相互合作。适配器可担任两个对象间的封装器, 它会接收对于一个对象的调用, 并将其转换为另一个对象可识别的格式和接口。

2022-09-18 16:04:02 373

原创 Go 语言 设计模式-单例模式

单例是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。单例拥有与全局变量相同的优缺点。尽管它们非常有用, 但却会破坏代码的模块化特性。在某些其他上下文中, 你不能使用依赖于单例的类。你也将必须使用单例类。绝大多数情况下, 该限制会在创建单元测试时出现。

2022-09-17 15:11:22 395

原创 Go 语言 设计模式-原型模式

原型是一种创建型设计模式, 使你能够复制对象, 甚至是复杂对象, 而又无需使代码依赖它们所属的类。所有的原型类都必须有一个通用的接口, 使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本, 因为相同类的对象可以相互访问对方的私有成员变量。

2022-09-16 23:14:14 369

原创 Go 语言 设计模式-生成器模式

生成器是一种创建型设计模式, 使你能够分步骤创建复杂对象。与其他创建型模式不同, 生成器不要求产品拥有通用接口。这使得用相同的创建过程生成不同的产品成为可能。

2022-09-15 10:38:24 276

原创 Go 语言 设计模式-抽象工厂模式

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。抽象工厂定义了用于创建不同产品的接口, 但将实际的创建工作留给了具体工厂类。每个工厂类型都对应一个特定的产品变体。在创建产品时, 客户端代码调用的是工厂对象的构建方法, 而不是直接调用构造函数 (new操作符)。由于一个工厂对应一种产品变体, 因此它创建的所有产品都可相互兼容。客户端代码仅通过其抽象接口与工厂和产品进行交互。该接口允许同一客户端代码与不同产品进行交互。你只需创建一个具体工厂类并将其传递给客户端代码即可。

2022-09-14 10:19:16 328

原创 Go 语言 设计模式-工厂模式

gun­Fac­to­ry枪支工厂结构体将发挥工厂的作用, 即通过传入参数构建所需类型的枪支。由于 Go 中缺少类和继承等 OOP 特性, 所以无法使用 Go 来实现经典的工厂方法模式。首先, 我们来创建一个名为 i­Gun的接口, 其中将定义一支枪所需具备的所有方法。ak47或 mus­ket进行互动, 而是依靠 gun­Fac­to­ry来创建多种枪支的实例, 仅使用字符参数来控制生产。两种具体的枪支——ak47与 mus­ket火枪 ——两者都嵌入了枪支结构体, 且间接实现了所有的 i­Gun方法。

2022-09-13 10:07:55 347

原创 Go 语言 并发安全与引用传递总结

Slice扩容机制的影响:向Slice中添加元素超出容量的时候,我们知道会触发扩容机制,而扩容机制会创建一份新的【原数据】此时,它与浅拷贝获取到的变量是没有任何关联的。但是在切片中并不会引发panic,如果程序无意中对切片使用了并发读写,严重的话会导致获取的数据和之后存储的数据错乱,所以这里要格外小心,可以通过加锁来避免。Go只会对基础值类型在传参中使用深拷贝,实际上对于Slice和Map类型,使用的是浅拷贝,Slice作为传参,其指向的内存地址依然是原数据。因此需要使用额外方式来实现。

2022-09-09 14:36:02 336

原创 Go 语言 Strconv 库常用方法

strconv包实现了基本数据类型和其字符串表示的相互转换。更多函数请查看。

2022-08-08 11:47:28 424

转载 Go 语言 pprof 性能调优实战

如果要说在 golang 开发过程进行性能调优,pprof 一定是一个大杀器般的工具。但在网上找到的教程都偏向简略,难寻真的能应用于实战的教程。这也无可厚非,毕竟 pprof 是当程序占用资源异常时才需要启用的工具,而我相信大家的编码水平和排场问题的能力是足够高的,一般不会写出性能极度堪忧的程序,且即使发现有一些资源异常占用,也会通过排查代码快速定位,这也导致 pprof 需要上战场的机会少之又少。即使大家有心想学习使用 pprof,却也常常相忘于江湖。......

2022-08-05 15:09:14 1143

原创 Go 语言 strings 库常用方法

最近由于用go做字符串处理,用到了go的strings库,借此对go strings库做个总结,将go strings中所有函数的功能做一个简单的说明,当然,这是一个重复造轮子的过程,因为go语言标准库已经有中文版了。...

2022-08-05 11:40:08 549 1

原创 Go 语言 如何操作文件

本文归根结底是介绍os、io、bufio这些包如何操作文件,因为Go语言操作提供了太多了方法,借着本文全都介绍出来,在使用的时候可以很方便的当作文档查询,如果你问用什么方法操作文件是最优的方法,这个我也没法回答你,需要根据具体场景分析的,如果这些方法你都知道了,在写一个benchmark对比一下就可以了,实践才是检验真理的唯一标准。来源公众号Golang梦工厂超全总结Go语言如何操作文件。......

2022-08-01 10:29:19 456

原创 Gorm 更新零值问题

为方便描述教程例子,这里给出mysql表结构定义和golang结构体定义。下面是教程用到的foods下面是foods表对应的golang结构体类型//商品typeFoodstruct{IdintTitlestringPricefloat32StockintTypeint//mysqldatetime,date类型字段,可以和golangtime.Time类型绑定,详细说明请参考gorm连接数据库章节。二、gorm更新记录常用方法1.Save用于保存模型变量的值。...

2022-07-27 17:23:33 2463

原创 Go 语言 Time 库时间处理

进行格式化,在其他语言中,一般会使用通用的时间模板来格式化时间。函数用于增加/减少(d的正值表示增加、负值表示减少)time.Time的持续时间。对某瞬时时间,增加或减少指定纳秒级以上的时间。时间戳是自1970年1月1日(080000GMT)至当前时间的总毫秒数。函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息。time包提供了时间的显示和测量用的函数。包定义的一个类型,它代表两个时间点之间经过的时间,以纳秒为单位。函数基于年、月和日的维度增加/减少time.Time的值。......

2022-07-19 10:29:08 941

原创 python如何关闭线程

python关闭线程的方法:首先导入threading,定义一个方法;然后定义线程,target指向要执行的方法,启动它;最后停止线程,代码为【stop_thread(myThread)】。python关闭线程的方法:一、启动线程首先导入threading然后定义一个方法 然后定义线程,target指向要执行的方法 启动它 二、停止线程不多说了直接上代码 停止线程...

2022-07-08 18:11:08 15864 3

原创 Docker搭建minio server

MinIO 是一款基于Go语言的高性能对象存储服务,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等拉取镜像如果是podman,执行:启动镜像docker:运行成功:总结和网上的一些文档不同, 新版MINIO参数已经发生了变化。比如:Console 登录账号:MINIO_ROOT_USER替代了MINIO_SECRETConsole 登录密码:MINIO_ROOT_PASSWORD替代了MINIO_SECR

2022-06-22 15:08:32 380

原创 一键安装 Golang Installer

installing Go

2022-06-16 23:21:51 390 1

原创 Golang HTTPS 忽略证书验证

​通过设置TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 来取消对HTTPS的证书验证,以处理x509: certificatesignedby unknown authority​

2022-06-15 16:57:53 2348

原创 go-cache 是一种内存中的 key:value 存储/缓存,类似于 memcached,适用于在单机上运行的应用程序

go-cache 是一个内存中的 key:value 存储/缓存,类似于 memcached,适用于在单机上运行的应用程序。任何对象都可以在给定的持续时间内或永远存储,并且缓存可以被多个 goroutine 安全地使用。尽管 go-cache 并不打算用作持久数据存储,但整个缓存可以保存到文件(或任何 io.Reader/Writer)并从文件中加载,以便快速从停机中恢复。用法请参阅自述文件和文档。......

2022-06-13 16:09:04 588

原创 在Go语言项目中使用Zap日志库

在Go语言项目中使用Zap日志库Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档。一、在Go语言项目中使用Zap日志库介绍在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能:能够将事件记录到文件中,而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO,DEBUG,ERROR等。 能够打印基本信息,如调用文件/函数名

2022-05-26 11:42:33 1118

DeskPins v1.32.rar

该软件是更实用的窗口打顶工具。有时,当我们在打字或玩游戏时在计算机上观看电影时,通常会有打字窗口和游戏挡住电影的窗口。缩小电影的窗口和要观看的游戏的窗口,但有时您看不到电影,这很麻烦。此时,该软件可以派上用场,只要用户将要顶的窗口放在不影响其使用的位置,那么无论是玩游戏还是打字,它都不会影响他的观看经验,非常实用。

2020-03-26

ShareMouseSetup.exe

ShareMouse让你一套键盘鼠标就能控制多台电脑,非常适合多屏幕处理工作的朋友使用,你只需要移动鼠标指针的到想控制的显示器那里去、鼠标光标就会神奇地“跨越”到邻近的电脑屏幕上。

2020-03-26

空空如也

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

TA关注的人

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