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

springboot 集成caffeine單體緩存兩種方式及算法簡(jiǎn)介 (注解/手動(dòng))

這篇具有很好參考價(jià)值的文章主要介紹了springboot 集成caffeine單體緩存兩種方式及算法簡(jiǎn)介 (注解/手動(dòng))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.簡(jiǎn)介

? ? ? ?Caffeine 是基于 JAVA 8 的高性能緩存庫(kù)。并且在 spring5 (springboot 2.x) 后,spring 官方放棄了 Guava,而使用了性能更優(yōu)秀的 Caffeine 作為默認(rèn)緩存組件。

? ? ? ?Caffeine 因?yàn)槭褂昧?Window-TinyLFU?緩存淘汰策略,提供了一個(gè)近乎最佳的命中率。綜合了?LRU?和 LFU 算法的長(zhǎng)處,使其成為本地緩存之王。

? ? ? ? Least Recently Used:如果數(shù)據(jù)最近被訪(fǎng)問(wèn)過(guò),將來(lái)被訪(fǎng)問(wèn)的概率也更高。每次訪(fǎng)問(wèn)就把這個(gè)元素放到隊(duì)列的頭部,隊(duì)列滿(mǎn)了就淘汰隊(duì)列尾部的數(shù)據(jù),即淘汰最長(zhǎng)時(shí)間沒(méi)有被訪(fǎng)問(wèn)的。缺點(diǎn)是,如果某一時(shí)刻大量數(shù)據(jù)到來(lái),很容易將熱點(diǎn)數(shù)據(jù)擠出緩存,留下來(lái)的很可能是只訪(fǎng)問(wèn)一次,今后不會(huì)再訪(fǎng)問(wèn)的或頻率極低的數(shù)據(jù)。比如、微博爆出某明星糗事就是一個(gè)突發(fā)性熱點(diǎn)事件。當(dāng)事件結(jié)束后,可能沒(méi)有啥訪(fǎng)問(wèn)量了,但是由于其極高的訪(fǎng)問(wèn)頻率,導(dǎo)致其在未來(lái)很長(zhǎng)一段時(shí)間內(nèi)都不會(huì)被淘汰掉。

? ? ? ? Least Frequently Used:如果數(shù)據(jù)最近被訪(fǎng)問(wèn)過(guò),那么將來(lái)被訪(fǎng)問(wèn)的概率也更高。也就是淘汰一定時(shí)間內(nèi)被訪(fǎng)問(wèn)次數(shù)最少的數(shù)據(jù)(時(shí)間局部性原理)需要用 Queue 來(lái)保存訪(fǎng)問(wèn)記錄,可以用 LinkedHashMap 來(lái)簡(jiǎn)單實(shí)現(xiàn)一個(gè)基于 LRU 算法的緩存。優(yōu)點(diǎn)是,避免了 LRU 的缺點(diǎn),因?yàn)楦鶕?jù)頻率淘汰,不會(huì)出現(xiàn)大量進(jìn)來(lái)的擠壓掉老的,如果在數(shù)據(jù)的訪(fǎng)問(wèn)的模式不隨時(shí)間變化時(shí)候,LFU 能夠提供絕佳的命中率。其缺點(diǎn)是,偶發(fā)性的、周期性的批量操作會(huì)導(dǎo)致LRU命中率急劇下降,緩存污染情況比較嚴(yán)重。

? ? ? ?W-TinyLFU 是 Caffeine 提出的一種全新算法,它可以解決頻率統(tǒng)計(jì)不準(zhǔn)確以及訪(fǎng)問(wèn)頻率衰減的問(wèn)題。這個(gè)方法讓我們從空間、效率、以及適配舉證的長(zhǎng)寬引起的哈希碰撞的錯(cuò)誤率上做均衡。在 W-TinyLFU 算法中,將整個(gè)緩存區(qū)劃分為兩大區(qū)域:Window Cache?和?Main Cache?。Window Cache 是一個(gè)標(biāo)準(zhǔn)的 LRU 緩存,只占整個(gè)緩存內(nèi)存空間大小的 1% ;?Main Cache 則是一個(gè) SLRU (Segmented LRU) ,占整個(gè)緩存內(nèi)存空間大小的 99% ,是緩存的主要區(qū)域。里面進(jìn)一步被劃分成兩個(gè)區(qū)域:Probation Cache 觀察區(qū)和 Protected Cache 保護(hù)區(qū)。Probation 觀察區(qū)占 Main Cache 大小的 20%;而 Protected 保護(hù)區(qū)占 Main Cache 大小的 80% ,是 Main Cache 的主要區(qū)域。

2.caffeine相關(guān)配置說(shuō)明

參數(shù) 類(lèi)型 描述
initialCapacity integer 初始的緩存空間大小
maximumSize long 緩存的最大條數(shù)
maximumWeight long 緩存的最大權(quán)重
expireAfterAccess duration 最后一次寫(xiě)入或訪(fǎng)問(wèn)后,指定經(jīng)過(guò)多長(zhǎng)的時(shí)間過(guò)期
expireAfterWrite duration 最后一次寫(xiě)入后,指定經(jīng)過(guò)多長(zhǎng)的時(shí)間緩存過(guò)期
refreshAfterWrite duration 創(chuàng)建緩存或者最近一次更新緩存后,經(jīng)過(guò)指定的時(shí)間間隔后刷新緩存
weakKeys boolean 打開(kāi) key 的弱引用
weakValues boolean 打開(kāi) value 的弱引用
softValues boolean 打開(kāi) value 的軟引用
recordStats - 開(kāi)發(fā)統(tǒng)計(jì)功能

Caffeine提供三種數(shù)據(jù)驅(qū)逐策略:基于大小驅(qū)逐、基于時(shí)間驅(qū)逐、基于引用驅(qū)逐。

  1. maximumSize?和?maximumWeight?不可以同時(shí)使用。
  2. expireAfterWrite?和?expireAfterAccess?同時(shí)存在時(shí),以?expireAfterWrite?為準(zhǔn)
  3. weakValues?和?softValues?不可以同時(shí)使用。

Java中四種引用類(lèi)型:

引用類(lèi)型 被垃圾回收時(shí)間 用途 生存時(shí)間
強(qiáng)引用 Strong Reference 從來(lái)不會(huì) 對(duì)象的一般狀態(tài) JVM停止運(yùn)行時(shí)終止
軟引用 Soft Reference 在內(nèi)存不足時(shí) 對(duì)象緩存 內(nèi)存不足時(shí)終止
弱引用 Weak Reference 在垃圾回收時(shí) 對(duì)象緩存 gc運(yùn)行后終止
虛引用 Phantom Reference 從來(lái)不會(huì) 可以用虛引用來(lái)跟蹤對(duì)象被垃圾回收器回收的活動(dòng),當(dāng)一個(gè)虛引用關(guān)聯(lián)的對(duì)象被垃圾收集器回收之前會(huì)收到一條系統(tǒng)通知 JVM停止運(yùn)行時(shí)終止

3.springboot集成caffeine

  1. 直接引入 Caffeine 依賴(lài),然后創(chuàng)建?Caffeine 方法實(shí)現(xiàn)緩存。
  2. 引入 Caffeine 和 SpringCache 依賴(lài),使用 SpringCache 注解方法實(shí)現(xiàn)緩存。(推薦)
  3. 引入jar包 版本也可根據(jù)不寫(xiě) 根據(jù)springboot版本走
        <!-- caffeine本地緩存 -->
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</artifactId>
            <version>2.8.5</version>
        </dependency>
        <!--  對(duì)于@EnableCaching注解開(kāi)啟-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>
  • @Cacheable:先查詢(xún)緩存是否存在,如果存在,則返回結(jié)果;如果不存在,則執(zhí)行方法,并將結(jié)果保存在緩存中。主要用于查詢(xún)操作
  • @CachePut:不檢查緩存中是否存在,直接執(zhí)行方法,并將結(jié)果保存在緩存中。主要用于數(shù)據(jù)新增和修改操作
  • @CacheEvict:從緩存中移除指定的key數(shù)據(jù),如果allEntries屬性為true,則清除全部;如果beforeInvocation屬性為true,則在方法執(zhí)行前刪除。主要用于刪除操作

3.1 方式一 只用Caffeine


/**
 * caffeine緩存配置 
 * - 優(yōu)點(diǎn):可以針對(duì)每個(gè)cache配置不同的參數(shù),比如過(guò)期時(shí)長(zhǎng)、最大容量(定制化配置) 
 * 可定義多個(gè)
 **/
@Configuration
public class CaffeineConfig {
    @Bean
    public Cache<Long, ItemStock> userDtoCache() {
        // 構(gòu)建cache對(duì)象
        return Caffeine.newBuilder()
                //0) 驅(qū)逐策略:基于容量,時(shí)間,引用。
                //0.1 基于時(shí)間
                .expireAfterWrite(10, TimeUnit.MINUTES)
                //0.2.1 基于容量
                //初始容量
                .initialCapacity(100)
                .maximumSize(10_000)
//                //0.2.2 權(quán)重
//                .weigher(((key, value) -> {
//                    if (key.equals(1)) {
//                        return 1;
//                    } else {
//                        return 2;
//                    }
//                }))
                //0.3 基于引用
                //0.3.1 當(dāng)進(jìn)行GC的時(shí)候進(jìn)行驅(qū)逐
//                .softValues()
                //0.3.2 當(dāng)key和緩存元素都不再存在其他強(qiáng)引用的時(shí)候驅(qū)逐
//                .weakKeys()
//                .weakValues()
                .build();
    }

測(cè)試類(lèi)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-774471.html

@SpringBootTest(classes = CaffeineApplication.class)
@RunWith(SpringRunner.class)
public class CaffeineTest{

    @Autowired
    private Cache<Long, UserDto> userDtoCache;
    

    @Test
    public void test1() {
        //1) 新增
        // 添加或者更新一個(gè)緩存元素
        userDtoCache.put(1L, UserDto.builder()
                .id(1L)
                .name("迪麗熱巴")
                .age(18)
                .build());

        // 查找緩存,如果緩存不存在則生成緩存元素,  如果無(wú)法生成則返回null
        UserDto user2 = userDtoCache.get(2L, key -> {
            // 根據(jù)key去數(shù)據(jù)庫(kù)查詢(xún)數(shù)據(jù)
            return UserDto.builder()
                    .id(key)
                    .name("柳巖")
                    .age(24)
                    .build();
        });


        //2) 查詢(xún)
        // 取數(shù)據(jù),上面的get也算
        UserDto user1 = userDtoCache.getIfPresent(1L);

        System.out.println("user1 = " + user1);
        System.out.println("user2 = " + user2);

        //3) 刪除
        // 移除一個(gè)緩存元素
        userDtoCache.invalidate(1L);
        user1 = userDtoCache.getIfPresent(1L);
        System.out.println("user1 = " + user1);

        // 批量失效key
        userDtoCache.invalidateAll(Arrays.asList(1L, 2L));
        // 失效所有的key
        userDtoCache.invalidateAll();

        System.out.println("defaultGF2 = " + userDtoCache.getIfPresent("defaultGF"));
    }

3.2 加入SpringCache 通過(guò)注解方式

@Configuration
@EnableCaching
public class CaffeineConfig {
    /**
     * 配置緩存管理器
     *
     * @return 緩存管理器
     */
    @Bean("caffeineCacheManager")
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                // 設(shè)置最后一次寫(xiě)入或訪(fǎng)問(wèn)后經(jīng)過(guò)固定時(shí)間過(guò)期
//                .expireAfterAccess(60, TimeUnit.SECONDS)
                // 初始的緩存空間大小
                .initialCapacity(100)
                // 緩存的最大條數(shù)
                .maximumSize(1000));
        return cacheManager;
    }

}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

  @Autowired
  private UserMapper userMapper;


  @Override
  @Cacheable(key = "#id" , value = "caffeineCacheManager")
  public User selectById(Long id) {
    User user = userMapper.selectById(id);
    return user;
  }

  @Override
  @CachePut(key = "#result.id" , value = "caffeineCacheManager")
  public User addUserInfo(UserDto userDto) {
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    int insert = userMapper.insert(user);
    return user;
  }

  @Override
  @CachePut(key = "#userDto.id" , value = "caffeineCacheManager")
  public User updateUserInfo(UserDto userDto) {
    User user = new User();
    BeanUtils.copyProperties(userDto, user);
    userMapper.updateById(user);
    return user;
  }

  @Override
  @CacheEvict(key = "#id" , value = "caffeineCacheManager")
  public void deleteById(Long id) {
    UpdateWrapper updateWrapper = new UpdateWrapper();
    updateWrapper.eq("id", id);
    userMapper.delete(updateWrapper);
  }
}

到了這里,關(guān)于springboot 集成caffeine單體緩存兩種方式及算法簡(jiǎn)介 (注解/手動(dòng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用Spring管理Caffeine緩存(CacheManager+Caffeine)

    使用Spring管理Caffeine緩存的主要pom依賴(lài)如下所示。 CacheManager配置類(lèi)如下所示。 使用Caffeine在本地緩存查詢(xún)結(jié)果,使用案例如下所示。 (1)關(guān)于maximumSize 當(dāng)首次設(shè)置緩存并嘗試存入的數(shù)據(jù)量大于設(shè)置的maximumSize時(shí),Caffeine不會(huì)直接報(bào)錯(cuò)。但是,當(dāng)嘗試將新數(shù)據(jù)添加到已滿(mǎn)的緩存

    2024年01月19日
    瀏覽(25)
  • 多級(jí)緩存架構(gòu)(二)Caffeine進(jìn)程緩存

    多級(jí)緩存架構(gòu)(二)Caffeine進(jìn)程緩存

    通過(guò)本文章,可以完成多級(jí)緩存架構(gòu)中的進(jìn)程緩存。 在 item-service 中引入 caffeine 依賴(lài) 這是Caffeine官方文檔地址 1. 配置Config類(lèi) 創(chuàng)建 config.CaffeineConfig 類(lèi) 2. 修改controller 在 ItemController 中注入兩個(gè) Cache 對(duì)象,并修改業(yè)務(wù)邏輯 Idea結(jié)合Docker將springboot放入docker容器中運(yùn)行,并指定使用

    2024年02月02日
    瀏覽(30)
  • 緩存平均的兩種算法

    緩存平均的兩種算法

    引言? ? ? ?? 線(xiàn)邊庫(kù)存物料的合理性問(wèn)題是物流仿真中研究的重要問(wèn)題之一,如果線(xiàn)邊庫(kù)存量過(guò)多,則會(huì)對(duì)生產(chǎn)現(xiàn)場(chǎng)的布局產(chǎn)生負(fù)面影響,增加成本,降低效益。 寫(xiě)在前面 ? ? ? ? 仿真分析后對(duì)線(xiàn)邊Buffer的使用情況進(jìn)行合理的評(píng)估就是一個(gè)非常重要的事情。比較關(guān)心的參數(shù)

    2024年02月13日
    瀏覽(18)
  • Caffeine本地緩存

    Caffeine本地緩存

    簡(jiǎn)單說(shuō),Caffine 是一款高性能的本地緩存組件 由下面三幅圖可見(jiàn):不管在并發(fā)讀、并發(fā)寫(xiě)還是并發(fā)讀寫(xiě)的場(chǎng)景下,Caffeine 的性能都大幅領(lǐng)先于其他本地開(kāi)源緩存組件 它是優(yōu)先淘汰掉最先緩存的數(shù)據(jù)、是最簡(jiǎn)單的淘汰算法。 缺點(diǎn)是如果先緩存的數(shù)據(jù)使用頻率比較高的話(huà),那么

    2024年02月09日
    瀏覽(20)
  • JVM進(jìn)程緩存Caffeine

    導(dǎo)入坐標(biāo): 寫(xiě)一個(gè)配置類(lèi): 注入bean // 取數(shù)據(jù),包含兩個(gè)參數(shù): // 參數(shù)一:緩存的key // 參數(shù)二:Lambda表達(dá)式,表達(dá)式參數(shù)就是緩存的key,方法體是查詢(xún)數(shù)據(jù)庫(kù)的邏輯 // 優(yōu)先根據(jù)key查詢(xún)JVM緩存,如果未命中,則執(zhí)行參數(shù)二的Lambda表達(dá)式 增刪改 都要清除緩存

    2024年02月11日
    瀏覽(22)
  • 實(shí)現(xiàn)本地緩存-caffeine

    實(shí)現(xiàn)本地緩存-caffeine

    目錄 實(shí)現(xiàn)caffeine cache CacheManager Caffeine配置說(shuō)明 創(chuàng)建自定義配置類(lèi) 配置緩存管理器 編寫(xiě)自動(dòng)提示配置文件 測(cè)試使用 創(chuàng)建測(cè)試配置實(shí)體類(lèi) 創(chuàng)建測(cè)試配置類(lèi) 創(chuàng)建注解掃描的測(cè)試實(shí)體 創(chuàng)建單元測(cè)試類(lèi)進(jìn)行測(cè)試 實(shí)現(xiàn)caffeine cache CacheManager SimpleCacheManager: 這種緩存管理器允許你在應(yīng)

    2024年02月17日
    瀏覽(25)
  • 緩存 - Caffeine 不完全指北

    緩存 - Caffeine 不完全指北

    https://github.com/ben-manes/caffeine wiki: https://github.com/ben-manes/caffeine/wiki Caffeine是一個(gè)用于Java應(yīng)用程序的高性能緩存框架。它提供了一個(gè)強(qiáng)大且易于使用的緩存庫(kù),可以在應(yīng)用程序中使用,以提高數(shù)據(jù)訪(fǎng)問(wèn)的速度和效率。 下面是一些Caffeine緩存框架的主要特點(diǎn): 高性能:Caffeine的設(shè)

    2024年02月16日
    瀏覽(27)
  • 地表最帥緩存Caffeine

    地表最帥緩存Caffeine

    緩存是程序員們繞不開(kāi)的話(huà)題,像是常用的本地緩存Guava,分布式緩存Redis等,是提供高性能服務(wù)的基礎(chǔ)。今天敬姐帶大家一起認(rèn)識(shí)一個(gè)更高效的本地緩存—— Caffeine 。 Caffeine Cache使用了基于內(nèi)存的存儲(chǔ)策略,并且支持高并發(fā)、低延遲,同時(shí)還提供了緩存過(guò)期、定時(shí)刷新、緩存

    2024年02月10日
    瀏覽(22)
  • java緩存框架Caffeine詳解

    緩存在日常開(kāi)發(fā)中啟動(dòng)至關(guān)重要的作用,基本是存儲(chǔ)在內(nèi)存中,數(shù)據(jù)的讀取速度是非??斓模艽罅繙p少對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),減少數(shù)據(jù)庫(kù)的壓力,本文主要介紹了本地緩存Caffeine基本配置與基本用法,通過(guò)閱讀本文,你將了解什么是Caffeine,如何使用Caffeine。 1.1 什么是本地緩存

    2024年02月13日
    瀏覽(26)
  • 基于總線(xiàn)加鎖和緩存鎖(CPU實(shí)現(xiàn)原子操作的兩種方式)

    基于總線(xiàn)加鎖和緩存鎖(CPU實(shí)現(xiàn)原子操作的兩種方式)

    總線(xiàn)鎖 就是使用處理器提供的一個(gè)LOCK#信號(hào),當(dāng)一個(gè)處理器在總線(xiàn)上輸出此信號(hào)時(shí),其他處理器的請(qǐng)求將被阻塞住,那么該處理器可以獨(dú)占共享內(nèi)存。 CPU和內(nèi)存之間的通信被鎖??! 如果多個(gè)處理器同時(shí)對(duì)共享變量進(jìn)行讀寫(xiě)改操作,那么共享變量就會(huì)被多個(gè)處理器同時(shí)進(jìn)行操

    2024年02月14日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包