在現代 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>
修改 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:
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 + 緩存的協作場景,設計了兩種驗證方案,均以「用戶查詢/新增」為例。
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); }
}
省去 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);
}
兩種方案各有優劣:
實際專案中應根據團隊規範、業務複雜度靈活選擇,並注意:
完整原始碼已上傳至示例專案,歡迎 Clone 實驗。