短链系统设计(三):数据库 + 布隆过滤器 + Redis + 本地缓存
·
我们今天讲一下持久化和缓存
mapper.insert(table, sl);
RBloomFilter<String> bf = redissonClient.getBloomFilter(Keys.bloomCode());
bf.add(code);
try {
int rttl = RandomUtil.jitterSeconds(props.getCache().getRedisTtlSeconds(), props.getCache().getJitterSeconds());
redisTemplate.opsForValue().set(Keys.codeCache(code), longUrl, rttl, TimeUnit.SECONDS);
} catch (Exception ignored) {
}
urlLocalCache.put(code, longUrl);
在生成短链接时,我们会执行以下流程:
- 生成 shortCode(短码)
- 将(shortCode → longUrl)写入数据库
- 将 shortCode 写入布隆过滤器
- 写入 Redis
- 写入本地缓存(Caffeine)
布隆过滤器(Bloom Filter)
底层是一个二进制数组的bitmap,配合hash函数使用的,会生成k个映射,判断根据bitmap的o(1)时间查找k个映射是否都为1
布隆过滤器的核心作用是:
快速判断一个 shortCode 是否“可能存在”
它的特点:
- 不存储真实数据
- 空间极小
- 查询极快(O(1))
- 存在一定误判率(不会漏判,只会误判)
本地缓存(Caffeine)
本地缓存位于 JVM 内部,是最快的一层缓存。
特点:
- 不走网络
- 纳秒~微秒级访问
- 适合热点数据
作用:
- 缓解 Redis 压力
- 提升热点短链访问速度
这个设计的核心思想是:
用布隆过滤器挡掉“无效请求”,用本地缓存 + Redis 扛住“高并发请求”,最后用数据库保证“数据可靠性”。
它本质是一个典型的:
多级缓存 + 读优化 + 防穿透架构
后续我们再讲防爬虫以及kafka的作用
更多推荐

所有评论(0)