5、Redis 缓存设计相关知识点

1. 多级缓存架构

多级缓存架构是一种通过在应用层和数据库层之间添加多个缓存层来提高系统性能和可用性的架构设计。这种设计能够有效减少数据库负载,并提高数据访问速度。常见的多级缓存包括本地缓存、分布式缓存和数据库缓存。

  • 本地缓存:本地缓存位于应用服务器本地,响应速度最快,但容易出现缓存不一致问题。适用于频繁访问且变动较小的数据,如配置文件和常量数据。本地缓存可以使用如Ehcache、Guava Cache等实现。
  • 分布式缓存:分布式缓存如Redis和Memcached,适用于需要跨多个服务器共享的缓存数据。它们具有高可用性和可扩展性,能够支持大量并发访问。分布式缓存通过数据分片和复制机制确保数据的高可用性。
  • 数据库缓存:一些数据库如MySQL和PostgreSQL内置缓存机制,用于减少磁盘I/O,提高查询效率。数据库缓存适用于需要频繁查询且数据变化较少的场景。

多级缓存架构的主要优点在于能够充分利用不同缓存层的优势,实现数据访问的快速响应和高可用性。

2. 缓存穿透

缓存穿透是指查询一个根本不存在的数据,由于缓存层和存储层都不会命中,导致每次请求都必须直接查询数据库。缓存穿透的主要原因包括业务代码问题和恶意攻击。

  • 缓存空对象:在查询不到数据时,将空结果也缓存起来,并设置一个短暂的过期时间。这样后续对同一数据的查询可以直接返回空结果,减少数据库查询。例如,当查询一个不存在的用户时,可以将查询结果(空对象)缓存,并设置一个较短的过期时间,如5分钟。
  • 布隆过滤器:布隆过滤器是一种占用较小空间的概率型数据结构,可以快速判断某数据是否可能存在。在查询缓存之前,通过布隆过滤器判断数据是否存在,减少无效的数据库查询。布隆过滤器由一个位数组和多个无偏哈希函数组成,能够高效过滤不存在的数据。

示例代码:

// 布隆过滤器示例
RBloomFilter<String> bloomFilter = redisson.getBloomFilter("nameList");
bloomFilter.tryInit(100000000L, 0.03);

// 添加数据到布隆过滤器
bloomFilter.add("exampleKey");

// 查询时先判断布隆过滤器
if (!bloomFilter.contains("exampleKey")) {
    // 该key不存在,直接返回
    return null;
}

通过缓存空对象和布隆过滤器,可以有效减少缓存穿透问题,保护数据库免受大量无效查询的压力。

3. 缓存击穿

缓存击穿是指缓存中的某个热点数据在失效的瞬间,大量请求同时查询该数据,导致数据库压力骤增。缓存击穿问题通常发生在高并发场景下,当某个热点数据的缓存突然失效,所有请求都直达数据库,可能导致数据库宕机。

  • 设置不同的过期时间:在批量增加缓存时,设置不同的过期时间,避免大批量缓存同时失效。例如,可以将缓存的过期时间设置为300秒到600秒之间的随机值,这样可以分散缓存失效的时间点,避免缓存击穿。
  • 互斥锁机制:在缓存失效时,通过互斥锁机制只允许一个线程重建缓存,其他线程等待缓存重建完成后再读取缓存。互斥锁机制可以防止多个线程同时访问数据库重建缓存,从而减少数据库压力。

示例代码:

String get(String key) {
    // 从缓存中获取数据
    String cacheValue = cache.get(key);
    if (cacheValue == null) {
        // 只允许一个
  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值