首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Boot 整合 Redis 實現數據緩存完整指南

     編輯:Java 相關知識

前言

在現代 Web 應用開發中,引入緩存層是提升系統性能、降低資料庫壓力的關鍵手段。Spring Boot 提供了優雅的自動配置機制,使得整合 Redis 變得極為簡單。本文基於 Spring Boot 1.5.2.RELEASE 版本,詳細記錄從依賴引入、配置文件編寫、緩存管理器定制到實際業務驗證的完整流程,供開發者參考。

一、專案依賴配置

在 pom.xml 中引入 Spring Boot 官方提供的 Redis Starter,它已包含 Lettuce/Jedis 客戶庫及自動配置類:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

二、Redis 連線參數設定

修改 application.yml,配置主機、埠號及連線池參數:

spring:
  redis:
    host: localhost
    port: 6379
    pool:
      max-idle: 8
      min-idle: 0
      max-active: 8
      max-wait: -1

三、緩存管理器與序列化策略定制

建立 RedisConfig 類,啟用 @EnableCaching 並覆寫 CacheManager 與 RedisTemplate:

  • 設定預設過期時間 300 秒
  • 採用 Jackson2JsonRedisSerializer 實現值的 JSON 序列化,支援任意物件型別
  • 開啟 DefaultTyping.NON_FINAL 保留型別資訊,便於反序列化還原
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public CacheManager cacheManager(RedisTemplate<?> redisTemplate) {
        RedisCacheManager mgr = new RedisCacheManager(redisTemplate);
        mgr.setDefaultExpiration(300);
        return mgr;
    }

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate tpl = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer<Object> ser = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        ser.setObjectMapper(om);
        tpl.setValueSerializer(ser);
        tpl.afterPropertiesSet();
        return tpl;
    }
}

四、業務驗證:兩種緩存註解使用模式

為了模擬真實專案中 MyBatis + 緩存的協作場景,設計了兩種驗證方案,均以「用戶查詢/新增」為例。

方案一:在 DAO 層掛載註解(粒度較細)

Controller 僅負責路由轉發:

@RestController
public class UserController {
    @Autowired private UserDao userDao;

    @GetMapping("/user/id/{id}")
    public User findUserById(@PathVariable String id) {
        return userDao.findUserById(id);
    }

    @GetMapping("/user/create")
    public User createUser() {
        String id = "id" + System.currentTimeMillis()/1000;
        User u = new User(); u.setId(id);
        userDao.createUser(u);
        return userDao.findUserById(id);
    }
}

DAO 使用 @CacheConfig 統一指定緩存名稱 users,@Cacheable 查詢、@CachePut 更新:

@Component
@CacheConfig(cacheNames = "users")
@Transactional
public class UserDao {
    @Autowired private UserMapper userMapper;

    @CachePut(key = "#p0.id")
    public void createUser(User user) { userMapper.createUser(user); }

    @Cacheable(key = "#p0")
    public User findUserById(String id) { return userMapper.findUserById(id); }
}

方案二:直接在 Mapper 介面掛載註解(程式碼更精簡)

省去 DAO 層,Controller 直接注入 Mapper:

@RestController
public class UserController {
    @Autowired private UserMapper userMapper;
    // ... 同方案一
}

Mapper 介面上直接聲明緩存策略:

@CacheConfig(cacheNames = "users")
@Mapper
public interface UserMapper {
    @CachePut(key = "#p0.id") void createUser(User user);
    @Cacheable(key = "#p0") User findUserById(@Param("id") String id);
}

五、總結與建議

兩種方案各有優劣:

  • 方案一 符合傳統分層架構,業務邏輯與緩存策略解耦,適合複雜業務場景;
  • 方案二 減少樣板程式碼,適合簡單 CRUD 為主的微服務。

實際專案中應根據團隊規範、業務複雜度靈活選擇,並注意:

  1. 金鑰設計需具備業務唯一性,避免碰撞;
  2. 合理設定 TTL,防止髒讀與記憶體洩漏;
  3. 引入緩存後需同步處理緩存穿透、擊穿、雪崩等經典問題。

完整原始碼已上傳至示例專案,歡迎 Clone 實驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved