深入理解缓存在项目中的应用
在现代应用开发中,缓存的使用至关重要。它能够显著提高系统的性能,减轻服务器的读写压力。本文将深入分析黑马点评项目中缓存的相关内容,包括添加商品缓存、缓存更新策略、缓存穿透、缓存雪崩、缓存击穿以及缓存工具封装等方面。
为什么要使用缓存
缓存数据存储于内存中,而内存的读写性能远远高于磁盘。在高并发场景下,缓存可以大大降低用户访问并发量带来的服务器读 写压力,提高系统的响应速度和吞吐量。
添加商品缓存
在查询数据库之前,先查询缓存。如果缓存数据存在,则直接从缓存中返回;如果缓存数据不存在,再查询数据库,然后将数据存入 Redis。
代码如下:
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
String key = CACHE_SHOP_KEY + id;
// 从缓存中获取数据
String shopJson = stringRedisTemplate.opsForValue().get(key);
if (StrUtil.isNotBlank(shopJson)) {
// 缓存中有数据
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
// 缓存中没有数据,从数据库中获取
Shop shop = this.getById(id);
if (shop == null) {
// 数据库中没有数据
return Result.fail("商铺不存在");
}
// 将数据写入缓存
stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop));
return Result.ok(shop);
}
缓存更新策略
三种更新策略
缓存更新主要有以下三种方式:
- 内存淘汰策略:Redis 使用 LRU(Least Recently Used,最近最少使用)算法作为默认的内存淘汰策略。当 Redis 的内存用完时,它会尝试从最近最少使用的键中选择一些进行淘汰以腾出内存空间。可以通过配置
maxmemory - policy
选项来指定其他内存淘汰策略,例如 LFU(Least Frequently Used,最不经常使用)或不淘汰等。 - 超时剔除(TTL - Time To Live):在 Redis 中,可以为每个键设置一个过期时间,一旦过期时间到了,Redis 会自动将键删除。可以使用
EXPIRE
或SETEX
命令来设置键的过期时间,或者在键的创建时通过EXPIRE
参数来设置过期时间。 - 主动更新:主动更新通常是通过在访问键时重新设置过期时间来实现的。这可以防止键被过早删除,特别是在访问频繁的情况下。可以使用
EXPIRE
或PEXPIRE
命令来更新键的过期时间,或者使用PERSIST
命令来删除键的过期时间,使其永不过期。通常用来解决缓存和数据库不一致的问题。