引入二级缓存:Caffeine 本地缓存

二级缓存(Second-level Cache)是一种常见的缓存设计模式,广泛应用于分布式系统和高性能应用中。它的作用是通过结合多层缓存机制,优化缓存的使用效率和扩展性,提升系统的整体性能。二级缓存通常由两层或更多层缓存组成,其中每一层的作用和性能不同。
 

二级缓存的常见架构

在常见的缓存架构中,一级缓存和二级缓存通常是相互配合使用的。下面是一个典型的二级缓存架构的例子:

  1. 本地缓存(一级缓存)

    • 类型:通常是基于内存的缓存(例如:Caffeine、Guava、Ehcache等)。
    • 作用:用于存储热点数据和快速访问的数据,避免频繁访问远程缓存或数据库。
    • 特点:访问速度非常快,存储容量较小,适合频繁读取的数据。
  2. 分布式缓存(如 Redis、Memcached,二级缓存)

    • 类型:通常是分布式缓存,能够跨多个节点共享缓存数据。
    • 作用:用于存储大量不常访问的数据,或者存储即使在服务器重启后也要持久化的数据。
    • 特点:存储容量大,可以通过集群扩展,访问速度较本地缓存慢,但比数据库更快。

示例:一级缓存与二级缓存的组合使用

假设我们要实现一个用户信息的查询功能,首先从 一级缓存(本地缓存) 中查找用户信息,如果没有找到,则从 二级缓存(Redis) 中查找,再没有的话,最后访问数据库。

@Service
public class UserServiceImpl implements UserService {

    private final Cache<Long, User> caffeineCache;
    private final RedisTemplate<String, Object> redisTemplate;

     /**
     * 用户信息本地缓存
     */
    private static final Cache<Long, userDTO> LOCAL_CACHE = Caffeine.newBuilder()
            .initialCapacity(10000) // 设置初始容量为 10000 个条目
            .maximumSize(10000) // 设置缓存的最大容量为 10000 个条目
            .expireAfterWrite(1, TimeUnit.HOURS) // 设置缓存条目在写入后 1 小时过期
            .build();


    public UserDTO getUserById(Long userId) {
        Long userId = userDTO.getId();

        // 先从本地缓存中查询
        userDTO userDto = LOCAL_CACHE.getIfPresent(userId);
        if (Objects.nonNull(userDto)) {
            log.info("==> 命中了本地缓存;{}", userDto);
            return Response.success(userDto);
        }

        // 用户缓存 Redis Key(建立 Redis 缓存Key)
        String userInfoRedisKey = RedisKeyConstants.buildUserInfoKey(userId);

        // 再从 Redis 缓存中查询
        String userInfoRedisValue = (String) redisTemplate.opsForValue().get(userInfoRedisKey);

        // 若 Redis 缓存中存在该用户信息
        if (StringUtils.isNotBlank(userInfoRedisValue)) {
            // 将存储的 Json 字符串转换成对象,并返回
            userDTO userDto = JsonUtils.parseObject(userInfoRedisValue, userDTO.class);
            // 异步线程中将用户信息存入本地缓存
            threadPoolTaskExecutor.submit(() -> {
                // 写入本地缓存
                LOCAL_CACHE.put(userId, userDto);
            });
            return Response.success(userDto);
        }

        return userDto;
    }
}

总结

二级缓存的主要作用是优化缓存的存取效率,通过合理地结合本地缓存(一级缓存)和分布式缓存(如 Redis,二级缓存),可以有效提升系统性能、降低数据库压力、减少访问延迟并提高缓存命中率。同时,它还可以帮助解决缓存穿透、缓存雪崩等常见问题,是现代高性能系统和分布式架构中的常见设计模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值