跳到主要内容

《go语言趣学指南》学习笔记

· 阅读需 6 分钟

命令式编程

格式化输出

  • %v :默认格式打印
  • %b :以二进制格式打印整数
  • %f :浮点数打印。%05.2f 表示宽度为5,精度为2,前面补0。
  • %c :打印Unicode字符
  • %s :以字符串打印
  • %[1]v :以默认格式打印第1个参数。参数索引以1开始。

循环和分支

// if语句
if 条件1 {
} else if 条件2 {
} else {
}

// switch语句
switch 变量 {
case1: 表达式1
case2: 表达式2
default: 表达式3
// switch语句不需要加break,默认不执行下一分支的代码
// 如果要执行下一分支的代码,使用 fallthrough 关键字

// 循环
for 条件 {
}
for i := 0; i < 10; i++ {
}

缓存的常见套路

· 阅读需 18 分钟

缓存的几种模式

在高并发场景下,缓存在数据库前面挡住了大量的查询流量,减轻了数据库的压力。对于缓存的更新,通常有以下几种模式:

模式优点缺点
Cache Aside1. 实现简单1. 需要调用方维护缓存和数据库的更新逻
2. 代码侵入性大
Read/Write Through1. 引入缓存管理组件,缓存和数据库的维护对应用方是透明的
2. 应用代码侵入性小,逻辑清洗
1. 引入缓存管理组件,实现复杂
Write Behind Caching1. 读写直接与缓存打交道,异步批量更新数据库,性能最好
2. 缓存和数据库的维护对应用方是透明的
1. 实现最复杂
2. 存在数据丢失风险
3. 一致性最弱

Cache Aside Pattern

这种模式应用最为广泛,其逻辑如下:

  • 读过程:先读缓存,若命中则返回;否则从数据库中查询数据,写入缓存并返回
  • 写过程:先更新数据库,然后让缓存失效

谷歌Guava限流器的设计与实现

· 阅读需 7 分钟

介绍

谷歌Guava工具包提供了一个单机限流工具,它基于令牌桶算法实现,主要被用于限制访问资源的速度。

Guava限流器的简单使用例子:

// 每秒2个令牌
RateLimiter rateLimiter = RateLimiter.create(2);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSS");
TimeUnit.SECONDS.sleep(1);
for (int i = 0; i < 10; i++) {
// 阻塞式获取1个令牌
rateLimiter.acquire(1);
System.out.println(LocalDateTime.now().format(dateTimeFormatter));
}

其输出如下:

23:49:48.131
23:49:48.132
23:49:48.132
23:49:48.628
23:49:49.127
23:49:49.627
23:49:50.128
23:49:50.628
23:49:51.128
23:49:51.627

安卓通过Magisk修补镜像刷入root

· 阅读需 3 分钟

前言

之前是找别人打包好的TWRP刷机镜像来root安卓手机的,不同机型不同系统的TWRP刷机镜像不一样,找起来很麻烦,还不一定能找到合适的TWRP刷机镜像。不过,后来发现其实使用Magisk修补镜像也能刷入root,现分享步骤如下。

步骤

首先需要下载Magisk:Releases · topjohnwu/Magisk

安装Magisk然后打开:

image

一文了解布隆过滤器

· 阅读需 5 分钟

前言

判断某个元素是否在一个集合中在日常开发工作中十分常见,如判断用户是否重复注册、避免伪造不存在的记录导致缓存穿透、判断用户是否参加过某活动等。最直观的做法是使用HashSet,底层使用哈希表,但是哈希表在元素数量很大时需要占用非常大的空间。

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于判断一个元素一定不在某个集合中,以及一个元素可能在某个集合中,对于存在性它有一定的误判率。它的优点是空间效率和查询时间都远远超过一般的算法。

工作原理

image