一、什么是缓存
缓存就是数据交换的缓冲区,是存储数据的临时地方,一般读写性能较高。
缓存的作用:
- 降低后端负载。当用户进行请求时,先去查询缓存,查询到之后直接返回给用户,而不必查询数据库,大大降低了后端的压力。
- 提高读写效率,降低响应时间。数据库的读写是磁盘读写,其响应时间一般比较长,而 Redis 是基于内存的,读写时间快。
缓存的成本:
- 一致性成本。当数据库中的数据发生了改变,而缓存中的数据还是旧的数据,当用户从缓存中读取数据时,获取到的依旧是旧的数据。
- 代码维护成本。为了解决一致性成本,以及缓存雪崩,缓存击穿等问题,就需要非常复杂的业务编码。
- 运维成本。缓存集群的部署维护需要额外的人力成本、硬件成本。
二、添加 Redis 缓存
2.1 分析
当我们查询商铺信息时,首先先去 Redis 中查询,如果查询到了,则直接返回商铺信息,未查询到则查询数据库,将查询到的信息先写入 Redis 中,以便下次查询时可以直接命中缓存,然后再将商铺信息返回给用户。
2.2 代码实现
ShopController
@RestController
@RequestMapping("/shop")
public class ShopController {
@Resource
public IShopService shopService;
@GetMapping("/{id}")
public Result queryShopById(@PathVariable("id") Long id) {
return shopService.queryById(id);
}
}
IShopService
public interface IShopService extends IService<Shop> {
Result queryById(Long id);
}
ShopServiceImpl
@Service
public class ShopServiceImpl extends ServiceImpl<ShopMapper, Shop> implements IShopService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public Result queryById(Long id) {
String shopJson = stringRedisTemplate.opsForValue().get(RedisConstants.CACHE_SHOP_KEY + id);
if (StrUtil.isNotBlank(shopJson)) {
Shop shop = JSONUtil.toBean(shopJson, Shop.class);
return Result.ok(shop);
}
Shop shop = getById(id);
if(shop == null){
return Result.fail("店铺不存在!");
}
stringRedisTemplate.opsForValue().set(RedisConstants.CACHE_SHOP_KEY + id, JSONUtil.toJsonStr(shop));
return Result.ok(shop);
}
}
|