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

SpringBoot集成cache緩存的實(shí)現(xiàn)

 更新時(shí)間:2021年06月11日 08:28:33   作者:huanzi-qch  
日常開發(fā)中,緩存是解決數(shù)據(jù)庫壓力的一種方案,本文記錄springboot中使用cache緩存。需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

  日常開發(fā)中,緩存是解決數(shù)據(jù)庫壓力的一種方案,通常用于頻繁查詢的數(shù)據(jù),例如新聞中的熱點(diǎn)新聞,本文記錄springboot中使用cache緩存。

  官方文檔介紹:https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-caching-provider-generic

工程結(jié)構(gòu)

代碼編寫

  pom引入依賴,引入cache緩存,數(shù)據(jù)庫使用mysql,ORM框架用jpa

<!--添加springdata-cache依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

        <!-- 引入ehcache支持 -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
        </dependency>

        <!--添加springdata-jpa依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!--添加MySQL驅(qū)動(dòng)依賴 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

  配置文件

server.port=10010
spring.application.name=springboot-cache

spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:/ehcache.xml

  ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" updateCheck="false">

    <!-- 磁盤緩存位置 -->
    <diskStore path="java.io.tmpdir"/>

    <!-- maxEntriesLocalHeap:堆內(nèi)存中最大緩存對象數(shù),0沒有限制 -->
    <!-- maxElementsInMemory: 在內(nèi)存中緩存的element的最大數(shù)目。-->
    <!-- eternal:elements是否永久有效,如果為true,timeouts將被忽略,element將永不過期 -->
    <!-- timeToIdleSeconds:發(fā)呆秒數(shù),發(fā)呆期間未訪問緩存立即過期,當(dāng)eternal為false時(shí),這個(gè)屬性才有效,0為不限制 -->
    <!-- timeToLiveSeconds:總存活秒數(shù),當(dāng)eternal為false時(shí),這個(gè)屬性才有效,0為不限制 -->
    <!-- overflowToDisk: 如果內(nèi)存中數(shù)據(jù)超過內(nèi)存限制,是否要緩存到磁盤上 -->
    <!-- statistics:是否收集統(tǒng)計(jì)信息。如果需要監(jiān)控緩存使用情況,應(yīng)該打開這個(gè)選項(xiàng)。默認(rèn)為關(guān)閉(統(tǒng)計(jì)會(huì)影響性能)。設(shè)置statistics="true"開啟統(tǒng)計(jì) -->

    <!--
        默認(rèn)緩存
        無過期時(shí)間,但 600 秒內(nèi)無人訪問緩存立即過期
    -->
    <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="600"
            timeToLiveSeconds="0"
            overflowToDisk="false">
    </defaultCache>

    <!--
        xx業(yè)務(wù)緩存
        在有效的 120 秒內(nèi),如果連續(xù) 60 秒未訪問緩存,則緩存失效。
        就算有訪問,也只會(huì)存活 120 秒。
    -->
    <cache name="myCache"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="120"
           timeToLiveSeconds="0"
           overflowToDisk="false">
    </cache>
</ehcache>

  先寫一個(gè)套tb_user表的CRUD代碼

@RestController
@RequestMapping("/tbUser/")
public class TbUserController {
    @Autowired
    private TbUserService tbUserService;

    //方便測試暫時(shí)改成GetMapping
    @GetMapping("list")
//    @PostMapping("list")
    public List<TbUser> list(TbUser entityVo) {
        return tbUserService.list(entityVo);
    }

    @GetMapping("get/{id}")
    public TbUser get(@PathVariable("id")Integer id) {
        return tbUserService.get(id);
    }

    //方便測試暫時(shí)改成GetMapping
    @GetMapping("save")
//    @PostMapping("save")
    public TbUser save(TbUser entityVo) {
        return tbUserService.save(entityVo);
    }

    @GetMapping("delete/{id}")
    public Integer delete( @PathVariable("id") Integer id) {
        return tbUserService.delete(id);
    }
}

  opjo實(shí)體類要實(shí)現(xiàn)序列化

@Entity
@Table(name = "tb_user")
@Data
public class TbUser implements Serializable {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer id;//表id

    private String username;//用戶名

    private String password;//密碼

    private Date created;//創(chuàng)建時(shí)間

    private Integer descriptionId;//關(guān)聯(lián)詳情id
}

  serviceImpl中,使用注解來開啟緩存

@Service
@Transactional
@CacheConfig(cacheNames = {"myCache"})
public class TbUserServiceImpl implements TbUserService{

    @PersistenceContext
    private EntityManager em;

    @Autowired
    private TbUserRepository tbUserRepository;

    //@Cacheable緩存數(shù)據(jù):key為userList,value為返回值List<TbUser>
    @Cacheable(key = "'userList'")
    @Override
    public List<TbUser> list(TbUser entityVo) {
        System.out.println("獲取list用戶列表緩存數(shù)據(jù),"+new Date());
        return tbUserRepository.findAll(Example.of(entityVo));
    }

    //@Cacheable緩存數(shù)據(jù):key為參數(shù)id,value為返回值TbUser
    @Cacheable(key = "#id")
    @Override
    public TbUser get(Integer id) {
        System.out.println("獲取數(shù)據(jù)緩存,key:"+id);
        Optional<TbUser> optionalE = tbUserRepository.findById(id);
        if (!optionalE.isPresent()) {
            throw new RuntimeException("ID不存在!");
        }
        return optionalE.get();
    }

    //@CachePut緩存新增的或更新的數(shù)據(jù)到緩存,其中緩存的名稱為people,數(shù)據(jù)的key是person的id
    @CachePut(key = "#entityVo.id")
    // @CacheEvict從緩存中刪除key為參數(shù)userList的數(shù)據(jù)
    @CacheEvict(key = "'userList'")
    @Override
    public TbUser save(TbUser entityVo) {
        System.out.println("新增/更新緩存,key:"+entityVo.getId());
        //entityVo傳啥存啥,會(huì)全部更新
        return tbUserRepository.save(entityVo);
    }

    //清空所有緩存
    @CacheEvict(allEntries=true)
    @Override
    public Integer delete(Integer id) {
        System.out.println("清空所有緩存");
        tbUserRepository.deleteById(id);
        return id;
    }
}

  效果演示

  http://localhost:10010/tbUser/save?id=2&username=李四

  調(diào)用save方法,key為2,value為當(dāng)前tbUser對象的數(shù)據(jù)被緩存下來

  http://localhost:10010/tbUser/get/2

  當(dāng)我們調(diào)用get方法時(shí),直接獲取緩存數(shù)據(jù),控制臺(tái)啥也不打印,連serviceImpl的get方法都不進(jìn)去(可以打斷點(diǎn)調(diào)試)

  http://localhost:10010/tbUser/save?id=2&username=王五

  當(dāng)我們再次調(diào)用save方法更新username時(shí),緩存數(shù)據(jù)也被更新

  http://localhost:10010/tbUser/get/2

  再次調(diào)用get接口,直接返回緩存數(shù)據(jù),后臺(tái)也是方法都不進(jìn)去,啥也不打印

  http://localhost:10010/tbUser/delete/2

  調(diào)用delete接口,刪除數(shù)據(jù),同時(shí)刪除緩存

  再次調(diào)用get接口,發(fā)現(xiàn)緩存數(shù)據(jù)被清除,查詢數(shù)據(jù)庫

  http://localhost:10010/tbUser/list

  首次調(diào)用list接口,key為userList的,value為用戶集合數(shù)據(jù)被緩存下來,再次調(diào)用直接返回緩存數(shù)據(jù)

  當(dāng)調(diào)用save接口,數(shù)據(jù)更新,刪除key為userList的緩存,再次調(diào)用list時(shí),重新查庫并設(shè)置緩存

  我們配置了緩存發(fā)呆時(shí)間,當(dāng)120秒內(nèi)未使用該緩存,立即過期,一直用就會(huì)一直存在

  我們先同時(shí)訪問兩個(gè)接口list、get,list接口2分鐘后再次訪問,get接口不能超過2分鐘是不是訪問一下,結(jié)果如預(yù)期

  PS:原先使用了這個(gè)jar包,有報(bào)錯(cuò)

 <dependency>
      <groupId>org.ehcache</groupId>
      <artifactId>ehcache</artifactId>
      <version>3.8.1</version>
    </dependency> 

  后面改成用上面“代碼編寫”里pom中引的jnet.sf.ehcache下面的ar

后記

  緩存除了能緩解數(shù)據(jù)庫壓力,還能做用戶登錄狀態(tài)控制,例如:用戶登錄成功后cookie中保存頒發(fā)的token令牌設(shè)置永不過期,緩存存活時(shí)間也設(shè)置永不過期,發(fā)呆時(shí)間設(shè)置1天,這樣只有用戶在1天內(nèi)有訪問緩存接口,那他就可以一直保留登錄狀態(tài),直至有其他業(yè)務(wù)將token或者緩存清掉。

  springboot使用cache緩存暫時(shí)先記錄到這,后續(xù)有空再進(jìn)行補(bǔ)充。

代碼開源

  代碼已經(jīng)開源、托管到我的GitHub、碼云:

  GitHub:https://github.com/huanzi-qch/springBoot

  碼云:https://gitee.com/huanzi-qch/springBoot

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

相關(guān)文章

  • Java中常見的編碼集問題總結(jié)

    Java中常見的編碼集問題總結(jié)

    這篇文章主要為大家整理了一些Java中常見的編碼集問題,文中的示例代碼講解詳細(xì),對我們深入理解Java有一定的幫助,感興趣的小伙伴可以了解一下
    2023-02-02
  • 詳解如何讓Spring MVC顯示自定義的404 Not Found頁面

    詳解如何讓Spring MVC顯示自定義的404 Not Found頁面

    這篇文章主要介紹了詳解如何讓Spring MVC顯示自定義的404 Not Found頁面,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10
  • MybatisPlus如何自定義TypeHandler映射JSON類型為List

    MybatisPlus如何自定義TypeHandler映射JSON類型為List

    這篇文章主要介紹了MybatisPlus如何自定義TypeHandler映射JSON類型為List,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 分析并發(fā)編程之LongAdder原理

    分析并發(fā)編程之LongAdder原理

    LongAdder類是JDK1.8新增的一個(gè)原子性操作類。AtomicLong通過CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器來說性能已經(jīng)很好了,但是JDK開發(fā)組并不滿足于此,因?yàn)榉浅8悴l(fā)的請求下AtomicLong的性能是不能讓人接受的
    2021-06-06
  • 如何從eureka獲取服務(wù)的ip和端口號進(jìn)行Http的調(diào)用

    如何從eureka獲取服務(wù)的ip和端口號進(jìn)行Http的調(diào)用

    這篇文章主要介紹了如何從eureka獲取服務(wù)的ip和端口號進(jìn)行Http的調(diào)用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺析java修飾符訪問權(quán)限(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    淺析java修飾符訪問權(quán)限(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java有四種訪問權(quán)限,其中三種有訪問權(quán)限修飾符,分別為private,public和protected,還有一種不帶任何修飾符,下面通過本文給大家簡單介紹下java修飾符訪問權(quán)限相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2017-04-04
  • springboot如何使用sm2加密傳輸

    springboot如何使用sm2加密傳輸

    這篇文章主要介紹了springboot如何使用sm2加密傳輸問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • K均值聚類算法的Java版實(shí)現(xiàn)代碼示例

    K均值聚類算法的Java版實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了K均值聚類算法的Java版實(shí)現(xiàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 解決feign微服務(wù)間的文件上傳報(bào)錯(cuò)問題

    解決feign微服務(wù)間的文件上傳報(bào)錯(cuò)問題

    這篇文章主要介紹了解決feign微服務(wù)間的文件上傳報(bào)錯(cuò)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 淺談Java的Synchronized鎖原理和優(yōu)化

    淺談Java的Synchronized鎖原理和優(yōu)化

    這篇文章主要介紹了Java的Synchronized鎖原理和優(yōu)化,synchronized的作用是保證在同一時(shí)刻, 被修飾的代碼塊或方法只會(huì)有一個(gè)線程執(zhí)行,以達(dá)到保證并發(fā)安全的效果,需要的朋友可以參考下
    2023-05-05

最新評論

胶南市| 桓台县| 芦山县| 榕江县| 循化| 中阳县| 衡东县| 迭部县| 邵武市| 高安市| 晋宁县| 都匀市| 寻乌县| 襄汾县| 时尚| 金昌市| 绥江县| 古蔺县| 奈曼旗| 南丹县| 章丘市| 咸阳市| 项城市| 佛学| 宝丰县| 奈曼旗| 桂东县| 焉耆| 石河子市| 榆中县| 阜宁县| 资阳市| 本溪| 庐江县| 郯城县| 云安县| 黔西县| 英吉沙县| 乌兰察布市| 洛扎县| 西和县|