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

Spring Cache 整合 Redis 實(shí)現(xiàn)高效緩存的方法

 更新時(shí)間:2025年08月21日 10:00:14   作者:跟著豪哥學(xué)Java  
SpringCache是Spring框架的緩存抽象層,通過注解簡化緩存邏輯,支持Caffeine、EhCache、Redis等實(shí)現(xiàn),接下來通過本文給大家介紹Spring Cache整合Redis實(shí)現(xiàn)高效緩存的方法,感興趣的朋友跟隨小編一起看看吧

介紹

Spring Cache 是 Spring 框架提供的緩存抽象層,它簡化了在應(yīng)用中添加緩存功能的過程,允許開發(fā)者通過注解方式輕松實(shí)現(xiàn)緩存邏輯,而無需關(guān)注具體的緩存實(shí)現(xiàn)細(xì)節(jié)。

  1. 緩存抽象:Spring Cache 不直接提供緩存實(shí)現(xiàn),而是定義了一套接口(如 CacheCacheManager),支持多種緩存實(shí)現(xiàn)(如 Caffeine、EhCache、Redis 等)。
  2. 注解驅(qū)動(dòng):通過注解(如 @Cacheable、@CachePut、@CacheEvict)聲明緩存規(guī)則,無需手動(dòng)編寫緩存邏輯。
  3. 透明集成:緩存操作與業(yè)務(wù)邏輯解耦,開發(fā)者只需關(guān)注業(yè)務(wù)代碼。

常用注解

@Cacheable
標(biāo)記方法結(jié)果可被緩存。調(diào)用方法時(shí),先檢查緩存:

@Cacheable(value = "users", key = "#id")
public User getUserById(Long id) {
    // 從數(shù)據(jù)庫查詢用戶
    return userRepository.findById(id);
}

若緩存存在,直接返回緩存值,不執(zhí)行方法。

若緩存不存在,執(zhí)行方法并將結(jié)果存入緩存。

@CachePut
保證方法執(zhí)行,并將結(jié)果更新到緩存(常用于更新操作)。

@CachePut(value = "users", key = "#user.id")
public User updateUser(User user) {
    return userRepository.save(user);
}

@CacheEvict
移除緩存條目(常用于刪除操作)。

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

@Caching
組合多個(gè)緩存注解(如同時(shí)更新和刪除緩存)。

@Caching(
    put = @CachePut(value = "users", key = "#user.id"),
    evict = @CacheEvict(value = "userList", allEntries = true)
)
public User saveUser(User user) {
    return userRepository.save(user);
}

@CacheConfig
在類級(jí)別統(tǒng)一配置緩存屬性(如 valuekeyGenerator),簡化方法上的注解。

案例

  • 添加依賴(Maven):
        <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>
  • 啟用緩存
    在啟動(dòng)類添加 @EnableCaching 注解。
@SpringBootApplication
@EnableTransactionManagement //開啟注解方式的事務(wù)管理
@Slf4j
@EnableCaching//開啟緩存功能
public class SkyApplication {
    public static void main(String[] args) {
        SpringApplication.run(SkyApplication.class, args);
        log.info("server started");
    }
}
  • c端
    /**
     * 條件查詢
     *
     * @param categoryId
     * @return
     */
    @GetMapping("/list")
    @ApiOperation("根據(jù)分類id查詢套餐")
    @Cacheable(cacheNames = "setmealCache",key = "#categoryId")//key: setmealCache::categoryId
    public Result<List<Setmeal>> list(Long categoryId) {
        Setmeal setmeal = new Setmeal();
        setmeal.setCategoryId(categoryId);
        setmeal.setStatus(StatusConstant.ENABLE);

        List<Setmeal> list = setmealService.list(setmeal);
        return Result.success(list);
    }

  • 管理端
    /**
     * 新增套餐
     * @param setmealDTO
     * @return
     */
    @PostMapping
    @ApiOperation("新增套餐")
    @CacheEvict(cacheNames = "setmealCache",key = "#setmealDTO.categoryId")
    public Result save(@RequestBody SetmealDTO setmealDTO){
        log.info("新增套餐:{}",setmealDTO);
        setmealService.saveWithDish(setmealDTO);
        return Result.success();
    }
    /**
     * 刪除套餐
     * @param ids
     * @return
     */
    @DeleteMapping
    @ApiOperation("批量刪除套餐")
    @CacheEvict(cacheNames = "setmealCache",allEntries = true)
    public Result delete(@RequestParam List<Long> ids){
        log.info("批量刪除套餐:{}",ids);
        setmealService.deleteBatch(ids);
        return Result.success();
    }
    /**
     * 修改套餐起售停售狀態(tài)
     * @param status
     * @param id
     * @return
     */
    @PostMapping("/status/{status}")
    @ApiOperation("修改套餐起售停售狀態(tài)")
    @CacheEvict(cacheNames = "setmealCache",allEntries = true)
    public Result startOrStop(@PathVariable("status") Integer status, Long id){
        log.info("套餐起售或停售:{}",id);
        setmealService.startOrStop(status,id);
        return Result.success();
    }

注意事項(xiàng)

  • 緩存鍵生成:默認(rèn)使用方法參數(shù)生成鍵,可通過 key 屬性自定義(SpEL 表達(dá)式),或配置 KeyGenerator
  • 緩存穿透:可通過空值緩存(@Cacheable(unless = "#result == null"))避免。
  • 緩存更新:使用 @CachePut 確保緩存與數(shù)據(jù)源一致性,避免直接修改緩存。
  • 分布式緩存:在分布式系統(tǒng)中,推薦使用 Redis 等集中式緩存,避免本地緩存(如 Caffeine)的一致性問題。

通過 Spring Cache,開發(fā)者可以快速為應(yīng)用添加緩存能力,提升系統(tǒng)性能,同時(shí)保持代碼簡潔易維護(hù)。

到此這篇關(guān)于Spring Cache 整合 Redis 實(shí)現(xiàn)高效緩存的文章就介紹到這了,更多相關(guān)Spring Cache Redis 高效緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA配置碼云Gitee的使用詳解

    IDEA配置碼云Gitee的使用詳解

    這篇文章主要介紹了IDEA配置碼云Gitee的使用,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解SpringBoot定時(shí)任務(wù)功能

    詳解SpringBoot定時(shí)任務(wù)功能

    這篇文章主要介紹了SpringBoot定時(shí)任務(wù)功能詳細(xì)解析,這次的功能開發(fā)過程中也算是對其內(nèi)涵的進(jìn)一步了解,以后遇到定時(shí)任務(wù)的處理也更清晰,更有效率了,對SpringBoot定時(shí)任務(wù)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-05-05
  • Spring核心容器IOC原理實(shí)例解析

    Spring核心容器IOC原理實(shí)例解析

    這篇文章主要介紹了Spring核心容器IOC原理實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Spring的CorsFilter會(huì)失效的原因及解決方法

    Spring的CorsFilter會(huì)失效的原因及解決方法

    眾所周知CorsFilter是Spring提供的跨域過濾器,我們可能會(huì)做以下的配置,基本上就是允許任何跨域請求,我利用Spring的CorsFilter做跨域操作但是出現(xiàn)報(bào)錯(cuò),接下來小編就給大家介紹一Spring的CorsFilter會(huì)失效的原因及解決方法,需要的朋友可以參考下
    2023-09-09
  • 詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用

    詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用

    這篇文章主要介紹了詳解自定義SpringMVC的Http信息轉(zhuǎn)換器的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot3.x循環(huán)依賴問題解決方案

    SpringBoot3.x循環(huán)依賴問題解決方案

    這篇文章主要介紹了SpringBoot3.x循環(huán)依賴的相關(guān)知識(shí),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • 源碼解析Spring 數(shù)據(jù)庫異常抽理知識(shí)點(diǎn)總結(jié)

    源碼解析Spring 數(shù)據(jù)庫異常抽理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享了關(guān)于源碼解析Spring 數(shù)據(jù)庫異常抽理知識(shí)點(diǎn)內(nèi)容,對此有需要的朋友們學(xué)習(xí)參考下。
    2019-05-05
  • Spring?+?ECharts實(shí)現(xiàn)數(shù)據(jù)可視化的案例詳解

    Spring?+?ECharts實(shí)現(xiàn)數(shù)據(jù)可視化的案例詳解

    Apache?ECharts是一個(gè)基于?JavaScript?的開源可視化圖表庫,在網(wǎng)頁上實(shí)現(xiàn)數(shù)據(jù)的可視化,非常好用,本文將通過一個(gè)簡單的demo來給大家介紹一下Spring?+?ECharts如何數(shù)據(jù)可視化,需要的朋友可以參考下
    2023-07-07
  • Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換教程

    Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換教程

    這篇文章主要為大家介紹了Spring常用注解及http數(shù)據(jù)轉(zhuǎn)換原理以及接收復(fù)雜嵌套對象參數(shù)與Http數(shù)據(jù)轉(zhuǎn)換的原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java?JWT實(shí)現(xiàn)跨域身份驗(yàn)證方法詳解

    Java?JWT實(shí)現(xiàn)跨域身份驗(yàn)證方法詳解

    JWT(JSON?Web?Token)是目前流行的跨域認(rèn)證解決方案,是一個(gè)開放標(biāo)準(zhǔn)(RFC?7519),它定義了一種緊湊的、自包含的方式,用于作為JSON對象在各方之間安全地傳輸信息。本文將介紹JWT如何實(shí)現(xiàn)跨域身份驗(yàn)證,感興趣的可以學(xué)習(xí)一下
    2022-01-01

最新評論

周口市| 清徐县| 辽宁省| 灵台县| 左云县| 敖汉旗| 巴彦淖尔市| 蛟河市| 余干县| 德州市| 兴宁市| 公安县| 博罗县| 卫辉市| 齐河县| 长乐市| 桐乡市| 怀仁县| 伊金霍洛旗| 兴安县| 宁陵县| 大庆市| 海门市| 浦东新区| 沧州市| 左贡县| 双桥区| 盐亭县| 观塘区| 泰安市| 黑河市| 旺苍县| 乌兰浩特市| 若尔盖县| 郎溪县| 普定县| 定陶县| 西乡县| 祁东县| 廊坊市| 安徽省|