- Fri Jul 25 2025
JavaScript 中必须用分号的场景
考虑以下代码: 在 REPL 环境中执行这段代码,由于严格按行执行,所以不会报错,能正常运行。但是,如果作为一个文件执行,则会报错: 在这个例子中,报错信息直接指出了原因所在,不过在其他情况下报错信息不一定如此直观。报错原因如下: 1. console.log("hello") 的下一行跟随着一个括号。 2. 这附近的代码被…
- Fri Jul 18 2025
Bloom 过滤器学习笔记
Bloom 过滤器是一种概率性数据结构,用于以较大的把握判断某一个元素是否在集合中。若 Bloom 过滤器认为某一个元素在集合中,则此元素小概率不在集合中,即可能存在假阳性;若 Bloom 过滤认为某一个元素不在集合中,则此元素一定不在集合中,即不存在假阴性。常见的应用场景有:判断用户名是否被占用、判断银行卡是否已挂失、判断…
- Thu Jul 17 2025
HyperLogLog 学习笔记
HyperLogLog 是一种具有不确定性(模糊数学)的数据结构,用于估计某个集合的基数。例如:某公司需要统计旗下多个产品的 MAU(月活跃用户数)等众多运营指标,但是不希望这些数据占用过多的空间,同时可以容忍很小范围内的统计误差,则可以考虑使用 Redis 中的 HyperLogLog。在 Redis 的实现中,Hyper…
-
Highly Concurrent System Design Note
* Scaling: Increase computing power. * Caching: Add layers to the storage hierarchy. * Asynchronous patterns: Don't wait; just subscribe and publish. * Scale up (v…
-
从 OAuth 的角度探讨 PKCE 的本质
在 OAuth 2.1 标准中,Authorization Code(授权代码)流程涉及一些不太符合直觉的步骤和要求,其中就包括了 PKCE(RFC 7636)。虽然 PKCE 对于增强安全性的作用非常显然,但是为什么要这样实现,这种机制的本质原理和解决的底层问题是什么呢?笔者将尝试在这篇短文中谈一下自己的理解。 首先,抛开…
- Fri Jun 13 2025
利用 Redis 实现滑动窗口计数器速率限制
最近由于一些个人的项目需求,稍微研究了一下速率限制算法。常见的速率限制算法包括:漏水桶、代币桶、固定窗口日志、滑动窗口日志、滑动窗口计数器等(此外,还有一些利用指数退避增加惩罚时间的算法,不在本文的讨论范围之内)。这几种算法中,代币桶的性能开销最小,且允许猝发请求。不过在实际场景中,有时需要利用滑动窗口策略以保证最大的公平性…