冷啟動:服務剛剛啟動時,Redis中並沒有緩存,如果所有商品數據都在第一次查詢時添加緩存,可能會給數據庫帶來較大壓力。
緩存預熱:在實際開發中,我們可以利用大數據統計用戶訪問的熱點數據,在項目啟動時將這些熱點數據提前查詢並保存到Redis中。
我們數據量較少,可以在啟動時將所有數據都放入緩存中。
緩存預熱示例
1.安裝redis
2.在item-service服務中引入Redis依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
3.配置redis地址
spring:
redis:
host: localhost
password: 123456
4.編寫初始化類
@Component @Slf4j public class RedisHandler implements InitializingBean { @Autowired private StringRedisTemplate redisTemplate; @Autowired private IItemService itemService; @Autowired private IItemStockService stockService; private static final ObjectMapper MAPPER = new ObjectMapper(); @Override public void afterPropertiesSet() throws Exception { // 初始化緩存 // 1.查詢商品信息 List<Item> itemList = itemService.list(); // 2.放入緩存 for (Item item : itemList) { // 2.1.item序列化為JSON String json = MAPPER.writeValueAsString(item); // 2.2.存入redis redisTemplate.opsForValue().set("item:id:" + item.getId(), json); } // 3.查詢商品庫存信息 List<ItemStock> stockList = stockService.list(); // 4.放入緩存 for (ItemStock stock : stockList) { // 2.1.item序列化為JSON String json = MAPPER.writeValueAsString(stock); // 2.2.存入redis redisTemplate.opsForValue().set("item:stock:id:" + stock.getId(), json); } log.info("緩存預熱初始化結束"); } public void saveItem(Item item) { try { String json = MAPPER.writeValueAsString(item); redisTemplate.opsForValue().set("item:id:" + item.getId(), json); } catch (JsonProcessingException e) { throw new RuntimeException(e); } } public void deleteItemById(Long id) { redisTemplate.delete("item:id:" + id); } }
