自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小知识折射大智慧

冷静观察,稳住阵脚,沉着应对,韬光养晦,善于守拙,决不当头,所有作为。关键还是要有所作为

  • 博客(501)
  • 资源 (5)
  • 收藏
  • 关注

原创 rust 从转移说起

Rust 中,对大多数类型而言,给变量赋值、给函数传值或者从函数返回值,这些操作不会发生值复制,而是“转移”。所谓转移,就是原来的所有者让渡这个值的所有权给目标所有者,并变成未初始化状态。然后,由目标所有者控制这个值的生命期。Rust 专门提出了所有权和转移的概念,第一次接触总感觉晦涩,不属于正常思维,但还是得耐下性子,观摩观摩 Rust 所谓的转移。上面这段话是我抄的,绕来绕去的,

2023-07-05 00:04:39 722

原创 从 Option 类型说起

Option 不是结构体声明,而是枚举类型。印象中的枚举类型都是固定的常量,这里 Rust 的枚举支持了泛型。枚举了两种可能:有值、或没值。None表示没有值,Some(T) 表示存在 T 类型的值。

2023-07-01 11:59:50 817 1

原创 match more result 表达式

rust 中 match 表达式和 go 中 switch 有几分相似,但 rust 语言的无厘头性,让 math 有了更多的组合。

2023-07-01 11:24:38 502

原创 Go代码片段品鉴

作为一个服务端开发,熟悉我们服务的业务至关重要,但我们换工作的时候,也经常会换到别的业务场景下。比方说,我在成人教育的行业工作了2年,跳槽到了支付的行业。这么看的话,业务并不能成为服务端工程师的求职门槛。但我们可能会有被评价过缺少产品 sense,限制我们始终工作在一线。抛开业务的特殊场景,我们所开发的功能其实大同小异,面临的问题也有很高的重复性。当遇到之前解决过的问题,我经常会回忆之前写过的代码,代码本身可能很烂,但总觉得它经过了线上的考验,是信的过的。但很严肃的结果是,自己完全回忆不起来。

2023-06-18 20:36:56 1004

原创 rust小白入门

文档,按照 rust 编译环境非常简单,macos 执行下面的语句,安装成功 rustup 工具,开发环境也就搭建好了。执行成功之后,记得执行 source 命令让 rustup 生效。

2023-06-15 08:02:06 1350

原创 红黑树的理解

AVL树的左右子树高度差绝对值不超过1,而红黑树的左右高度差不超过2倍。结合红黑树的定义5,任意节点到其后代叶子节点的途径上,黑节点数目相同,说明可以多出来一倍节点应该都是红节点。

2023-06-08 07:39:05 195

原创 Redis 集群

如果Key被请求到node_a节点上,通过计算槽位,发现node_a无法处理这个请求,计算的槽位是由node_b负责的。这时node_a会给客户端返回一个MOVE响应,客户端拿到MOVE的参数,重新去发起请求。我比较吃惊的是,集群中提供服务的都是 Master 节点,每个节点都负责一部分槽位。在整个集群中,数据是根据槽位来存储的,总共有16384个槽位。问题来了,对于诸如 MSET 这种命令,它会同时设置多个Key,集群如何处理这种情况呢?提高系统的高性能,单台计算机的处理能力肯定是有限的。

2023-06-04 23:03:32 518

原创 go test 包外测试

结合图示,go 包外测试就是 main_test.go 中声明的 package 不再是 main,而是 main_test。现在包外测试已经搞明白了:同一个目录下,比如声明的 package 为 ol,还可以声明 ol_test 的包。形如下面这样,但 main_test.go 和 main.go 声明的 package 是相同的。虽然 ol 和 ol_test 在同一个目录下,但因为它俩的 package 不相同,两个包的就是独立隔离的,ol_test 中的单测用例就不能访问 ol 中的私有方法了。

2023-06-04 11:10:41 1340

原创 MySQL SQL语句

SQL 语法的背后有很多原理,搞清楚背后的原理,写 SQL 的时候才能显得丝滑。不过,我总是经常忘记一些 SQL,有时候会陷入自我怀疑,还是得回过头来去看看 SQL 的用法。索性还蹩脚的掌握了些英文,历史上又多次看过,再看一遍 SQL 的用法也不是特别费劲。

2023-05-22 00:02:15 119

原创 时间轮算法

定时任务可以参考这个算法,比如,我们需要每隔5分钟调用线上的回调接口,每天的凌晨1点调用苹果的自动扣费接口,遇到这样的处理场景,我还是会想到 linux 的 crontab,几年前,我们还手动编辑 crontab 来定时执行线上任务,转眼几年过去了,已经看不到 crontab 执行任务的身影了。

2023-05-18 00:20:47 179

原创 Go 本地缓存 bigcache

​本地缓存已经算是数据库的常规设计了,因为数据直接缓存在机器内存中,避免昂贵的IO开销,数据的读取和写入快到不可思议。本地缓存常驻在内存中,就好像业务逻辑中声明的全局变量一样,不会被垃圾回收。但本地内存也会导致单机内存使用率变高,频繁的GC导致系统性能下降。在说 Go 本地内存之前,我们先看看别的数据库是怎么使用本地内存的。

2023-05-16 23:50:35 2193

原创 go test coverage 单测覆盖率

单元测试的最终统计标准就是单测覆盖率,统计单测总体覆盖了多少行代码。一般来说,我们只需要关注增量代码的覆盖率,而非全量代码。增量代码就是本次迭代改动的代码,比如本次迭代改动了100行代码,我们保证单测能覆盖到这 100 行代码就行。在命令行覆盖率的统计指令,会生成一个 coverage 文件,基于这个 coverage 文件,我们结合 go tool 工具,就可以图形话展示代码覆盖率情况。

2023-05-11 08:20:30 5812

原创 Testify Mock 单元测试

Testify 提供了单测方便的断言能力,这里的断言是将对代码实际返回的断言,代码的实际输出和预期是否一致。下面是单元测试中也会存在不稳定的代码,我们的入参虽然保持不变,但每次单测的结果可能会发生变化。比如说,我们会调用第三方的接口,而第三方的接口可能会发生变化。再比如,代码中有通过time.Now()获取最近7天内的用户订单,这个返回结果本身就是随当前时间变化的。当然,我们肯定不希望每次单测都手动调整,来“迎合”这类不稳定的代码,这样不仅疲于奔命,还效率不高。测试上使用 Mock 就可以解决这类问题。

2023-05-10 08:37:38 1316

原创 Goland Run Targets 如何使用

我们依赖的开发环境会经常面临系统升级等问题,升级之后很多依赖可能就不能使用了,之前稳定运行的程序也可能出问题。因为 docker 的存在,我们可以使用 docker 来创建一个稳定的执行环境,再也不需要因为不同的系统、不同的软件版本带来的问题而烦恼了。goland 编译器做的非常好,在之前的工作中,我一直没有接触过 Run Target 这个功能,因为我压根没有遇到过环境问题。但如果你运行的代码需要和系统打交道,这个功能就显得非常重要。因为我们所使用的第三方库很少使用能兼容所有的系统。

2023-05-07 18:09:04 491

原创 GoMonkey Patching in Go

gomonkey 用来给函数打桩,这种使用一个新的方法实现来替换原来的实现逻辑,怎么看都觉得很神奇。举个例子,在单测中方法 json.Marshal 可以被 gomonkey 覆写成另一种逻辑实现,我准备从原理和使用的角度来看看 gomonkey。主要是来看看。

2023-05-06 22:16:17 1188

原创 GC垃圾回收

触发GC的时机是怎样的?我使用 gctrace 打印了 GC 的执行明细。

2023-04-24 08:33:01 304

原创 逃逸分析反思

英文名 Escape Analysis ,逃逸分析用来确定变量是否会分配在堆上。堆分配的效率要明显低于栈分配的效率,而且堆内存需要依赖 GC 做回收,GC 反过来又会影响程序性能。变量逃逸是在编译阶段确定的,我们可以通过减少变量逃逸来提高程序性能。Go 语言可以指定编译参数来分析变量逃逸。参数 gcflags 用来指定编译参数,逃逸分析重要的两个参数是 -m 和 -l,-m 用来打印逃逸分析的优化策略,-l 用来禁止内联优化,完整的编译指令如下。

2023-04-18 07:52:38 175

原创 context 浅析

在缺少直接调用关系的两个函数之间传递数据,一般都会考虑使用 context,而 context 也被用来存储整个请求链路的公参信息,用户 uid、链路 traceID、特定的业务参数等。函数第一个参数类型设置为 context.Context 也是 Go 的默认写法,如果你对是否指定 ctx 作为函数的第一个入参,感觉到模棱两可,那就指定它吧。

2023-04-15 09:03:44 657 2

原创 supervisor使用

现在的服务器管理平台都做的很完善了,勾勾点点就把应用给重启了。获取更详细的内容,很多年之前,我还尝试登录每一台服务器,通过。

2023-04-11 23:43:19 164

原创 服务简单思考

业务发展到稳定阶段,工程团队应该从哪里找突破口?有人习惯的会用列举的方式来阐述问题,但列举要做到不重不漏需要下功夫,所以,大多列举的情况会补充三个字“其他等”。我们将工作拆分成了 4 个部分,近几年比较火的词语“降本增效”,拆开来是否有概念重合的嫌疑。

2023-04-06 08:25:45 158

原创 Uber H3 index 地图索引思考

H3 是 uber 设计的六边形空间索引,go 语言操作包是,可以通过经纬度获取所在的 h3 六边形边界,每个经纬度对应的六边形都是确定的,每个六边形唯一对应了一个 h3index。在业务开发中,我们可以通过 h3index 来对地理空间中的对象做聚合,本质还是将经纬度查询转换成了 h3index 的查询。

2023-03-25 13:24:32 6165 4

原创 服务预热问题思考

我主要使用 Go 语言做开发,Go 服务自身预热问题并不是特别严重,在部署服务前已经打包好了可执行脚本,预热问题更多是集中在服务依赖的中间件上。比如,服务启动后首次请求第三方服务,第三方可以是一个 HTTP 服务,也可以是底层存储等。Java 就比 Go 语言差点,它有一个 JVM 预热的过程,而预热就会导致业务被影响。所以,大家也给出了很多预热的解决方案。但处理问题的本质方向是基本一致的:通过控制请求分流的权重来使机器逐步预热。

2023-03-23 07:58:59 641

原创 Go 反射

对interface类型操作,如何对内部的值进行处理和分析。比如判断interface是否底层存储的是struct类型,以及该struct是否含有某个特定的Field值。interface类型包含两部分内容:dynamic type和dynamic value。当转换为interface类型后(操作是默认的),原类型下声明的方法,interface类型就无法再调用了。实际工作中,interface类型会接收任意类型的值,处理的过程很多都是通过reflect实现的。

2023-03-19 22:49:03 345

原创 快慢指针判断链表是否有环

链表中很经常会出现的一个问题,判断链表是否有环,标准答案也已经烂熟于心,设置快慢指针,快指针每次走2步,慢指针每次走1步,如果两个指针可以相遇的话,证明链表有环,反之无环。我有时候就犯嘀咕,它俩一定会相遇吗,难道就不存在一种可能,慢指针每次都被快指针跨过去,导致它俩始终不能相遇吗?然后,就在草稿上画图,确实是一定会相遇,再看看别人的总结,这个心魔总算是跨过去了。但时间一久,就又忘记原因了,周而复始,黯然神伤。也不是一个特别难的问题,难道就不能用一种简单的思维来思考它吗?

2023-03-12 11:30:47 483

原创 RoaringBitmap 借鉴思考

RoaringBitmap的借鉴思考

2023-03-10 07:54:21 529

原创 go 动态调整协程池

go协程和java线程对比

2023-03-09 07:56:45 672

原创 架构图参考指南

在跟别人阐述自己设计思路的时候,总是想一图胜千言,但自己画的图,很多模块摆放的位置总是很别扭,配色上也特别突兀,纠结文字说明标注在哪里比较合适…所以,我想把阅读中遇到的一些设计图,觉得不错的设计图,统统搬运到这。

2023-03-08 08:24:46 106

原创 sync map思考

sync map 作为解决 map 并发读写问题的补充,用法上其实不复杂,有些惋惜的是,不支持 len 统计数量的方法。map 并发读写算得上一个非常严重的问题,会导致服务宕机,为了避免 map 的并发读写,一种解决办法是直接使用类似 mutex 的加解锁方式,另一种就是使用 sync map 来替换。

2023-03-03 23:30:37 451

原创 go atomic 原子操作

atomic 包使用介绍

2023-02-24 08:01:13 798

原创 限流、熔断、降级反思

一直以来,对限流和降级都没有认真的重视过。上上家工作的时候,服务订单的 QPS 不到10,我记得当时节假日压测的峰值好像是 50 吧。再后来,面试的时候偶尔也会被问到这类的问题,但我觉得,当时对这个问题的回答都不够深刻,更多的是理解不到位。现在工作中,服务限流、降级、安全稳定性变成了硬性要求,反而让人觉得,限流和降级不值得议题。

2023-02-23 23:40:23 380

原创 go size class 内存分配思考

浏览到的,让我也有机会反思一下 go 内存管理。网络上,go 内存管理方面的介绍挺多的,面试的时候,偶尔也会被问到内存管理。而且,从 go1.15 到 go1.16 在 size class 上引入了新的内存块,能直观的看出来这种变化,也很有必要记录一下。

2023-02-19 17:31:02 833

原创 Go 数组和切片比较

切片的底层数据结构是数组,所以,切片是基于数组的上层封装,使用数组的场景,也完全可以使用切片。

2023-02-18 15:53:42 972

原创 go 命令行工具整理

这里会整理可能会使用到的命令行参数,比如 go build、go run,诸如此类。了解这些内容对我们工作会有什么帮助吗?更多的时候,是能让我们理解代码编译的意图,或者,给我们一种排查问题的手段。比方说,-race 属性,博客中也有说到这个属性,用来检测数据动态竞争。-test 属性,中也有用到这个属性,等等吧。

2023-02-12 16:55:42 775

原创 Go 泛型揣摩

在 go1.18 引入了泛型之后,为了不至于让人感觉:这个渣渣不假装对新事物不敢兴趣?我第一时间就去看了泛型的使用。但现在已经记不起来了,工作中经常使用的话,可能还会好一点,我们线上的版本是 go1.15,后来升级到了 go1.17,但还是和泛型隔了一个版本。

2023-02-10 08:42:17 586

原创 toml 格式文件解析

掌握 yaml 的解析,核心在于了解 yaml 的设计理念:**TOML is designed to map unambiguously to a hash table**。toml 被设计从无序的 hash 表结构,键值对的方式。键的类型是字符串,值得类型比较多样,可以是单值类型、数组、结构体

2023-02-05 10:51:32 4370

原创 goland 编译器扩展功能

选用 goland 作为 go 语言编辑工具,它集成了很多便捷的功能,辅助我们提高开发效率。我列举一下,感兴趣的可以评论扩展。

2023-02-05 09:10:00 1024

原创 lsof - list open file

lsof 指令全称 list open file

2023-02-04 11:34:29 472

原创 字符串压缩编码

gzip 是比较常见的压缩方式,web 服务中也经常开启 gzip 压缩。HTTP 传输的内容通过 gzip 压缩之后,也可以节省带宽,提高数据传输效率,缺点是要耗费些 CPU。这篇文章还会介绍其他的一些编码方式(pb、base64),从编码后内存占用、编码原理等来说一会。就好像评估一个算法的优劣一样,空间复杂度和时间复杂度不可兼得。通过 gzip 压缩后,降低了存储空间,但也引入了压缩和解压缩的性能开销。在深入 gzip 之前,我们先来拿捏一个软柿子:base64编码。

2023-02-04 10:57:23 1566

原创 https 证书使用

go 使用 https 协议,构建支持 https 协议的 go demo 服务,打印查看必要的连接信息

2023-01-31 08:23:00 1458

原创 go 语言 string 类型思考

string 作为 go 语言中的基础类型,其实有一些需要反复揣摩的,可能是我们使用的场景太简单,也可能是我们不需要那可怜的一点优化来提高性能,对它也就没那么上心了。

2023-01-25 15:20:32 1411

Geoserver+Beginners+Guide电子书

电子书,感觉非常有收藏价值,基于地理信息的web map,希望能从中了解很多东西。

2014-01-25

geoserver 样式(点,线,面)

用于geoserver样式的编辑,从代码中体会geoserver样式的书写规则,样式中通过filter类实现了样式的不同实现,将地图的表现更加的丰富

2014-03-16

隐藏Console窗口无效(续1)代码

隐藏Console窗口无效(续1)的代码包

2014-10-20

VC++进程注入

跟博客的代码一致,附加的door.dll的工程

2014-10-19

空空如也

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

TA关注的人

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