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

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

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

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

一.進(jìn)行redis的安裝與開啟(簡(jiǎn)略)

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

默認(rèn)已安裝完redis

二.進(jìn)行依賴引入和配置文件搭建

依賴

<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主機(jī)的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以及加注解

在主啟動(dòng)類添加@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)); // 默認(rèn)過(guò)期時(shí)間30分鐘
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .withCacheConfiguration("userCache", RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(10))) // 自定義緩存過(guò)期
                .transactionAware()
                .build();
    }
}

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

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

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

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

四.接下來(lái)就是要進(jìn)行緩存管理

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

提示:通過(guò)我的RedisCacheConfig文件序列化后,我們?cè)趓edis數(shù)據(jù)庫(kù)中的對(duì)象就是字符串類型的方式來(lái)存儲(chǔ)

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

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

應(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)識(shí)該緩存屬于名為userCache的緩存區(qū)(Cache Region),對(duì)應(yīng)Redis中的鍵前綴(如userCache::1)

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

存在則直接返回緩存值

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

unless 確保空值不緩存(防止緩存穿透)

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

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

原理

  • 無(wú)論緩存是否存在,始終執(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)

核心思想

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

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

應(yīng)用示例

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

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ù)庫(kù)查詢真實(shí)數(shù)據(jù)
        user = userRepository.findById(id).orElse(null);
        if (user != null) {
            // 數(shù)據(jù)庫(kù)存在數(shù)據(jù):寫入緩存并設(shè)置 30 分鐘過(guò)期時(shí)間
            ops.set(cacheKey, user, Duration.ofMinutes(30)); 
        } else {
            // 數(shù)據(jù)庫(kù)不存在數(shù)據(jù):寫入特殊空值標(biāo)記,設(shè)置 5 分鐘較短過(guò)期時(shí)間
            // 使用 new NullValue() 而非 null 是為了區(qū)分:
            // 1. 真實(shí)緩存空值(防止穿透)
            // 2. Redis 未存儲(chǔ)該鍵(真正的緩存未命中)
            ops.set(cacheKey, new NullValue(), Duration.ofMinutes(5));
        }
    }
    // 返回前進(jìn)行空值標(biāo)記判斷
    return user instanceof NullValue ? null : user;
}

特點(diǎn):

完全手動(dòng)控制緩存邏輯

可精細(xì)處理空值緩存和 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è)置整個(gè) Hash 的過(guò)期時(shí)間
    redisTemplate.expire(hashKey, Duration.ofHours(24));
}

3.兩種方式的深度對(duì)比

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

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

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

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

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

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

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

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

需要精細(xì)控制每個(gè)操作的 TTL

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    淺談Redis常見(jiàn)延遲問(wèn)題定位與分析

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

    Redis中的GEO詳解

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

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

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

最新評(píng)論

恭城| 炉霍县| 芮城县| 葫芦岛市| 石林| 广平县| 宜昌市| 山东省| 肥西县| 梁平县| 郸城县| 富阳市| 城步| 名山县| 资中县| 咸宁市| 肇庆市| 合川市| 永吉县| 礼泉县| 武汉市| 黔南| 清涧县| 济宁市| 蚌埠市| 萨迦县| 金湖县| 侯马市| 团风县| 南华县| 扶沟县| 哈密市| 沐川县| 晋州市| 理塘县| 南涧| 芜湖市| 随州市| 罗甸县| 游戏| 芒康县|