- 博客(936)
- 资源 (9)
- 问答 (41)
- 收藏
- 关注
原创 Golang 字面量的表示
在 Go 语言中,字面量是用来表示固定值的表达式。Go 支持几种类型的字面量,包括整型、浮点型、字符串、字符、布尔值以及复合类型(如数组、切片、结构体、映射等)。下面我将介绍一些在 Go 语言中使用字面量的常见技巧和最佳实践。
2024-08-30 16:06:12
360
原创 Gopher 必知的时间知识
时间包括时间值和时区,没有包含时区信息的时间是不完整、有歧义的。在与外部系统传递或解析时间时,应尽量采用无时区歧义的标准格式,如 HTTP 协议的时间格式或 Unix 时间戳。避免使用不包含时区信息的非标准时间格式(如 yyyy-mm-dd HH:MM:SS),因为这类格式在解析时可能会依赖默认的环境设置(如系统时区或数据库时区),从而引发潜在的问题。
2024-08-25 21:21:44
974
原创 微服务设计原则——高性能
对于查询 API 来说,当查询结果集包含成千上万条记录时,返回所有结果是一个挑战,它给服务器、客户端和网络带来了不必要的压力,于是便有了分页接口。在设计分页接口时,页大小需要设置上限。这是因为如果没有上限,客户端可以请求任意大的页大小,从而可能导致服务器性能问题,例如一次请求返回过多数据,导致服务器响应变慢,网络传输时间变长,甚至可能引起系统崩溃等问题。为了防止这种情况的发生,通常会在设计分页接口时设置一个最大页大小限制。
2024-08-24 15:47:43
260
原创 微服务设计原则——高性能:批量
假设一个用户一次传 1w 个id进来,那么接口可能需要很长的时间才能处理完,这往往会导致超时,用户怎么调用结果都是超时异常,那怎么办?限制长度,比如限制长度为 100,即每次最多只能传 100 个id,这样就能避免长时间执行,如果用户传的 id 列表长度超过 100 就报异常。接口,那么使用方如果要一次性获取 20 个数据,它就需要循环遍历调用我们接口 20 次,不仅使用方性能很差,也无端增加了我们服务的压力,这时提供一个批量拉取的接口。对于批量接口,我们也要注意接口的吞吐能力,避免长时间执行。
2024-08-18 19:51:48
395
原创 微服务设计原则——高性能:零拷贝
在微服务架构中,零拷贝技术能够显著提升性能,尤其是在数据传输和处理方面。通过减少内存中的数据复制操作,零拷贝能够提高系统的吞吐量、减少延迟和降低资源消耗。
2024-08-18 19:28:36
724
原创 微服务设计原则——高性能:存储设计
任何一个系统,从单机到分布式,从前端到后台,功能和逻辑各不相同,但干的只有两件事:读和写。而每个系统的业务特性可能都不一样,有的侧重读、有的侧重写,有的两者兼备,本节主要探讨在不同业务场景下存储读写的一些方法论。
2024-08-18 19:06:38
1216
3
原创 微服务设计原则——高性能:池化
惰性初始化是真正有需要的时候再去创建,这种方式可能有助于减少资源占用,但是如果面对突发的任务请求,然后瞬间去创建一堆连接,可能会造成系统响应慢或者响应失败,通常我们会采用启动即初始化的方式。每次都在请求中去创建这些资源,会增加处理耗时,但是如果我们用一个 容器(池) 把它们保存起来,下次需要的时候,直接拿出来使用,避免重复创建和销毁浪费的时间。对于分类,可以分为核心和非核心,核心线程池一直存在不会被回收,非核心可能对空闲一段时间后的线程进行回收,从而节省系统资源,等需要时在按需创建放入池子中。
2024-08-18 18:55:33
1179
原创 微服务设计原则——高性能:异步与并发
比如腾讯的移动连通服务维纳斯(WNS,Wireless Network Service)的跑马模块其实就是这种机制,跑马模块为了快速建立长连接同时向后台多个 IP/Port 发起请求,谁快就用谁,这在弱网的移动设备上特别有用,如果使用等待超时再重试的机制,无疑将大大增加用户的等待时间。异步(Asynchronous)是一种编程模型或执行方式,在这种方式中,任务的启动和完成不是同步的,也就是说,程序不会在等待任务完成时阻塞,而是可以继续执行其他操作。在微服务架构中,异步处理可以显著提高系统的性能和扩展性。
2024-08-18 18:03:22
1199
原创 getopt(1) command
getopt 是一个广泛使用的命令行工具,用于解析复杂的命令行选项。它提供了一种标准化的方式来处理短选项和长选项,以及选项的参数,使得编写和维护命令行工具变得更加容易。注意,与 getopt 类似的一个命令getopts是 Shell 内建命令,其功能没有 getopt 强大,只支持短选项,不能解析长选项。
2024-08-04 20:13:05
813
原创 微服务设计原则——易维护
不是随便一个功能就要有个接口。虽然一个接口应该只专注一件事,但并不是每一个功能都要新建一个接口。要有充分的理由和考虑,即这个接口的存在是十分有意义和价值的。无意义的接口不仅浪费开发人力,更增加了服务的维护难度,服务将会十分臃肿。相关功能我们应该考虑合为一个接口来实现。
2024-08-04 10:18:02
700
原创 认识 Glob Patterns
在计算机编程中,Glob Patterns(通配符模式)是一种用于文件路径匹配的表达式,它利用通配符字符来匹配一组文件或目录。注意,Glob Patterns 不是一个统一的标准,而是一个在不同系统和工具中常见的模式匹配方式。虽然它们的基本概念相似,但具体实现和支持的特性可能会有所不同。本文将介绍常见的通配符模式。
2024-07-21 22:56:42
1006
原创 配置文件格式 INI 快速上手
INI 的全称是 Initialization,即为初始化文件,是 Windows 系统配置文件所采用的存储格式。有时候,INI 文件也会以不同的扩展名出现,如“.cfg”、“.conf”、或“.txt”。但为了可读性,不建议这么做。因为 INI 并没有一个统一的标准,所以这里介绍常用的 INI 格式内容。
2024-07-21 11:39:25
1009
原创 配置文件格式 JSON 快速上手
JSON(JavaScript Object Notation) 是轻量级的文本数据交换格式,独立于语言,具有自我描述性。JSON 类似于 XML,但比 XML 更小、更快,更易解析。
2024-07-20 18:53:12
450
原创 配置文件格式 XML 快速上手
XML(Extensible Markup Language)是可扩展标记语言,用来传输和存储数据。因为其允许用户自定义标记名称,具有自我描述性,可灵活地用于存储服务配置信息。
2024-07-20 18:29:33
859
原创 必知的经济周期
熊彼特在分析经济周期时,区分了不同长度的周期,包括朱格拉周期(中期周期)、基钦周期(短期周期,约3到5年),以及更长的康波周期(约50到60年)。基钦周期也叫库存周期,基钦根据美国和英国1890年到1922年的利率、物价、生产和就业等统计资料,从厂商生产过多时就会形成存货、从而减少生产的现象出发,把这种 3-5 年的短期调整称为“存货”周期,在 40 个月中出现了有规则的上下波动。朱格拉认为商业周期的波动与信贷周期有很大的关联,因为信贷的扩张和紧缩可以影响企业的投资决策和经济的总需求。
2024-07-20 18:15:05
667
原创 代码注释中的常见标记
在代码注释中,FIXME 是一个常见的标记,用来指出代码中的一个问题需要被修复或需进一步的工作。它是一个约定俗成的标志,意味着开发者注意到了代码的某个部分可能不正确、不完整或存在潜在的错误,但在当前时刻可能没有时间或资源去解决它。FIXME 类似于其他代码注释标记,如 TODO (表示还有工作要做)或 NOTE(用来强调或解释代码的某个方面),但 FIXME 更具有紧迫性,通常表示代码中存在更严重的问题或错误。通常用来标记未来需要添加或修改的功能。代码存在已知的错误,但需要更多的调查或复杂的修复。
2024-07-18 15:08:42
324
原创 微服务设计原则——高性能:锁
上图的模式可以改成串行无锁的形式,当 MainReactor accept 一个新连接之后从众多的 SubReactor 选取一个进行注册,通过创建一个 Queue 与 I/O 线程进行绑定,此后该连接的读写都在同一个队列和线程中执行,无需对队列加锁。可以预见的是,随着分片粒度地变小,性能差距会越来越大。利用硬件支持的原子操作可以实现无锁的数据结构,很多语言都提供CAS原子操作(如 Go 中的 atomic 包和 C++11 中的 atomic 库),可以用于实现无锁数据结构,如无锁链表。
2024-07-17 21:26:55
940
原创 git config
安装完 Git 后,需要对 Git 环境进行一次配置,且只需要配置一次。程序升级时会保留配置信息。你可以在任何时候再次通过运行命令来修改它们。Git 自带一个 git config 的工具来设置控制 Git 外观和行为的配置变量,这些变量按照不同的作用级别默认存储在四个不同的文件中。可以使用 --file 选项来显示指明配置文件的路径。文件路径级别说明系统级别包含系统上每一个用户及他们仓库的通用配置。如果使用带有 --system 选项 Git 会读写此文件用户级别针对当前用户。
2024-07-17 00:31:09
865
原创 RabbitMQ 迁移
如果您只需要导出和导入RabbitMQ的定义(如vhost、exchange、queue等),可以使用RabbitMQ的 HTTP API。
2024-07-08 09:30:41
803
原创 Go 编码建议——安全篇
进行指针操作时,必须判断该指针是否为 nil,防止程序 panic,尤其在进行结构体Unmarshal 时。在对 slice 进行操作时,必须判断长度是否合法,防止程序 panic。
2024-06-23 22:33:00
575
原创 配置文件格式 YAML 快速上手
(YAML Ain’t a Markup Language)是专门用来写配置文件的语言,简洁强大,相比于 JSON 和 XML,更加便于开发人员读写。YAML 配置文件后缀为.yml 或 .yaml。
2024-06-16 21:47:02
919
原创 git diff
git diff 主要用于查看文件之间的区别。工作区(Working Directory)与暂存区(Stage/Index)。工作区与版本库(Repository)。暂存区与版本库。版本库与版本库的不同版本。不同分支。磁盘上两个文件。本地分支与远端分支。
2024-06-16 21:29:41
546
原创 认识 DECIMAL 类型
为保证小数精度不丢失,数据库表使用 DECIMAL 类型,服务代码中使用,比如 Golang 第三方库 https://github.com/shopspring/decimal。接口协议可以使用 string 表示。各类语言及数据库一般都提供了DECIMAL 类型的支持,一般是以一个 struct 来表示一个 DECIMAL 类型。DECIMAL 类型另外一个作用就是可以存储非常大的数字,并且在计算时不会出现精度损失。从 DB 存储,服务数据计算与前端接口返回,全链路保证小数精度不会丢失。
2024-05-28 17:26:36
510
原创 Hive 变量定义与引用
通过定义变量并在查询中引用变量,可以使查询语句更加简洁和易读。如果需要修改常量或固定值,只需要修改变量的值即可,而不需要修改所有引用该常量或固定值的查询语句。例如,可以将一些常用的查询条件或参数定义为变量,并在多个查询中引用这些变量,从而避免重复编写相同的查询语句。例如,可以将一些参数定义为变量,并在运行时动态修改这些参数的值,从而使查询语句具有更高的适应性和可配置性。总之,自定义变量和引用变量是一种良好的编程习惯,可以使查询语句更加简洁、易读、易于维护和重用,并提高查询语句的灵活性和可配置性。
2024-05-24 17:26:47
960
原创 Hive 与 SQL 标准和主流 SQL DB 的语法区别
Hive是一种基于Hadoop的数据仓库软件,可以将结构化数据文件映射为一张数据库表,并提供了类SQL查询接口,使得用户可以使用SQL类语言来查询数据。Hive可以处理包括文本、CSV、JSON、ORC和Parquet等格式的数据文件,支持数据的导入、导出、转换等操作。Hive可以在Hadoop集群上运行,利用Hadoop的分布式计算能力,可以处理大规模的数据集。
2024-05-11 23:36:40
1421
3
原创 MySQL COUNT(*) COUNT(1) 与 COUNT(列) 的区别
那么,InnoDB 循环遍历聚簇索引(主键索引),将读取到的记录返回给 server 层,但是不会读取记录中的任何字段的值,因为 COUNT 函数的参数是 1,不是字段,所以不需要读取记录中的字段值。如果表里只有主键索引,没有二级索引时,那么,InnoDB 循环遍历聚簇索引,将读取到的记录返回给 server 层,然后读取记录中的 id 值,就会 id 值判断是否为 NULL,如果不为 NULL(主键不能为 NULL),就将 count 变量加 1。最后将 count 变量的值发送给客户端。
2024-05-08 21:49:14
1051
原创 Hive 表定义主键约束
在 Hive 中,可以使用 PRIMARY KEY 子句来定义主键约束,以确保表中的每行数据都具有唯一标识。如果一个约束指定 RELY,也就是希望 HIVE 基于代价的优化器 CBO(Cost-Based Optimizer)使用约束信息来获得更好的统计信息,得到更好的执行计划。具体到主键约束,一般主键常用于多表关联查询,利用主键约束,可以删除不必要的连接( JOIN ELIMINATION),得到更好的执行计划。对于唯一约束,目前 Hive 是不支持的,但是其他一些约束是支持的。
2024-04-29 11:58:44
1061
3
原创 go get command
将依赖项添加到当前模块并安装它们。go get 干了三件事:一是更新 go.mod 文件将指定包及其版本加入其中。二是下载包源码至模块缓存(三是安装包,生成二进制程序至GOPATH/bin(从 Go 1.17 版本开始,为了更加符合其语义,该功能被废弃,改用go install如果包中不包含可执行文件,则不会执行第三步,即 go get 操作成功后 GOPATH/bin 目录下不会有任何编译好的二进制文件。
2024-04-23 10:33:00
399
原创 配置文件格式 TOML 快速上手
GitHub 联合创始人 Tom Preston-Werner 觉得 YAML 不够简洁优雅,如缩进要严格对齐,因此和其他几位开发者一起捣鼓了一个 TOML(Tom’s Obvious Minimal Language)。TOML 旨在成为一个语义显著且易于阅读的极简配置文件格式,能够无歧义地转化为哈希表,且能够简单解析成编程语言中形形色色的数据结构,用于取代 YAML 和 JSON。TOML 的基本语法规则如下:TOML 文档最基本的构成区块是键/值对。值必须是这些类型:字符串,整数,浮点数,布尔值,日
2024-04-18 20:56:28
2834
4
原创 go env
go env 用于查看和设置 Go 环境变量。默认情况下 go env 输出格式为 Shell 脚本格式(如 Windows 上是 batch 文件格式)。如果指定变量名称,则只输出变量的值。
2024-03-27 11:21:38
1680
1
原创 微服务设计原则——低风险
XSS(Cross Site Scripting)名为跨站脚本攻击,因其缩写会与层叠样式表(Cascading Style Sheets,CSS)混淆,故将其缩写为 XSS。XSS 漏洞是 Web 安全中最为常见的漏洞,通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页中,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript,但实际上也可以包括 Java、 VBScript、ActiveX、 Flash,甚至是普通的 HTML。
2024-03-26 12:57:29
1368
1
原创 微服务设计原则——高可用
,这些都是糟糕的建议。如果第三方接口响应时间都是 50ms 左右,那么线程都能很快处理完自己手中的活,并接着处理下一个请求,但不幸的是如果有一定比例的第三方接口响应时间为 2s,那么最后这 50 个线程都将被拖住,队列将会堆积大量请求,从而拖垮整服务。举个最简单的例子,那就是支付,用户购买商品后支付,支付扣款成功,但是返回结果时网络异常(超时成功),此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。
2024-03-24 00:48:15
872
原创 男女比例面试问题
我国 2020 年展开的第七次全国人口普查公报显示,以女性为100,男性对女性的比例为105.07,中国男性比女性多 3490 万人。这是一道经典的概率问题,经常出现在各大公司(Google,Tencent,Alibaba 等)的面试环节。在一个重男轻女的国家里,每个家庭都想生男孩,如果他们生的孩子是女孩,就再生一个,直到生下的是男孩为止。第二年,上年生了女的家庭再生一次,一半生男,一半生女。第三年,上年生了女的家庭再生一次,一半生男,一半生女。第四年,上年生了女的家庭再生一次,一半生男,一半生女。
2024-03-21 11:28:30
338
原创 字符串的排列(LeetCode 567)
注意,因为字符仅包含 26 个小写字母,所以统计字符个数可以使用一个长度为 26 的数组,数组下标与 26 个小写字母一一对应。由于排列不会改变字符串中每个字符的个数,所以只有当两个字符串每个字符的个数均相等时,一个字符串才是另一个字符串的排列。根据这一性质,统计 s1 的字符个数,然后使用滑动串口遍历 s2,统计串口内字符个数是否需 s1 的相等。O(Σ),其中 Σ 是字符集字符数,这道题中的字符集是小写字母,所以 Σ 为 26。如果相等,那么 s2 包含 s1 的排列之一,返回 true。
2024-03-15 19:41:09
321
原创 微服务设计原则——高性能:缓存
(2)布隆过滤器:采用布隆过滤器将,将所有可能存在的数据哈希到一个足够大的 Bitmap 中,一个一定不存在的数据会被这个 Bitmap 拦截掉,从而避免了对底层数据库的查询压力。“劲酒虽好,不要贪杯”,使用缓存的目的是为了提高性价比,而不是一上来就为了所谓的提高性能不计成本的使用缓存,而是要看场景。缓存的数据集中在一台机器上,如共享内存。Size-based Eviction 策略通常适用于对缓存空间有严格限制的场景,可以根据缓存空间的大小和数据的大小来灵活选择要淘汰的项目,以实现最佳的缓存效果。
2024-03-13 18:27:58
1160
原创 有效的正方形(LeetCode 593)
注意:判断过程中,不用计算出两点实际距离,只需要算出距离的平方即可。给定 2D 空间中四个点的坐标 p1, p2, p3 和 p4,如果这四个点构成一个正方形,则返回 true。如果三角形两个边相等,则为直角边。如果直角边的平方和等于另一条边的平方,那么可断定为等腰直角三角形。正方形可以将其拆分成四个等腰直角三角形,所以枚举由三个点构成的三角形是否时等腰直角三角形即可。即有一组邻边相等,并且有一个角是直角的平行四边形称为正方形。根据上面的特点,我们可以计算出任意两点之间的距离来判断是否是正方形。
2024-03-13 12:17:59
520
tinyxml2+示例代码+介绍文档
2015-09-26
HTML 如何设置图片宽高分别为原宽高的不同比例?
2020-08-22
Google C++编程风格指南中6.10节流中不支持字符串操作符重新排序 什么意思
2018-08-05
C++模板元编程和编写模板有什么区别?
2018-06-17
g++ -S将源码编译成汇编代码,使用的是哪个工具?
2018-06-11
从长度为n的数组中找出同时满足下面两个条件的所有元素,时间复杂度为O(n)。
2018-05-28
为什么C++局部数组变量地址间隔是16字节的倍数?
2018-05-17
缓冲溢出,为什么不报错?
2018-05-16
RLF、HRLF控制字符到底是什么
2018-05-10
printf关于浮点数的四舍五入的奇怪问题?
2018-05-09
stringstream的输入与输出的用法
2018-03-19
使用JS如何获取剪贴板内容
2018-03-06
Linux命名管道为什么叫FIFO?
2018-02-07
Linux下printf与wprintf不能同时使用?
2018-01-15
C标准库函数setvbuf的名称全称
2018-01-15
mysql count distinct 加条件
2017-06-15
awk如何获取除最后一行的所有行?
2017-05-19
rz命令如何上传文件夹
2017-05-07
CSS浮动为什么不会遮盖同级元素
2015-09-17
Linux下系统调用execl会等待一段时间才执行指定的可执行程序?
2015-09-11
为什么 Go range slice 时通过下标和值拷贝的性能是一样的?
2022-03-17
反向代理的上游服务指的是什么?
2021-03-12
Golang 接口类型可以有数据成员吗
2020-12-02
GoLand 如何自动批量换行
2020-10-07
Golang 如何进行标准错误输出
2019-12-24
git branch -dr origin/<branchname> 无法删除远端分支
2019-09-16
golang main包可以被import吗
2019-06-11
golang小数默认是float32还是float64?
2019-05-28
golang const 可以修饰函数形参吗
2019-05-28
ldconfig命令全称是什么呢?
2019-04-02
golang的struc成员后跟字符串有什么作用?
2019-03-15
Linux中 链接器 ld 命令的全称是什么英文单词?
2019-03-12
ssh命令默认端口如何查看
2019-02-15
ssh客户端为什么不指定端口也可以登录成功
2019-02-15
C/C++的预处理文件的后缀为什么约定为.i
2019-01-24
go为什么不能获取字符串某个字符地址?
2019-01-13
date命令将时间戳转为可读时间为什么需要加@符号
2018-12-06
GNU C++定义对象时对象名称被括号包围且前面有个下划线是什么意思
2018-10-09
git merge可以操作远端分支吗?
2018-08-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人