SpringDataRedis快速入門教程
一、前言:為什么用 Spring Data Redis?
你是否還在手動管理 Jedis 連接池?
- 是否為每個 Redis 操作寫重復(fù)的
try-finally代碼? - 是否希望像操作數(shù)據(jù)庫一樣,用聲明式方式操作 Redis?
- Spring Data Redis 正是為解決這些問題而生!
作為 Spring 官方提供的 Redis 集成模塊,它:
- 自動管理連接(默認使用高性能 Lettuce 客戶端)
- 提供
RedisTemplate和StringRedisTemplate簡化操作 - 支持序列化定制、事務(wù)、管道等高級特性
- 無縫集成 Spring Cache,一行注解實現(xiàn)緩存
本文將帶你從零搭建項目,掌握核心 API,并寫出優(yōu)雅的 Redis 代碼!
二、環(huán)境準備
1. 創(chuàng)建 Spring Boot 項目(2.7+ 或 3.x)
通過 start.spring.io 添加依賴:
- Spring Web
- Spring Data Redis (Access+Driver)
或手動添加 Maven 依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 若使用 Spring Boot 3.x,無需額外引入 Lettuce -->注意:Spring Boot 2.x 默認使用 Lettuce(非阻塞、線程安全),不再推薦 Jedis。
2. 啟動本地 Redis
# 使用 Docker 快速啟動 docker run -d --name redis -p 6379:6379 redis:7.0
三、基礎(chǔ)配置:application.yml
spring:
redis:
host: localhost
port: 6379
password: "" # 無密碼留空
database: 0
timeout: 2000ms # 連接超時
lettuce:
pool:
max-active: 20 # 最大連接數(shù)
max-idle: 10 # 最大空閑連接
min-idle: 2 # 最小空閑連接
max-wait: 2000ms # 獲取連接最大等待時間Spring Boot 會自動配置 RedisConnectionFactory 和 RedisTemplate,無需手動創(chuàng)建連接池!
四、核心操作:RedisTemplate vs StringRedisTemplate
Spring Data Redis 提供兩個核心模板類:
| 模板類 | Key/Value 類型 | 適用場景 |
|---|---|---|
| RedisTemplate<K, V> | 泛型(Object) | 存儲 Java 對象(需序列化) |
| StringRedisTemplate | String / String | 純字符串操作(如驗證碼、計數(shù)器) |
1. 使用 StringRedisTemplate(推薦初學(xué)者)
@RestController
public class RedisController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@GetMapping("/set")
public String set(@RequestParam String key, @RequestParam String value) {
stringRedisTemplate.opsForValue().set(key, value, 10, TimeUnit.MINUTES);
return "OK";
}
@GetMapping("/get")
public String get(@RequestParam String key) {
return stringRedisTemplate.opsForValue().get(key);
}
// Hash 操作
@PostMapping("/user")
public void saveUser(@RequestParam String userId,
@RequestParam String name,
@RequestParam Integer age) {
stringRedisTemplate.opsForHash().put("user:" + userId, "name", name);
stringRedisTemplate.opsForHash().put("user:" + userId, "age", age.toString());
}
// List 操作
@PostMapping("/task")
public void addTask(@RequestParam String task) {
stringRedisTemplate.opsForList().leftPush("tasks", task);
}
}優(yōu)點:API 清晰,opsForXxx() 對應(yīng) Redis 數(shù)據(jù)類型
2. 使用 RedisTemplate 存儲 Java 對象
步驟 1:定義實體類
public class User implements Serializable {
private String id;
private String name;
private int age;
// getter/setter...
}步驟 2:配置序列化方式(避免亂碼)
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 使用 Jackson 序列化對象(可讀性強)
Jackson2JsonRedisSerializer<Object> serializer =
new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(),
ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
// 設(shè)置 key 和 value 的序列化方式
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}步驟 3:操作對象
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public void saveUser(User user) {
redisTemplate.opsForValue().set("user:" + user.getId(), user, 1, TimeUnit.HOURS);
}
public User getUser(String id) {
return (User) redisTemplate.opsForValue().get("user:" + id);
}提示:若不配置序列化,默認使用 JDK 序列化,會導(dǎo)致 Redis 中出現(xiàn)不可讀的二進制數(shù)據(jù)。
五、常用操作速查表
| 操作 | 代碼示例 |
|---|---|
| String | opsForValue().set("k", "v") |
| Hash | opsForHash().put("user:1", "name", "張三") |
| List | opsForList().rightPush("queue", "item") |
| Set | opsForSet().add("tags", "java", "redis") |
| ZSet | opsForZSet().add("rank", "playerA", 95.5) |
| 過期時間 | expire("key", 60, TimeUnit.SECONDS) |
| 批量操作 | opsForValue().multiSet(map) |
六、進階:結(jié)合 Spring Cache 實現(xiàn)聲明式緩存
只需三步,方法結(jié)果自動緩存!
1. 啟用緩存
@SpringBootApplication
@EnableCaching // ← 關(guān)鍵注解
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}2. 在 Service 方法上加注解
@Service
public class UserService {
@Cacheable(value = "users", key = "#id")
public User getUserById(String id) {
System.out.println("查詢數(shù)據(jù)庫..."); // 僅首次打印
return userMapper.selectById(id);
}
@CacheEvict(value = "users", key = "#id")
public void updateUser(User user) {
userMapper.update(user);
}
}效果:
- 第一次調(diào)用
getUserById("1001")→ 查詢 DB 并緩存 - 后續(xù)調(diào)用 → 直接返回緩存,不執(zhí)行方法體
七、常見問題與避坑指南
坑 1:Redis 中出現(xiàn)\xac\xed\x00\x05亂碼
原因:使用了默認的 JDK 序列化
解決:配置 StringRedisSerializer 或 Jackson2JsonRedisSerializer
坑 2:緩存穿透(大量查不存在的 key)
方案:對 null 結(jié)果也緩存(短 TTL),或使用布隆過濾器
坑 3:緩存雪崩(大量 key 同時過期)
方案:設(shè)置隨機過期時間,如 600 + random(60)
八、Jedis vs Lettuce vs Spring Data Redis
| 方案 | 適用場景 |
|---|---|
| 原生 Jedis | 學(xué)習(xí) Redis 協(xié)議、極簡項目 |
| JedisPool | 需要精細控制連接池的中小項目 |
| Spring Data Redis (Lettuce) | ? 主流選擇:Spring Boot 項目、高并發(fā)、響應(yīng)式支持 |
建議:新項目直接使用 Spring Data Redis + Lettuce
九、總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Netty學(xué)習(xí)之理解selector原理示例
這篇文章主要為大家介紹了Netty學(xué)習(xí)之理解selector原理示例使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-07-07
詳解使用JavaMailSender給曾經(jīng)心愛的她再中秋發(fā)送一封特別的郵件
網(wǎng)站的服務(wù)端向用戶發(fā)郵件時,郵件中往往需要攜帶圖片,鏈接等內(nèi)容。所以為了方便起見,我們一般發(fā)送HTML格式的郵件,那么怎么去拼一個HTML格式的郵件呢?——Thymeleaf。開始之前,先新建一個SpringBoot項目,并添加需要用到的依賴。然后就可以繼續(xù)往下了2022-09-09
Java Thread之Sleep()使用方法及總結(jié)
這篇文章主要介紹了Java Thread之Sleep()使用方法及總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題

