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

Spring Boot 整合 Redis詳解從基礎操作到實戰(zhàn)應用

 更新時間:2025年08月23日 10:34:57   作者:igxia  
文章介紹了SpringBoot整合Redis的必要性、步驟及核心數(shù)據(jù)類型,涵蓋分布式鎖、緩存注解等高級功能,并提供最佳實踐如鍵命名規(guī)范和內存優(yōu)化,強調二者結合提升應用性能與可擴展性,感興趣的朋友跟隨小編一起看看吧

在現(xiàn)代應用中,緩存 幾乎是性能優(yōu)化的必備手段。Redis 作為高性能的內存數(shù)據(jù)庫,不僅支持鍵值對緩存,還支持豐富的數(shù)據(jù)結構(如 List、Set、Hash、ZSet 等),被廣泛用于緩存、分布式鎖、消息隊列、計數(shù)器等場景。

Spring Boot 提供了開箱即用的 Redis 集成支持,開發(fā)者可以非常方便地在項目中使用 Redis。

一、為什么選擇 Redis?

在現(xiàn)代應用開發(fā)中,??Redis?? 已成為高性能緩存和分布式數(shù)據(jù)存儲的首選方案。作為內存數(shù)據(jù)結構存儲系統(tǒng),Redis 提供:

  • ??亞毫秒級響應速度??(10萬+ QPS)
  • ??豐富的數(shù)據(jù)結構支持??
  • ??持久化選項??(RDB/AOF)
  • ??高可用架構??(主從復制、哨兵、集群)

Spring Boot 通過 ??Spring Data Redis?? 模塊提供了與 Redis 的無縫集成,極大簡化了開發(fā)流程。

二、Spring Boot 整合 Redis 步驟

1. 添加依賴

在 pom.xml 中添加:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId> <!-- 推薦使用 Jedis 客戶端 -->
</dependency>

2. 配置 Redis 連接

在 application.yml 中配置:

spring:
  redis:
    host: localhost
    port: 6379
    password: your-password # 如果有密碼
    database: 0 # 默認數(shù)據(jù)庫索引
    jedis:
      pool:
        max-active: 8 # 連接池最大連接數(shù)
        max-idle: 8   # 連接池最大空閑連接
        min-idle: 2   # 連接池最小空閑連接

3. 配置 RedisTemplate

創(chuàng)建配置類:

@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 om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.activateDefaultTyping(
            om.getPolymorphicTypeValidator(), 
            ObjectMapper.DefaultTyping.NON_FINAL
        );
        serializer.setObjectMapper(om);
        // 設置序列化
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }
}

三、Redis 五大核心數(shù)據(jù)類型

1. String(字符串)

??特點??:最基本的數(shù)據(jù)類型,最大能存儲 512MB

??常用場景??:

  • 緩存簡單值
  • 計數(shù)器
  • 分布式鎖

??操作示例??:

@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 設置值
redisTemplate.opsForValue().set("user:1001:name", "Alice");
// 獲取值
String name = (String) redisTemplate.opsForValue().get("user:1001:name");
// 自增計數(shù)器
redisTemplate.opsForValue().increment("article:1001:views");
// 設置帶過期時間(30分鐘)
redisTemplate.opsForValue().set("temp:session", "data", 30, TimeUnit.MINUTES);

2. Hash(哈希)

??特點??:鍵值對集合,適合存儲對象

??常用場景??:

  • 存儲用戶資料
  • 商品屬性
  • 配置信息

??操作示例??:

// 存儲用戶對象
Map<String, String> userMap = new HashMap<>();
userMap.put("name", "Bob");
userMap.put("age", "30");
userMap.put("email", "bob@example.com");
redisTemplate.opsForHash().putAll("user:1002", userMap);
// 獲取單個字段
String email = (String) redisTemplate.opsForHash().get("user:1002", "email");
// 更新單個字段
redisTemplate.opsForHash().put("user:1002", "age", "31");
// 獲取所有字段
Map<Object, Object> userData = redisTemplate.opsForHash().entries("user:1002");

3. List(列表)

??特點??:有序、可重復的字符串集合

??常用場景??:

  • 消息隊列
  • 最新消息排行
  • 記錄日志

??操作示例??:

// 從左側插入
redisTemplate.opsForList().leftPush("news:latest", "Article 1");
redisTemplate.opsForList().leftPush("news:latest", "Article 2");
// 從右側插入
redisTemplate.opsForList().rightPush("news:latest", "Article 3");
// 獲取范圍數(shù)據(jù)(0到10)
List<Object> latestNews = redisTemplate.opsForList().range("news:latest", 0, 10);
// 列表長度
Long size = redisTemplate.opsForList().size("news:latest");
// 模擬隊列消費
Object article = redisTemplate.opsForList().rightPop("news:queue", 10, TimeUnit.SECONDS);

4. Set(集合)

??特點??:無序、不可重復的元素集合

??常用場景??:

  • 標簽系統(tǒng)
  • 共同好友
  • 唯一訪客統(tǒng)計

??操作示例??:

// 添加元素
redisTemplate.opsForSet().add("article:1001:tags", "tech", "java", "spring");
// 獲取所有元素
Set<Object> tags = redisTemplate.opsForSet().members("article:1001:tags");
// 檢查元素是否存在
boolean containsJava = redisTemplate.opsForSet().isMember("article:1001:tags", "java");
// 集合運算(交集)
Set<Object> commonTags = redisTemplate.opsForSet().intersect(
    "article:1001:tags", 
    "article:1002:tags"
);
// 唯一訪客統(tǒng)計
redisTemplate.opsForSet().add("article:1001:visitors", "192.168.1.1");
Long visitors = redisTemplate.opsForSet().size("article:1001:visitors");

5. Sorted Set(有序集合)

??特點??:帶分數(shù)排序的Set

??常用場景??:

  • 排行榜
  • 帶權重的隊列
  • 范圍查詢

??操作示例??:

// 添加帶分數(shù)的元素
redisTemplate.opsForZSet().add("leaderboard", "player1", 2500);
redisTemplate.opsForZSet().add("leaderboard", "player2", 1800);
redisTemplate.opsForZSet().add("leaderboard", "player3", 3000);
// 獲取前3名玩家
Set<ZSetOperations.TypedTuple<Object>> topPlayers = 
    redisTemplate.opsForZSet().reverseRangeWithScores("leaderboard", 0, 2);
// 更新分數(shù)
redisTemplate.opsForZSet().incrementScore("leaderboard", "player1", 100);
// 獲取玩家排名(從高到低)
Long rank = redisTemplate.opsForZSet().reverseRank("leaderboard", "player2");
// 獲取分數(shù)段玩家(2000-3000分)
Set<Object> players = redisTemplate.opsForZSet().rangeByScore("leaderboard", 2000, 3000);

四、高級功能實戰(zhàn)

1. 分布式鎖實現(xiàn)

public boolean tryLock(String lockKey, String requestId, long expireTime) {
    return Boolean.TRUE.equals(redisTemplate.execute((RedisCallback<Boolean>) connection -> {
        // 使用SET命令的NX(不存在才設置)和PX(毫秒過期)選項
        String result = connection.set(
            lockKey.getBytes(),
            requestId.getBytes(),
            Expiration.milliseconds(expireTime),
            RedisStringCommands.SetOption.SET_IF_ABSENT
        );
        return "OK".equals(result);
    }));
}
public boolean releaseLock(String lockKey, String requestId) {
    String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                   "return redis.call('del', KEYS[1]) " +
                   "else return 0 end";
    return Boolean.TRUE.equals(redisTemplate.execute(
        new DefaultRedisScript<>(script, Long.class),
        Collections.singletonList(lockKey),
        requestId
    ));
}

2. 緩存注解使用

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 數(shù)據(jù)庫查詢邏輯
    return userRepository.findById(id).orElse(null);
}
@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    // 更新數(shù)據(jù)庫
    return userRepository.save(user);
}
@CacheEvict(value = "users", key = "#id")
public void deleteUser(Long id) {
    userRepository.deleteById(id);
}

3. 發(fā)布/訂閱模式

// 配置消息監(jiān)聽容器
@Bean
public RedisMessageListenerContainer container(
        RedisConnectionFactory factory,
        MessageListenerAdapter listenerAdapter) {
    RedisMessageListenerContainer container = new RedisMessageListenerContainer();
    container.setConnectionFactory(factory);
    container.addMessageListener(listenerAdapter, new PatternTopic("news.*"));
    return container;
}
// 消息處理器
@Component
public class RedisMessageListener {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;
    public void handleMessage(String message, String channel) {
        // 處理消息并轉發(fā)到WebSocket
        messagingTemplate.convertAndSend("/topic/" + channel, message);
    }
}
// 發(fā)布消息
public void publish(String channel, String message) {
    redisTemplate.convertAndSend(channel, message);
}

五、最佳實踐與注意事項

  • ??鍵命名規(guī)范??
    • 使用冒號分隔層級:業(yè)務:類型:ID
    • 示例:user:session:1001product:info:2005
  • ??內存優(yōu)化??
    • 控制單個Value大?。?lt;100KB)
    • 使用Hash壓縮存儲小對象
    • 設置合理的TTL
  • ??性能調優(yōu)??
spring:
  redis:
    jedis:
      pool:
        max-active: 50 # 根據(jù)負載調整
        max-wait: 200ms
  • ??高可用方案??
    • 開發(fā)環(huán)境:單節(jié)點
    • 生產(chǎn)環(huán)境:Redis Sentinel 或 Cluster
  • ??監(jiān)控指標
// 獲取Redis指標
@Autowired
private RedisConnectionFactory factory;
public void monitor() {
    RedisConnection connection = factory.getConnection();
    Properties info = connection.info();
    System.out.println("內存使用: " + info.getProperty("used_memory_human"));
    System.out.println("連接數(shù): " + info.getProperty("connected_clients"));
}

六、總結

Spring Boot 與 Redis 的結合為開發(fā)者提供了強大的數(shù)據(jù)緩存和處理能力。通過掌握:

  1. ??五大核心數(shù)據(jù)類型??的適用場景和操作方法
  2. ??RedisTemplate?? 的高級用法
  3. ??分布式鎖??、??發(fā)布訂閱??等高級功能
  4. ??生產(chǎn)環(huán)境最佳實踐

到此這篇關于Spring Boot 整合 Redis詳解從基礎操作到實戰(zhàn)應用的文章就介紹到這了,更多相關Spring Boot 整合 Redis內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中不用第三個變量來互換兩個變量的值

    Java中不用第三個變量來互換兩個變量的值

    在程序運行期間,隨時可能產(chǎn)生一些臨時數(shù)據(jù),應用程序會將這些數(shù)據(jù)保存在一些內存單元中,每個內存單元都用一個標識符來標識。這些內存單元被稱為變量,定義的標識符就是變量名,內存單元中存儲的數(shù)據(jù)就是變量的值
    2021-10-10
  • 使用Feign傳遞請求頭信息(Finchley版本)

    使用Feign傳遞請求頭信息(Finchley版本)

    這篇文章主要介紹了使用Feign傳遞請求頭信息(Finchley版本),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java基礎教程之理解Annotation詳細介紹

    Java基礎教程之理解Annotation詳細介紹

    這篇文章主要介紹了Java基礎教程之理解Annotation詳細介紹的相關資料,需要的朋友可以參考下
    2017-01-01
  • Java實現(xiàn)五子棋網(wǎng)絡版

    Java實現(xiàn)五子棋網(wǎng)絡版

    這篇文章主要為大家詳細介紹了基于Java編寫的網(wǎng)絡五子棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java中的BigDecimal原理詳解

    Java中的BigDecimal原理詳解

    這篇文章主要介紹了Java中的BigDecimal原理詳解,對于日常開發(fā)過程中出現(xiàn)小數(shù)的問題,通常都是使用float或者double類型來處理,在java中float占用四個字節(jié), double類型占用8個字節(jié),需要的朋友可以參考下
    2023-09-09
  • java 學習筆記(入門篇)_java程序helloWorld

    java 學習筆記(入門篇)_java程序helloWorld

    安裝配置完Java的jdk,下面就開始寫第一個java程序--hello World.用來在控制臺輸出“Hello World”,接下來詳細介紹,感興趣的朋友可以參考下
    2013-01-01
  • IDEA如何添加配置文件到classpath中

    IDEA如何添加配置文件到classpath中

    這篇文章主要介紹了IDEA如何添加配置文件到classpath中,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • java中 spring 定時任務 實現(xiàn)代碼

    java中 spring 定時任務 實現(xiàn)代碼

    java中 spring 定時任務 實現(xiàn)代碼,需要的朋友可以參考一下
    2013-03-03
  • java實現(xiàn)學生信息錄入界面

    java實現(xiàn)學生信息錄入界面

    這篇文章主要為大家詳細介紹了java實現(xiàn)學生信息錄入界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 使用Java編寫圖形化的菜單的教程

    使用Java編寫圖形化的菜單的教程

    這篇文章主要介紹了使用Java編寫圖形化的菜單的教程,需要的朋友可以參考下
    2015-10-10

最新評論

汪清县| 肇庆市| 尖扎县| 巴东县| 阳江市| 新昌县| 福安市| 如皋市| 宁安市| 临漳县| 扎囊县| 高雄县| 朝阳市| 隆昌县| 临城县| 文登市| 措勤县| 册亨县| 灵石县| 齐河县| 清远市| 祁阳县| 芷江| 福安市| 江西省| 富顺县| 南澳县| 双辽市| 建昌县| 综艺| 榆中县| 枞阳县| 北票市| 台湾省| 板桥市| 新邵县| 新乐市| 新兴县| 巴林左旗| 临邑县| 辽阳市|