缓存作为目前高性能服务框架中不可或缺的一部分,扮演着越来越重要的角色。
实际的项目中通常会用redis做第一层缓存,如果不命中则会直接查询数据库,这种架构可以减轻数据库的压力。
如今可以在其基础上再做出改进,配合本地缓存再次去提升响应速度和服务性能。由此诞生二级缓存架构。
借用网图:
话不多说:创建springboot项目,整合redis和数据库配置以及相关依赖。
首先我们需要自己创建一个Caffeine中的Cache对象来缓存数据,他的数据结构类似于Hashmap.详细配置如下:
@Configuration
public class CaffeineConfig {
@Bean
public Cache<String,Object> caffeineCache(){
return Caffeine.newBuilder()
.initialCapacity(128)//初始大小
.maximumSize(1024)//最大数量
.expireAfterWrite(60, TimeUnit.SECONDS)//过期时间
.build();
}
}
简单解释一下Cache
相关的几个参数的意义:
-
initialCapacity
:初始缓存空大小 -
maximumSize
:缓存的最大数量,设置这个值可以避免出现内存溢出 -
expireAfterWrite
:指定缓存的过期时间,是最后一次写操作后的一个时间,这里
此外,缓存的过期策略也可以通过expireAfterAccess
或refreshAfterWrite
指定。
创建完成后,就可以在业务层中使用了。
public Order getOrderById(Long id) {
String key = CacheConstant.ORDER + id;
Order order = (Order) cache.get(key,
k -> {
//先查询 Redis
Object obj = redisTemplate.opsForValue().get(k);
if (Objects.nonNull(obj)) {
log.info("get data from redis");
return obj;
}
// Redis没有则查询 DB
log.info("get data from database");
Order myOrder = orderMapper.selectOne(new LambdaQueryWrapper<Order>()
.eq(Order::getId, id));
redisTemplate.opsForValue().set(k, myOrder, 120, TimeUnit.SECONDS);
return myOrder;
});
return order;
}
查找顺序为Caffeine中的本地缓存-》redis->DB
上面的例子中Caffeine中的过期时间为60s,Redis的过期时间为120.
再举个更新的例子说明一下
public void updateOrder(Order order) {
log.info("update order data");
String key=CacheConstant.ORDER + order.getId();
orderMapper.updateById(order);
//修改 Redis
redisTemplate.opsForValue().set(key,order,120, TimeUnit.SECONDS);
// 修改本地缓存
cache.put(key,order);
}
核心思想:Caffeine>redis>DB