计数器系统设计方案对比
点赞数、阅读量、粉丝数——这些计数器是社交系统的血液。如何设计一个高性能、高可靠的计数器系统? 一、计数器的业务场景 1.1 点赞数——每次点赞 +1 1.2 阅读量——每次访问 +1(去重?) 1.3 粉丝数——关注/取关 +1/-1 1.4 业务特点——写多读少,允许一定延迟 二、MySQL 自增的局限 2.1 热行竞争——行锁成为瓶颈 2.2 UPDATE 的 TPS 上限 三、Redis Hash 方案 3.1 一个 Hash 存储多条记录的计数——HINCRBY counter:post:{id} likes 1 3.2 优点——内存操作、原子性 3...
缓存击穿穿透雪崩处理方案
面试必问的”缓存三兄弟”——击穿、穿透、雪崩。本文将三者放在同一场景下,给出从识别到解决的完整方案。 一、三种问题的定义与区别 1.1 缓存穿透——查询不存在的数据,缓存和数据库都没有 1.2 缓存击穿——热点 key 过期,大量请求打到数据库 1.3 缓存雪崩——大量 key 同时过期或 Redis 宕机 1.4 一张图区分三种场景 二、缓存穿透的解决方案 2.1 布隆过滤器——原理与实现 2.2 布隆过滤器在 Redis 中的应用——RedisBloom 模块 2.3 Guava BloomFilter 的本地实现 2.4 缓存空值——简单但有局限性 2.5 参数校验——在网关...
Redis 分布式锁实现方案
从最简单的 SETNX 到 Redisson 的看门狗机制,再到 RedLock 算法,分布式锁的演进中包含了多少并发安全的设计思想。 一、分布式锁的核心要求 1.1 互斥性——同一时刻只有一个客户端持有锁 1.2 防死锁——锁的持有者崩溃后锁能被释放 1.3 解铃还须系铃人——谁加的锁只能谁来解 1.4 可重入性——同一客户端可重复获取 二、V1:SETNX + EXPIRE 的原子性问题 2.1 SETNX key value + EXPIRE key ttl——两步不是原子的 2.2 在 SETNX 和 EXPIRE 之间崩溃 → 死锁 2.3 Redis 2.6.12 之前...
Redis String 类型详解
Redis 的 String 类型能存数字、能存 JSON、能存二进制,底层到底用了什么数据结构?其他类型的内部编码又是什么? 一、RedisObject——一切数据的基础 1.1 type——对外暴露的类型(String/List/Hash/Set/ZSet) 1.2 encoding——内部编码(int/embstr/raw/ziplist/skiplist 等) 1.3 ptr——指向实际数据的指针 1.4 refcount——引用计数,用于共享对象 二、String 的三种内部编码 2.1 in...