国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

springboot:緩存不止redis,學會使用本地緩存ehcache

這篇具有很好參考價值的文章主要介紹了springboot:緩存不止redis,學會使用本地緩存ehcache。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

0. 引言

隨著redis的普及,更多的同學對redis分布式緩存更加熟悉,但在一些實際場景中,其實并不需要用到redis,使用更加簡單的本地緩存即可實現(xiàn)我們的緩存需求。

今天,我們一起來看看本地緩存組件ehcache

1. ehcache簡介

1.1 簡介

ehcache是基于java開發(fā)的本地緩存組件,無需單獨安裝部署,只要引入jar包就可利用它來實現(xiàn)緩存。

所謂本地緩存,就是指存儲在JVM堆內(nèi)存中的臨時緩存數(shù)據(jù),當然ehcache本身也支持Off-Heap Store機制來使用堆外內(nèi)存,本地緩存相較于redis性能和響應速度更高。

Ehcache的本地緩存還支持過期時間、最大容量、持久化等特性,使得它可以適用于各種不同的緩存場景。

官方文檔地址:https://www.ehcache.org/documentation/

1.2 本地緩存與redis的區(qū)別

本地緩存與redis的區(qū)別在于:

  • 架構:

    本地緩存基于單機架構,即數(shù)據(jù)僅本機可用,無法共享給其他服務。除非使用服務調(diào)用來獲取。而redis本身基于分布式架構,支持跨服務調(diào)取。
    所以當數(shù)據(jù)需要分布式調(diào)用時,則適用于redis,如果數(shù)據(jù)只需要本地獲取,則可考慮本地緩存

  • 性能:

    本地緩存本身基于本機內(nèi)存,沒有網(wǎng)絡IO消耗,所以性能上大大高于redis,但是如果數(shù)據(jù)量較大,則還是要考慮使用redis,本地緩存僅適用于數(shù)據(jù)量小、結構簡單的數(shù)據(jù)場景,不適合復雜的業(yè)務數(shù)據(jù)

  • 功能拓展:

    redis支持持久化、訂閱模式、集群、主從模式等,而ehcache更傾向于簡單的緩存功能場景,雖然也支持持久化,但是本身并不建議用它來做大型或復雜場景的緩存。如果場景比較簡單輕量,對延遲有較高要求,則可選擇本地緩存

2. ehcache使用

1、創(chuàng)建一個springboot項目,這里我的springboot版本為2.6.13

2、引入ehcahe組件依賴

這里需要注意的是net.sf.ehcache是ehcache2.X 與 org.ehcache是echcache3.X,兩個版本配置有區(qū)別

        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.9.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.6.13</version>
        </dependency>

3、在啟動類上添加@EnableCaching注解,開啟緩存

@SpringBootApplication
@EnableCaching
public class LocalCacheDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(LocalCacheDemoApplication.class, args);
    }

}

4、在配置文件application.yml中添加配置

spring:
  profiles: 
  	active: dev
  cache:
    type: ehcache
    ehcache:
      config: classpath:ehcache.xml

5、在resources文件夾下創(chuàng)建配置文件ehcache.xml,注意這里單獨創(chuàng)建了一個name為user的緩存,用于后續(xù)保存用戶信息緩存。如果有不同的緩存需要使用不同的name的,需要單獨創(chuàng)建cache標簽

標簽介紹:

defaultCache: 默認緩存配置標簽
cache 指定緩存標簽,name表示緩存名稱
diskStore 數(shù)據(jù)存儲磁盤路徑

屬性介紹:

eternal: 緩存是否永久有效,如果為 true 則忽略timeToIdleSeconds 和 timeToLiveSeconds
maxElementsInMemory:最多緩存多少個key
overflowToDisk: 緩存超限時是否寫入磁盤,默認為true
overflowToOffHeap: 堆內(nèi)存超限時是否使用堆外內(nèi)存,企業(yè)版功能,收費
diskPersistent:緩存是否持久化
timeToLiveSeconds:緩存多久過期
timeToIdleSeconds:緩存多久沒有被訪問就過期
diskExpiryThreadIntervalSeconds:磁盤緩存過期檢查線程運行時間間隔
memoryStoreEvictionPolicy:緩存淘汰策略, LFU:最近最少使用的元素先移出; FIFO:最先進入的元素被移出; LRU:使用越少的元素被移出
maxBytesLocalHeap:緩存最大占用JVM堆內(nèi)存,0表示不限制,單位支持K、M或G
maxBytesLocalOffHeap: 緩存最大占用堆外內(nèi)存,0表示不限制,單位支持K、M或G,企業(yè)版功能,收費
maxBytesLocalDisk:緩存最大占用磁盤,0表示不限制,單位支持K、M或G

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
         
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToLiveSeconds="3600"
            timeToIdleSeconds="0"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>

    <cache
            name="user"
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToLiveSeconds="3600"
            timeToIdleSeconds="0"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"/>

<!--    存儲到磁盤時的路徑-->
    <diskStore path="/Users/wuhanxue/Downloads/ehcache" />

</ehcache>

6、緩存使用,在獲取方法中使用@Cacheable注解,在更新方法中使用@CachePut注解。
我這里模擬就沒有訪問數(shù)據(jù)庫查詢數(shù)據(jù)了,大家在實際書寫的時候可以連接上數(shù)據(jù)源測試

@RestController
@RequestMapping("user")
public class UserController {

    @GetMapping("get")
    @Cacheable(cacheNames = "user", key = "#id")
    public User getById(Integer id) {
        System.out.println("get第一次獲取,不走緩存");
        User user = new User();
        user.setId(id);
        user.setAge(18);
        user.setName("benjamin_"+id);
        user.setSex(true);
        return user;
    }

    @PostMapping("update")
    @CachePut(cacheNames = "user", key = "#search.id")
    public User update(@RequestBody User search) {
        System.out.println("update更新緩存");
        User user = new User();
        Integer id = search.getId();
        user.setId(id);
        user.setAge(search.getAge() != null ? search.getAge()+1 : 0);
        user.setName("update_benjamin_"+id);
        user.setSex(true);
        return user;
    }

}

3. 測試

1、調(diào)用查詢接口:localhost:8080/user/get?id=1

springboot:緩存不止redis,學會使用本地緩存ehcache

2、第一次調(diào)用,打印"get第一次獲取,不走緩存"。再調(diào)用一次發(fā)現(xiàn)沒有打印了,但是數(shù)據(jù)正常查詢,說明走了緩存

springboot:緩存不止redis,學會使用本地緩存ehcache

3、調(diào)用更新接口

springboot:緩存不止redis,學會使用本地緩存ehcache

4、再調(diào)用查詢接口,查詢到的就是更新的數(shù)據(jù),說明緩存更新成功

springboot:緩存不止redis,學會使用本地緩存ehcache

4. 注意事項

謹慎使用maxElementsInMemory

maxElementsInMemory表示的是最大緩存多少個key,這個配置項謹慎使用,一般我們應該根據(jù)占用多少內(nèi)存空間來控制,而不是占用多少個key,如果出現(xiàn)某些key的數(shù)據(jù)量特別大時,就會導致key數(shù)量沒超過,但內(nèi)存占用超過導致的OOM了

這個我們通過一個生成大數(shù)據(jù)量的接口來模擬,其中generateMemoryString方法可以在文末的源碼倉庫中

1、書寫接口

@GetMapping("build")
    @Cacheable(cacheNames = "user", key = "#id")
    public User build(Integer id) {
        System.out.println("get第一次獲取,不走緩存");
        User user = new User();
        user.setId(id);
        user.setAge(18);
        // 生成指定大小的字符串
        user.setName(generateMemoryString(id));
        user.setSex(true);
        return user;
    }

2、限制項目JVM內(nèi)存為100m,方便更快模擬出報錯

springboot:緩存不止redis,學會使用本地緩存ehcache

3、調(diào)用接口localhost:8080/user/build?id=100,因為該接口會生成大數(shù)據(jù),占用本地緩存,而JVM緩存又給的100M,所以調(diào)用會報錯堆內(nèi)存溢出,如圖所示

springboot:緩存不止redis,學會使用本地緩存ehcache

4、因此該配置項要謹慎使用,可以通過maxBytesLocalHeap,maxBytesLocalDisk設置占用多少內(nèi)存、磁盤來替代

<cache
            name="user"
            eternal="false"
            maxBytesLocalHeap="50M"
            maxBytesLocalDisk="200M"
            overflowToDisk="false"
            diskPersistent="false"
            timeToLiveSeconds="3600"
            timeToIdleSeconds="0"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU"
    />

如果maxBytesLocalHeapmaxElementsInMemory都配置了的,誰先達到配置的值,就觸發(fā)

如果單個key值太大,仍然會導致OOM

雖然我們上面配置了maxBytesLocalHeap來限制最大使用的內(nèi)存,比如我們限制了該值為100M,則如果我們有4個30M的數(shù)據(jù)進來,那么就會根據(jù)配置的淘汰策略去淘汰之前的key,以騰出空間來裝新的數(shù)據(jù)

但如果新進來的數(shù)據(jù)很大,比如超過100M了,那么就會一下子裝滿內(nèi)存,甚至淘汰之前的key也不行,所以這種情況下還是會導致OOM的

遇到這種情況,兩種處理辦法,一種是保證不會有大于這個閾值的數(shù)據(jù)產(chǎn)生,這個可以通過業(yè)務代碼控制,二是設置一個全局錯誤捕捉,捕捉產(chǎn)生的OOM報錯,然后返回一個兜底或者其他的狀態(tài)碼,以此標識

演示源碼

https://gitee.com/wuhanxue/wu_study/tree/master/demo/local_cache_demo文章來源地址http://www.zghlxwxcb.cn/news/detail-429608.html

到了這里,關于springboot:緩存不止redis,學會使用本地緩存ehcache的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • SpringBoot使用Redis作為緩存器緩存數(shù)據(jù)的操作步驟以及避坑方案

    SpringBoot使用Redis作為緩存器緩存數(shù)據(jù)的操作步驟以及避坑方案

    2.1使用之前要明確使用的業(yè)務場景 例如我們在登錄時,可以讓redis緩存驗證碼,又如在分類下顯示菜品數(shù)據(jù)時,我們可以對分類和菜品進行緩存數(shù)據(jù)等等。 2.2導入Redis相關依賴 2.3在使用的controller層導入RedisTemplate 例如: 說明一下:這里為什么使用@Resource注解而不使用@Autowi

    2024年02月16日
    瀏覽(27)
  • 高并發(fā)下緩存失效問題(穿透、雪崩、擊穿),以及本地鎖、Redis分布鎖、Redisson鎖、SpringCache使用

    高并發(fā)下緩存失效問題(穿透、雪崩、擊穿),以及本地鎖、Redis分布鎖、Redisson鎖、SpringCache使用

    說明 :以不存在的數(shù)據(jù)攻擊,數(shù)據(jù)庫壓力增加導致崩潰 風險 :利用不存在數(shù)據(jù)攻擊,數(shù)據(jù)庫瞬時壓力增大,導致崩潰 解決 :設置不存在數(shù)據(jù)為 null 值 與 短暫過期時間 布隆過濾器 使用案例: redission布隆過濾器解決緩存穿透問題,定時刷新bloomFilter中的數(shù)據(jù) 說明 :設置緩

    2024年02月08日
    瀏覽(24)
  • 多級緩存(nginx本地緩存、JVM進程緩存、redis緩存)

    多級緩存(nginx本地緩存、JVM進程緩存、redis緩存)

    Caffeine示例 封裝完函數(shù)之后,我們對nginx.conf進行修改(請求進來之后會去尋找item.lua) item.lua文件內(nèi)容 上面的item.lua文件中需要進行拼接數(shù)據(jù),我們需要JSON結果處理 在實際生產(chǎn)中tomcat是肯定以集群的方式存在 當我們修改nginx.conf發(fā)送請求為集群的時候,如下圖 這個時候存在

    2024年01月17日
    瀏覽(53)
  • 23-MyBatis緩存、本地緩存、分布式Redis緩存、前端緩存

    ???????? MyBatis一級緩存、 ???????? MyBatis二級緩存、 ???????? 本地緩存:單節(jié)點 ???????? 分布式Redis緩存:多節(jié)點 ???????? 前端sessionStorage緩存:會話緩存 ???????? 前端localStorage緩存:前端本地緩存 MyBatis一級緩存默認是開啟的。 在Spring Boot中需要添加

    2024年02月13日
    瀏覽(29)
  • 緩存的變更(JVM本地緩存->Redis分布式緩存)

    在一次需求修改中,下游的服務附加提出了,針對某個業(yè)務數(shù)據(jù)緩存的生效時間的要求 原JVM設計方案: 采用jvm本地緩存機制,定時任務30秒刷新一次 現(xiàn)在redis方案: 因為很多地方使用了這個業(yè)務數(shù)據(jù)緩存,使用方面不能改動過多 因為是分布式部署,如果只使用jvm緩存,無法

    2024年02月11日
    瀏覽(31)
  • springboot+redis+mysql+quartz-使用pipeline+lua技術將緩存數(shù)據(jù)定時更新到數(shù)據(jù)庫

    代碼講解:7.3點贊功能-定時持久化到數(shù)據(jù)庫-Java程序整合pipeline+lua_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1Lg4y1w7U9 代碼: blogLike_schedule/like08 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like08 數(shù)據(jù)庫表:

    2024年02月13日
    瀏覽(18)
  • springboot+redis+mysql+quartz-通過Java操作jedis使用pipeline獲取緩存數(shù)據(jù)定時更新數(shù)據(jù)庫

    springboot+redis+mysql+quartz-通過Java操作jedis使用pipeline獲取緩存數(shù)據(jù)定時更新數(shù)據(jù)庫

    代碼講解:6-點贊功能-定時持久化到數(shù)據(jù)庫-pipeline+lua-優(yōu)化pipeline_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1yP411C7dr 代碼: blogLike_schedule/like06 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee.com/flowers-bloom-is-the-sea/XinQiUtilsOrDemo/tree/master/blogLike_schedule/like06 數(shù)據(jù)庫表的

    2024年02月16日
    瀏覽(28)
  • springboot+redis+mysql+quartz-通過Java操作jedis定時使用lua腳本獲取緩存數(shù)據(jù)并更新數(shù)據(jù)庫

    springboot+redis+mysql+quartz-通過Java操作jedis定時使用lua腳本獲取緩存數(shù)據(jù)并更新數(shù)據(jù)庫 代碼講解:7.1點贊功能-定時持久化到數(shù)據(jù)庫-Java整合lua_嗶哩嗶哩_bilibili https://www.bilibili.com/video/BV1ZX4y1H7JT/ 代碼: blogLike_schedule/like07 · xin麒/XinQiUtilsOrDemo - 碼云 - 開源中國 (gitee.com) https://gitee

    2024年02月13日
    瀏覽(17)
  • 【業(yè)務功能篇87】微服務-springcloud-本地緩存-redis-分布式緩存-緩存穿透-雪崩-擊穿

    【業(yè)務功能篇87】微服務-springcloud-本地緩存-redis-分布式緩存-緩存穿透-雪崩-擊穿

    ??緩存的作用是減低對數(shù)據(jù)源的訪問頻率。從而提高我們系統(tǒng)的性能。 緩存的流程圖 2.1 本地緩存 ??其實就是把緩存數(shù)據(jù)存儲在內(nèi)存中(Map String,Object ).在單體架構中肯定沒有問題。 單體架構下的緩存處理 2.2 分布式緩存 ??在分布式環(huán)境下,我們原來的本地緩存就不是

    2024年02月10日
    瀏覽(31)
  • springboot的緩存和redis緩存,入門級別教程

    springboot的緩存和redis緩存,入門級別教程

    一、springboot(如果沒有配置)默認使用的是jvm緩存 1、Spring框架支持向應用程序透明地添加緩存。抽象的核心是將緩存應用于方法,從而根據(jù)緩存中可用的信息減少執(zhí)行次數(shù)。緩存邏輯是透明地應用的,對調(diào)用者沒有任何干擾。只要使用@EnableCaching注釋啟用了緩存支持,Spri

    2024年02月07日
    瀏覽(35)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包