我们今天讲一下持久化和缓存

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);

在生成短链接时,我们会执行以下流程:

  1. 生成 shortCode(短码)
  2. 将(shortCode → longUrl)写入数据库
  3. 将 shortCode 写入布隆过滤器
  4. 写入 Redis
  5. 写入本地缓存(Caffeine)

布隆过滤器(Bloom Filter)

底层是一个二进制数组的bitmap,配合hash函数使用的,会生成k个映射,判断根据bitmap的o(1)时间查找k个映射是否都为1

布隆过滤器的核心作用是:

快速判断一个 shortCode 是否“可能存在”

它的特点:

  • 不存储真实数据
  • 空间极小
  • 查询极快(O(1))
  • 存在一定误判率(不会漏判,只会误判)

本地缓存(Caffeine)

本地缓存位于 JVM 内部,是最快的一层缓存。

特点:

  • 不走网络
  • 纳秒~微秒级访问
  • 适合热点数据

作用:

  • 缓解 Redis 压力
  • 提升热点短链访问速度

这个设计的核心思想是:

用布隆过滤器挡掉“无效请求”,用本地缓存 + Redis 扛住“高并发请求”,最后用数据库保证“数据可靠性”。

它本质是一个典型的:

多级缓存 + 读优化 + 防穿透架构

后续我们再讲防爬虫以及kafka的作用

 

 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐