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

詳解如何使用SpringBoot的緩存@Cacheable

 更新時間:2023年06月27日 11:28:40   作者:小石讀史  
這篇文章主要為大家介紹了如何使用SpringBoot的緩存@Cacheable詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

緩存介紹

Spring 從 3.1 開始就引入了對 Cache 的支持。定義了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口來統(tǒng)一不同的緩存技術(shù)。并支持使用 JCache(JSR-107)注解簡化我們的開發(fā)。

其使用方法和原理都類似于 Spring 對事務管理的支持。Spring Cache 是作用在方法上的,其核心思想是,當我們在調(diào)用一個緩存方法時會把該方法參數(shù)和返回結(jié)果作為一個鍵值對存在緩存中。

Cache 和 CacheManager 接口說明

Cache 接口包含緩存的各種操作集合,你操作緩存就是通過這個接口來操作的。

Cache 接口下 Spring 提供了各種 xxxCache 的實現(xiàn),比如:RedisCache、EhCache、ConcurrentMapCache

CacheManager 定義了創(chuàng)建、配置、獲取、管理和控制多個唯一命名的 Cache。這些 Cache 存在于 CacheManager 的上下文中。

小結(jié):

每次調(diào)用需要緩存功能的方法時,Spring 會檢查指定參數(shù)的指定目標方法是否已經(jīng)被調(diào)用過,如果有就直接從緩存中獲取方法調(diào)用后的結(jié)果,如果沒有就調(diào)用方法并緩存結(jié)果后返回給用戶。下次調(diào)用直接從緩存中獲取。

二、@Cacheable 注解使用詳細介紹

@Cacheable 這個注解,用它就是為了使用緩存的。所以我們可以先說一下緩存的使用步驟:

緩存使用步驟

1、開啟基于注解的緩存,使用 @EnableCaching 標識在 SpringBoot 的主啟動類上。

2、標注緩存注解即可

① 第一步:開啟基于注解的緩存,使用 @EnableCaching 標注在 springboot 主啟動類上

@EnableSwagger2
@EnableScheduling
@EnableFeignClients(basePackages = {"src.main.biz.smallProject.client","com.codingapi.tx"})
@EnableJpaRepositories(basePackages = {"src.main.biz.smallProject.web.*.dao","src.main.newgrand.framework.common.dao" })
@EntityScan(basePackages = { "src.main.biz.smallProject.web.*.entity","src.main.newgrand.framework.common.domain"})
@EnableCaching
public class StartApp {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(StartApp.class);
        new SpringUtil().setApplicationContext(context);
    }
}

② 第二步:標注緩存注解

package src.main.biz.smallProject.web.cost.service.impl;
import com.querydsl.core.BooleanBuilder;
import com.querydsl.core.QueryResults;
import com.querydsl.core.types.Projections;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import src.main.biz.smallProject.utils.CollectionUtils;
import src.main.biz.smallProject.web.construct.form.IdsForm;
import src.main.biz.smallProject.web.cost.dao.BusinessScopeJPA;
import src.main.biz.smallProject.web.cost.entity.BusinessScopeEntity;
import src.main.biz.smallProject.web.cost.entity.QBusinessScopeEntity;
import src.main.biz.smallProject.web.cost.form.BusinessScopeForm;
import src.main.biz.smallProject.web.cost.form.BusinessScopeQueryForm;
import src.main.biz.smallProject.web.cost.service.BusinessScopeService;
import src.main.biz.smallProject.web.cost.vo.BusinessScopeVO;
import src.main.newgrand.framework.common.constants.PageData;
import src.main.newgrand.framework.common.exception.BusinessException;
import src.main.newgrand.framework.common.service.impl.BaseServiceImpl;
import src.main.newgrand.framework.common.utils.ResultRes;
import java.time.LocalDateTime;
import java.util.List;
import static src.main.biz.smallProject.redis.CacheConstants.BUSINESS_SCOPE_CACHE;
/**
 * @Description
 * @Author    yql
 * @Date 2022-05-10 10:44:29 */
@Service
public class BusinessScopeServiceImpl extends BaseServiceImpl<BusinessScopeJPA, BusinessScopeEntity, BusinessScopeVO> implements BusinessScopeService {
    @Autowired
    private JPAQueryFactory jpaQueryFactory;
    QBusinessScopeEntity qBusinessScopeEntity = QBusinessScopeEntity.businessScopeEntity;
    @Autowired
    private BusinessScopeService businessScopeService;
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    @CacheEvict(cacheNames = {BUSINESS_SCOPE_CACHE}, allEntries = true)
    public ResultRes add(BusinessScopeForm form) {
        BusinessScopeEntity businessScopeEntity = new BusinessScopeEntity();
        BeanUtils.copyProperties(form,businessScopeEntity);
        businessScopeService.save(businessScopeEntity);
        return ResultRes.success();
    }
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    @CacheEvict(cacheNames = {BUSINESS_SCOPE_CACHE}, allEntries = true)
    public ResultRes update(BusinessScopeForm form) {
        BusinessScopeEntity businessScopeEntity = findById(form.getPhid());
        if(businessScopeEntity == null){
            throw new BusinessException("數(shù)據(jù)不存在,請檢查!");
        }
        BeanUtils.copyProperties(form,businessScopeEntity);
        businessScopeService.updateSelectiveById(businessScopeEntity);
        return ResultRes.success();
    }
    @Override
    @Cacheable(cacheNames = BUSINESS_SCOPE_CACHE, key = "{ " + "#root.methodName, #form.status}", unless = "#result == null")
    public ResultRes<PageData> list(BusinessScopeQueryForm form) {
        long currPage = form.getCurrent();
        long size = form.getSize();
        BooleanBuilder booleanBuilder = new BooleanBuilder();
        booleanBuilder.and(qBusinessScopeEntity.phDelflag.eq(0L));
        if(form.getStatus() != null){
            booleanBuilder.and(qBusinessScopeEntity.status.eq(form.getStatus()));
        }
        QueryResults<BusinessScopeVO> results = jpaQueryFactory
                .select(Projections.bean(
                        BusinessScopeVO.class,
                        qBusinessScopeEntity.phid,
                        qBusinessScopeEntity.name,
                        qBusinessScopeEntity.status))
                .from(qBusinessScopeEntity)
                .where(booleanBuilder)
                .orderBy(qBusinessScopeEntity.phInsertDt.desc())
                .offset((currPage - 1) * size)
                .limit(size).fetchResults();
        PageData pageData = new PageData(results.getResults(), results.getTotal(), size, currPage);
        return ResultRes.success(pageData);
    }
    @Override
    @Transactional(rollbackFor = BusinessException.class)
    @CacheEvict(cacheNames = {BUSINESS_SCOPE_CACHE}, allEntries = true)
    public ResultRes deleteData(IdsForm form) {
        List<Long> ids = form.getIds();
        List<BusinessScopeEntity> businessScopeEntityList = queryFactory.selectFrom(qBusinessScopeEntity)
                .where(qBusinessScopeEntity.phid.in(ids).and(qBusinessScopeEntity.phDelflag.eq(0L)))
                .fetch();
        if(CollectionUtils.isEmpty(businessScopeEntityList)){
            throw new BusinessException("數(shù)據(jù)不存在,請檢查!");
        }
        queryFactory.update(qBusinessScopeEntity)
                .set(qBusinessScopeEntity.phDelflag, 1L)
                .set(qBusinessScopeEntity.phUpdateDt, LocalDateTime.now())
                .where(qBusinessScopeEntity.phid.in(ids))
                .execute();
        return ResultRes.success();
    }
}

常用屬性說明

cacheNames/value :用來指定緩存組件的名字

key :緩存數(shù)據(jù)時使用的 key,可以用它來指定。默認是使用方法參數(shù)的值。(這個 key 你可以使用 spEL 表達式來編寫)

keyGenerator :key 的生成器。 key 和 keyGenerator 二選一使用

cacheManager :可以用來指定緩存管理器。從哪個緩存管理器里面獲取緩存。

condition :可以用來指定符合條件的情況下才緩存

unless :否定緩存。當 unless 指定的條件為 true ,方法的返回值就不會被緩存。當然你也可以獲取到結(jié)果進行判斷。(通過 #result 獲取方法結(jié)果)

sync :是否使用異步模式。

spEL 編寫 key

前面說過,緩存的 key 支持使用 spEL 表達式去編寫,下面總結(jié)一下使用 spEL 去編寫 key 可以用的一些元數(shù)據(jù):

以上就是詳解如何使用SpringBoot的緩存@Cacheable的詳細內(nèi)容,更多關(guān)于SpringBoot緩存@Cacheable的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mybatis配置文件之動態(tài)SQL配置備忘錄

    Mybatis配置文件之動態(tài)SQL配置備忘錄

    這篇文章主要介紹了Mybatis配置文件之動態(tài)SQL配置備忘錄的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • JMM核心概念之Happens-before原則

    JMM核心概念之Happens-before原則

    關(guān)于Java并發(fā)的通信機制是基于共享內(nèi)存實現(xiàn)的,線程之間共享程序的公共狀態(tài),通過寫-讀內(nèi)存中的公共狀態(tài)進行隱式通信,這對程序員是透明的,我們需要理解其工作機制,以防止內(nèi)存可見性問題,從而編寫出正確同步的代碼
    2021-06-06
  • 詳解java 三種調(diào)用機制(同步、回調(diào)、異步)

    詳解java 三種調(diào)用機制(同步、回調(diào)、異步)

    這篇文章主要介紹了java 三種調(diào)用機制(同步、回調(diào)、異步),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • java map中相同的key保存多個value值方式

    java map中相同的key保存多個value值方式

    這篇文章主要介紹了java map中相同的key保存多個value值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • RocketMQ集群消費與廣播消費模式

    RocketMQ集群消費與廣播消費模式

    這篇文章主要介紹了RocketMQ集群消費與廣播消費模式,消息隊列RocketMQ版支持集群消費和廣播消費,本文介紹集群消費和廣播消費的基本概念、適用場景、功能差異、注意事項以及設(shè)置方式
    2023-02-02
  • Java 圖文并茂講解主方法中的String[] args參數(shù)作用

    Java 圖文并茂講解主方法中的String[] args參數(shù)作用

    很多老鐵不清楚JAVA主方法中main()里面的的參數(shù)是什么意思,以及有什么作用,接下來給大家用最通俗易懂的話來講解,還不清楚的朋友來看看吧
    2022-04-04
  • Java實現(xiàn)螺旋矩陣的示例

    Java實現(xiàn)螺旋矩陣的示例

    這篇文章主要介紹了Java實現(xiàn)螺旋矩陣的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • SpringBoot+Spring Security無法實現(xiàn)跨域的解決方案

    SpringBoot+Spring Security無法實現(xiàn)跨域的解決方案

    這篇文章主要介紹了SpringBoot+Spring Security無法實現(xiàn)跨域的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 基于Java SSM框架實現(xiàn)簡易的評教系統(tǒng)

    基于Java SSM框架實現(xiàn)簡易的評教系統(tǒng)

    這篇文章主要介紹了通過Java SSM框架實現(xiàn)一個簡易的評教系統(tǒng)的示例代碼,文中的代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-02-02
  • 解決Idea運行junit測試時報Error:[3,17]?程序包org.junit不存在的問題

    解決Idea運行junit測試時報Error:[3,17]?程序包org.junit不存在的問題

    這篇文章主要介紹了Idea運行junit測試時報Error:[3,17]?程序包org.junit不存在解決方法,本文給大家分享兩種解決辦法,需要的朋友可以參考下
    2023-03-03

最新評論

松潘县| 若尔盖县| 鹤峰县| 克东县| 哈尔滨市| 金阳县| 马鞍山市| 托克逊县| 驻马店市| 大渡口区| 新乐市| 广平县| 曲沃县| 嘉兴市| 天水市| 洮南市| 许昌县| 萨嘎县| 尼勒克县| 林州市| 恩平市| 个旧市| 新邵县| 曲阜市| 济源市| 靖江市| 基隆市| 山东省| 襄垣县| 镇远县| 岳池县| 古丈县| 巫山县| 平和县| 大洼县| 鄂伦春自治旗| 东平县| 永靖县| 石渠县| 视频| 安新县|