缓存
什么是缓存?
假设员工信息查询:
浏览器
↓
Spring Boot
↓
Oracle数据库查询一次需要:
20ms ~ 100ms如果同时 1000 人查询:
数据库压力非常大于是假如 Redis:
浏览器
↓
Spring Boot
↓
Redis
↓(没有)
Oracle查询流程
第一次
Redis 没有
↓
查询数据库
↓
放入 Redis
↓
返回结果第二次:
Redis 有
↓
直接返回缓存代码
java
public User getUser(Long id) {
String key = "user:" + id;
User user = (User) redisTemplate.opsForValue().get(key);
if (user != null) {
return user;
}
user = userMapper.selectById(id);
redisTemplate.opsForValue().set(
key,
user,
30,
TimeUnit.MINUTES);
return user;
}流程:
先查Redis - 没有 - 查数据库 - 写Redis - 返回
这个模式叫:
Cache Aside Pattern(旁路缓存)
是最常见的一种模式。
什么时候用缓存?
适合于:
- 用户信息
- 员工信息
- 店铺信息
- 系统配置
- 字典数据
- 商品信息
不适合于:
实时变化的数据
- 银行余额
- 股票价格
- 实时库存
缓存更新策略
方案1:更新数据库后删除缓存(推荐)
更新数据时:
更新数据库
↓
删除Redis下次查询时:
Redis没有
↓
查数据库
↓
重新缓存代码
java
userMapper.update(user);
redisTemplate.delete("user:" + user.getId());方案2:同时更新缓存
更新数据库
↓
更新Redis问题:容易数据不一致。
缓存命中率
假设:
10000 次请求:
9500次 Redis
500次 数据库那么:
命中率 = 95%
命中率越高:
- 数据库压力越小
- 系统越快