最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringDataRedis快速入門教程

 更新時間:2026年04月17日 09:33:16   作者:難釋懷  
這篇文章主要介紹了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 對象(需序列化)
StringRedisTemplateString / 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ù)。

五、常用操作速查表

操作代碼示例
StringopsForValue().set("k", "v")
HashopsForHash().put("user:1", "name", "張三")
ListopsForList().rightPush("queue", "item")
SetopsForSet().add("tags", "java", "redis")
ZSetopsForZSet().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)文章

  • 使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題

    使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題

    這篇文章主要介紹了使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • JAVA映射實體類對象和List使用詳解

    JAVA映射實體類對象和List使用詳解

    文章主要內(nèi)容介紹Java中實體類對象與List的映射方法,核心代碼示例展示了如何將單個對象和List映射到實體類中,作者分享了個人經(jīng)驗,并鼓勵讀者參考和點贊支持
    2026-01-01
  • Maven解決jar包版本沖突的4種方法詳解

    Maven解決jar包版本沖突的4種方法詳解

    這篇文章主要給大家介紹了關(guān)于Maven解決jar包版本沖突的4種方法代碼,maven工程要導(dǎo)入jar包的坐標(biāo),就必須要考慮解決jar包沖突,文中介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • 最新評論

    英山县| 兴安县| 湖南省| 缙云县| 化隆| 富川| 广宗县| 波密县| 同心县| 朝阳县| 玛曲县| 鄂托克旗| 呼和浩特市| 焉耆| 江北区| 苏尼特右旗| 色达县| 宁强县| 云安县| 城口县| 特克斯县| 山西省| 景洪市| 银川市| 阿尔山市| 栾城县| 鹤峰县| 东辽县| 循化| 蒲城县| 和平县| 苏尼特左旗| 盐山县| 淳化县| 敖汉旗| 郴州市| 金塔县| 万宁市| 巴林右旗| 额尔古纳市| 天等县|