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

redis在springboot中做緩存操作的兩種方法應(yīng)用實例

 更新時間:2025年09月24日 09:30:36   作者:夢兮760  
redis是一個高性能的鍵值對存儲數(shù)據(jù)庫,在現(xiàn)在的程序構(gòu)建時,當(dāng)數(shù)據(jù)量較大時或數(shù)據(jù)重復(fù)利用時常常利用緩存技術(shù)來減少時間消耗和資源浪費,本文就是介紹在springboot中如何利用redis做緩存,感興趣的朋友跟隨小編一起看看吧

眾所周知,redis是一個高性能的鍵值對存儲數(shù)據(jù)庫,在現(xiàn)在的程序構(gòu)建時,當(dāng)數(shù)據(jù)量較大時或數(shù)據(jù)重復(fù)利用時常常利用緩存技術(shù)來減少時間消耗和資源浪費,本文就是介紹在springboot中如何利用redis做緩存

一.進行redis的安裝與開啟(簡略)

在windows系統(tǒng)或Linux系統(tǒng)都可

默認已安裝完redis

二.進行依賴引入和配置文件搭建

依賴

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

配置文件(application.properties)

spring.redis.host=(你redis主機的ip地址)
spring.redis.port=6379
spring.redis.password=
# 可選連接池配置
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0

三.構(gòu)建config以及加注解

在主啟動類添加@EnableCaching注解:

@SpringBootApplication
@EnableCaching
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置Redis緩存管理器

@Configuration
public class RedisCacheConfig {
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                .entryTtl(Duration.ofMinutes(30)); // 默認過期時間30分鐘
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .withCacheConfiguration("userCache", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10))) // 自定義緩存過期
                .transactionAware()
                .build();
    }
}

userCache"這是緩存名稱。在 Spring 應(yīng)用程序中,你可以通過指定不同的緩存名稱來管理不同的緩存區(qū)域。

管理器中進行了與redis的連接還有序列化(數(shù)據(jù)庫中存儲的形式)

例如,如果你緩存了一個 User 對象,它會被序列化為 JSON 字符串,然后存儲在 Redis 中。在 Redis 中,數(shù)據(jù)看起來可能是這樣的:

"key": "{\"id\":\"1\",\"name\":\"John Doe\",\"email\":\"john.doe@example.com\"}"

四.接下來就是要進行緩存管理

緩存操作管理通常有兩種方式分別為 聲明式注解緩存(Annotation-based Caching)命令式編程(Imperative Caching with RedisTemplate),接下來就談?wù)勎覍@兩種方法的理解及其運用

提示:通過我的RedisCacheConfig文件序列化后,我們在redis數(shù)據(jù)庫中的對象就是字符串類型的方式來存儲

1.聲明式注解緩存(Annotation-based Caching)

核心思想
通過 AOP(面向切面編程)實現(xiàn),開發(fā)者通過注解聲明緩存行為,由框架自動完成緩存的讀寫和失效管理。

應(yīng)用示例

(1) 讀取數(shù)據(jù)優(yōu)先緩存

@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
public User getUserById(Long id) {
    return userRepository.findById(id).orElse(null);
}

原理:

方法執(zhí)行前檢查 userCache::id 是否存在(

value = "userCache"
標(biāo)識該緩存屬于名為userCache的緩存區(qū)(Cache Region),對應(yīng)Redis中的鍵前綴(如userCache::1)

key = "#id"
使用SpEL表達式定義緩存鍵,此處表示用方法參數(shù)id的值作為鍵的后綴

存在則直接返回緩存值

不存在則執(zhí)行方法體,將結(jié)果存入緩存

unless 確??罩挡痪彺妫ǚ乐咕彺娲┩福?/p>

(2) 更新數(shù)據(jù)后刷新緩存

@CachePut(value = "userCache", key = "#user.id")
public User updateUser(User user) {
    return userRepository.save(user); // 強制更新緩存
}

原理

  • 無論緩存是否存在,始終執(zhí)行方法體
  • 將返回結(jié)果覆蓋舊緩存

(3) 刪除數(shù)據(jù)后清理緩存

@CacheEvict(value = "userCache", key = "#id", beforeInvocation = true)
public void deleteUser(Long id) {
    userRepository.deleteById(id);
}

原理

  • beforeInvocation = true 表示在方法執(zhí)行前刪除緩存(避免方法執(zhí)行失敗導(dǎo)致緩存殘留)

2.命令式編程緩存(Imperative Caching with RedisTemplate)

核心思想

通過 RedisTemplate 直接操作 Redis 的 API,開發(fā)者需手動控制緩存邏輯,靈活性更高。

首先要配置一個RedisTemplate

import org.springframework.context.annotation.Bean;  
import org.springframework.context.annotation.Configuration;  
import org.springframework.data.redis.connection.RedisConnectionFactory;  
import org.springframework.data.redis.core.RedisTemplate;  
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;  
import org.springframework.data.redis.serializer.StringRedisSerializer;  
@Configuration  
public class RedisConfig {  
    @Bean  
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {  
        RedisTemplate<String, Object> template = new RedisTemplate<>();  
        template.setConnectionFactory(redisConnectionFactory);  
        // 設(shè)置 key 序列化器  
        template.setKeySerializer(new StringRedisSerializer());  
        // 設(shè)置 value 序列化器  
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());  
        template.afterPropertiesSet();  
        return template;  
    }  
}

RedisTemplate 是 Spring Data Redis 提供的一個用于操作 Redis 的模板類。它包含了很多操作 Redis 的方法,主要分為以下幾類:
通用操作
hasKey(K key): 檢查 key 是否存在。
delete(K key): 刪除 key。
delete(Collection<K> keys): 批量刪除 keys。
expire(K key, long timeout, TimeUnit unit): 設(shè)置 key 的過期時間。
expireAt(K key, Date date): 設(shè)置 key 在指定時間過期。
keys(K pattern): 查找所有符合給定模式 pattern 的 key。
move(K key, int dbIndex): 將 key 移動到指定的數(shù)據(jù)庫。
randomKey(): 隨機返回一個 key。
rename(K oldKey, K newKey): 重命名 key。
type(K key): 返回 key 的類型。
字符串操作
opsForValue(): 獲取字符串操作對象,進而可以使用如 set, get, increment, decrement 等方法。
列表操作
opsForList(): 獲取列表操作對象,進而可以使用如 leftPush, rightPush, range, size 等方法。
集合操作
opsForSet(): 獲取集合操作對象,進而可以使用如 add, members, size, isMember 等方法。
有序集合操作
opsForZSet(): 獲取有序集合操作對象,進而可以使用如 add, range, rangeByScore, score 等方法。
哈希操作
opsForHash(): 獲取哈希操作對象,進而可以使用如 put, get, entries, keys, values 等方法。
事務(wù)操作
execute(RedisCallback<T> action): 執(zhí)行一個 RedisCallback。
executePipelined(RedisCallback<T> action): 以管道的方式執(zhí)行多個命令。
multi(): 標(biāo)記事務(wù)開始。
exec(): 執(zhí)行所有事務(wù)塊內(nèi)的命令。
這些方法提供了對 Redis 數(shù)據(jù)結(jié)構(gòu)的基本操作,可以滿足大部分的使用場景。需要注意的是,這些操作都是同步的,如果需要異步操作,可以使用 RedisTemplate 的異步版本 StringRedisTemplate。

應(yīng)用示例

(1) 手動緩存讀取與寫入

public User getUserById(Long id) {
    // 生成緩存鍵,格式為 "user:{id}"(如 "user:123")
    String cacheKey = "user:" + id;
    // 獲取 Redis 的 String 類型操作接口
    ValueOperations<String, User> ops = redisTemplate.opsForValue();
    // 嘗試從 Redis 中獲取緩存數(shù)據(jù)
    User user = ops.get(cacheKey);
    // 緩存未命中(包含空值標(biāo)記的情況)
    if (user == null) {
        // 穿透到數(shù)據(jù)庫查詢真實數(shù)據(jù)
        user = userRepository.findById(id).orElse(null);
        if (user != null) {
            // 數(shù)據(jù)庫存在數(shù)據(jù):寫入緩存并設(shè)置 30 分鐘過期時間
            ops.set(cacheKey, user, Duration.ofMinutes(30)); 
        } else {
            // 數(shù)據(jù)庫不存在數(shù)據(jù):寫入特殊空值標(biāo)記,設(shè)置 5 分鐘較短過期時間
            // 使用 new NullValue() 而非 null 是為了區(qū)分:
            // 1. 真實緩存空值(防止穿透)
            // 2. Redis 未存儲該鍵(真正的緩存未命中)
            ops.set(cacheKey, new NullValue(), Duration.ofMinutes(5));
        }
    }
    // 返回前進行空值標(biāo)記判斷
    return user instanceof NullValue ? null : user;
}

特點:

完全手動控制緩存邏輯

可精細處理空值緩存和 TTL

(2) 操作復(fù)雜數(shù)據(jù)結(jié)構(gòu)(Hash)

public void updateUserProfile(Long userId, Map<String, String> profile) {
    String hashKey = "userProfiles";
    redisTemplate.opsForHash().putAll(hashKey, profile);
    // 設(shè)置整個 Hash 的過期時間
    redisTemplate.expire(hashKey, Duration.ofHours(24));
}

3.兩種方式的深度對比

維度聲明式注解緩存 (@Cacheable 等)命令式編程緩存 (RedisTemplate)
抽象層級高層抽象,屏蔽緩存實現(xiàn)細節(jié)底層操作,直接面向 Redis API
代碼侵入性無侵入(通過注解實現(xiàn))顯式代碼調(diào)用
靈活性有限(受限于注解參數(shù))極高(可自由操作所有 Redis 命令)
數(shù)據(jù)結(jié)構(gòu)支持僅支持簡單鍵值對(通過序列化)支持所有 Redis 數(shù)據(jù)結(jié)構(gòu)(Hash/List 等)
事務(wù)支持與 Spring 事務(wù)管理集成需手動使用 multi/exec 或 SessionCallback
異常處理統(tǒng)一通過 CacheErrorHandler需自行 try-catch
緩存策略配置集中式配置(通過 RedisCacheManager分散在代碼各處
性能優(yōu)化自動批量化(部分實現(xiàn)支持)分散在代碼各處

最后 關(guān)鍵場景選擇建議

(1) 優(yōu)先使用注解的場景
簡單的 CRUD 緩存需求

需要快速實現(xiàn)緩存邏輯

希望代碼保持簡潔(如業(yè)務(wù)層方法只需關(guān)注核心邏輯)

需要兼容多緩存后端(如同時支持 Redis 和本地緩存)

(2) 必須使用命令式的場景
操作 Redis 特有數(shù)據(jù)結(jié)構(gòu)(如 GEO、HyperLogLog)

實現(xiàn)分布式鎖、限流等高級功能

需要精細控制每個操作的 TTL

使用事務(wù)、Pipeline 等 Redis 特性

到此這篇關(guān)于redis在springboot中做緩存操作的兩種方法的文章就介紹到這了,更多相關(guān)redis springboot緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Redis主從集群切換數(shù)據(jù)丟失的解決方案

    Redis主從集群切換數(shù)據(jù)丟失的解決方案

    這篇文章主要介紹了Redis主從集群切換數(shù)據(jù)丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Redis中實現(xiàn)查找某個值的范圍

    Redis中實現(xiàn)查找某個值的范圍

    這篇文章主要介紹了Redis中實現(xiàn)查找某個值的范圍,本文的題引來了Redis作者Salvatore Sanfilippo(@antirez)的回答,比較經(jīng)典,需要的朋友可以參考下
    2015-06-06
  • hiredis從安裝到項目實戰(zhàn)操作

    hiredis從安裝到項目實戰(zhàn)操作

    這篇文章主要介紹了hiredis從安裝到項目實戰(zhàn)操作,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • redis慢查詢?nèi)罩镜脑L問和管理方式

    redis慢查詢?nèi)罩镜脑L問和管理方式

    這篇文章主要介紹了redis慢查詢?nèi)罩镜脑L問和管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Redis BGSAVE 內(nèi)存不足異常完美解決方案

    Redis BGSAVE 內(nèi)存不足異常完美解決方案

    這篇文章詳細介紹了Redis BGSAVE內(nèi)存不足異常的解決方案,包括緊急恢復(fù)、根本修復(fù)和長期優(yōu)化三個方面,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 如何使用docker?compose一鍵部署redis服務(wù)

    如何使用docker?compose一鍵部署redis服務(wù)

    這篇文章主要介紹了如何使用Docker和docker-compose搭建Redis服務(wù),包括創(chuàng)建安裝目錄、配置文件、啟動服務(wù)、查看狀態(tài)、登錄驗證、連接測試和查看信息等步驟,需要的朋友可以參考下
    2025-02-02
  • redis 限制內(nèi)存使用大小的實現(xiàn)

    redis 限制內(nèi)存使用大小的實現(xiàn)

    這篇文章主要介紹了redis 限制內(nèi)存使用大小的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 淺談Redis常見延遲問題定位與分析

    淺談Redis常見延遲問題定位與分析

    大部分時候,redis延遲很低,但是在某些時刻,有些redis實例會出現(xiàn)很高的響應(yīng)延時,本文主要介紹了淺談Redis常見延遲問題定位與分析,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • Redis中的GEO詳解

    Redis中的GEO詳解

    Redis GEO是一個輕量級的地理位置解決方案,適合需要快速存儲和查詢位置數(shù)據(jù)的場景,本文給大家介紹Redis的GEO詳解,感興趣的朋友一起看看吧
    2025-06-06
  • 如何利用Redis分布式鎖實現(xiàn)控制并發(fā)操作

    如何利用Redis分布式鎖實現(xiàn)控制并發(fā)操作

    這篇文章主要介紹了如何利用Redis分布式鎖實現(xiàn)控制并發(fā)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

抚顺市| 黄石市| 尉犁县| 玉林市| 梁山县| 平度市| 马山县| 云林县| 广昌县| 邵阳市| 瑞金市| 铜山县| 保德县| 曲阳县| 泰州市| 宁城县| 宽甸| 疏勒县| 丁青县| 濮阳市| 涪陵区| 上栗县| 河西区| 普宁市| 中方县| 澎湖县| 正阳县| 本溪| 临朐县| 兰坪| 日喀则市| 日土县| 保靖县| 洛浦县| 广元市| 偏关县| 大庆市| 若羌县| 台中市| 绵阳市| 海南省|