| 字数
518
1 DB 回档操作 1.1 mysqldump 备份表数据(不包含建表语句) 1 2 3 4 5 6 7 mysqldump -h10.10.10.10 -P15192 -uroot -pPassword \ --single-transaction \ --default-character-set=utf8 \ --no-create-info \ --skip-disable-keys \ --skip-add-locks \ [database name] [table name1] [table name2] > [dump file] 1.2 恢复数据 执行以下命令前一定要清理原有的数据,要不然会报唯一键冲突的 导入数据之前,最好将线上的表备份一下,然后 delete 清空原表; 最后进行导入,否则原数据不清理,导入的时候会报唯一健冲突。 方式一: 1 #mysql -h10.10.10.10 -P15192 -uroot -pPassword [database name] < [dump file] 方式二: 登陆mysql 然后执行source命令 1 2 3 #mysql -h10.10.10.10 -P15192 -uroot -pPassword > use db_name > source [dump file] 总结……
阅读全文
| 字数
3121
Preface OpenTelemetry 是一个可观测性工具,通过标准化的 API 和 SDK,提供了跨语言、跨平台的分布式追踪、日志和指标收集和分析能力。OpenTelemetry 的目标是让开发者更容易地维护和监测他们的应用程序。 本文将介绍 OpenTelemetry 的一些基本概念和用法,帮助读者快速入门。 1. 安装 OpenTelemetry 首先,需要安装 OpenTelemetry 的 SDK。这里以 Golang 为例,介绍如何安装 OpenTelemetry Go SDK。 1 go get go.opentelemetry.io/otel 通过运行上述命令,可以下载并安装 OpenTelemetry Go SDK。 2. 配置 OpenTelemetry Collector OpenTelemetry Collector 是一个数据收集器,它可以收集不同类型的数据并发送到指定的目的地。在使用 OpenTelemetry 进行分布式追踪时,通常需要将追踪数据发送到 Zipkin 或 Jaeger 等追踪……
阅读全文
| 字数
708
Preface
这个世界上优雅的东西很少,递归至少算一个。tree 和 single list 的数据结构,是非常适合使用递归来操作的。下面我们使用 Go 来做几道题,感受一下递归的魅力。
……
阅读全文
| 字数
1226
1 缘起 在业务开发场景中,主要用到两个开发能力:接口粘合+缓存。 一个好的缓存设计,能够降低服务的时延,抵抗流量洪峰。 比如最近的西安健康码事件,明显缓存设计上是存在明显问题的 :-)。 2 什么场景需要加缓存? 提高服务质量,降低时延; 减少对下游的请求量,节省资源 3 缓存常见问题 缓存问题 解决办法 (1) 缓存失效的策略 惰性过期(读取时判断如果过期了,就返回且异步更新) (2) 缓存集中失效 设置随机过期时间 (3) 缓存击穿(大量穿透导致雪崩) singleflight 合并多个相同的请求 3.1 50行代码,实现一个可用的 singleflight? groupCache 库实现了一个可用……
阅读全文
| 字数
362
简介 我们经常有深度比较两个 Object 是否相等的场景,比如: 1 如服务重构,新旧服务回包对比; 2 单测验证实际的返回值,标准库提供了 reflect.DeepEqual; 但是相对的,reflect.DeepEqual不够灵活,无法提供选项实现我们想要的行为,例如允许浮点数误差。所以今天的主角 go-cmp 登场了。 go-cmp 是 Google 开源的比较库,它提供了丰富的选项。最初定位是用在测试中。 1 快速使用 先安装: go get -u github.com/google/go-cmp/cmp Equal Diff 总结 go-cmp 非常适合对两个同类型的值进行比较。源码中大量使用熟知的 Option 模式,提供给使用者简洁、一致的接口。这种设计思想也值得我们学……
阅读全文
| 字数
270
常见问题 1 如何调整依赖的系统版本macOS Deployment Target? A: 双击编辑器的项目名,然后调整。 ctrl+b 编译 2 Debug Or Release 编译? 选择 Product->Scheme->Edit Scheme,将编译配置改为 Release。 3 编译后,输出的App路径? 输出目录:~/Library/Developer/Xcode/DerivedData + 项目名。 比如: ~/Library/Developer/Xcode/DerivedData/Hidden_Bar-xxxx/Build/Products/Debug……
阅读全文
| 字数
1199
1 Preface
在社交 APP 中,经常会看到用户标签功能,那么这个功能如何实现呢? 如微信的用户标签。
考虑两种情况:
- 标签的量级较大,我们需要基于 ES 来加速查询;
- 标签量级较小,可以使用数据库实现一个简易版的标签功能;
下面我们使用数据库,实现一个简易的标签功能;
……
阅读全文
| 字数
1554
1 Preface protobuf 提供了 oneof 语义,表示任选其一;类似于C语言的 union 关键字。 于是想了解下 oneof 语义在 golang 中是如何实现的,下面我们来一探究竟。 具体的用法如下: 1 2 3 4 5 6 7 8 9 10 11 message WechatPay { int64 uuid = 1; } message HelloRequest { string msg = 1; oneof one_of_pay { string noop = 2; WechatPay wx = 3; } } 2 stub 代码分析 使用 protoc 工具会生成如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 定义一个接口,用于类型断言 type isHelloRequest_OneOfPay interface { isHelloRequest_OneOfPay() } type HelloRequest_Noop struct { Noop string `protobuf:"bytes,2,opt,name=noop,proto3,oneof"` } type HelloRequest_Wx struct { Wx *WechatPay `protobuf:"bytes,3,opt,name=wx,proto3,oneof"` } // 接口实现 empty // implements isHelloRequest_OneOfPay interface func (*HelloRequest_Noop) isHelloRequest_OneOfPay() {} // 接口实现 empty // implements isHelloRequest_OneOfPay interface func (*HelloRequest_Wx) isHelloRequest_OneOfPay() {} 3 总结 在 Golang 中, oneof 语义基于一个类型接口,oneof 的每个成员都实现这个接口,方便在Ge……
阅读全文
| 字数
1138
1 Preface 最近在一直采用 go 语言进行项目开发,遇到一个比较有意思的问题: 多个集合,计算交集,哪种计算方法最高效? 假定集合采用 HashMap 来实现,那么每次查询的时间复杂度为 O(1) 考虑最简单的情况,假定有2个集合A和B,A 的元素个数为2, B 的元素个数为10。 计算A和B的交集有 2 个方案: 方案一:先遍历A,在B中查找是否存在,时间复杂度为 2*O(1) 方案二:时间复杂度为 10*O(1) 于是得出结论: 每次遍历最小的集合去计算交集,总的时间复杂度最小。 2 寻找已有的轮子 由于 go 标准库,并不提供 set 数据结构;先尝试用 google 搜索,fatih/set 出镜率比较高。 于是……
阅读全文