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

Spring Boot 緩存應(yīng)用實(shí)踐

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot 緩存應(yīng)用實(shí)踐。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

緩存是最直接有效提升系統(tǒng)性能的手段之一。個(gè)人認(rèn)為用好用對(duì)緩存是優(yōu)秀程序員的必備基本素質(zhì)。本文結(jié)合實(shí)際開發(fā)經(jīng)驗(yàn),從簡(jiǎn)單概念原理和代碼入手,一步一步搭建一個(gè)簡(jiǎn)單的二級(jí)緩存系統(tǒng)。

一、通用緩存接口

1、緩存基礎(chǔ)算法

  • FIFO(First In First Out),先進(jìn)先出,和OS里的FIFO思路相同,如果一個(gè)數(shù)據(jù)最先進(jìn)入緩存中,當(dāng)緩存滿的時(shí)候,應(yīng)當(dāng)把最先進(jìn)入緩存的數(shù)據(jù)給移除掉。

  • LFU(Least Frequently Used),最不經(jīng)常使用,如果一個(gè)數(shù)據(jù)在最近一段時(shí)間內(nèi)使用次數(shù)很少,那么在將來(lái)一段時(shí)間內(nèi)被使用的可能性也很小。

  • LRU(Least Recently Used),最近最少使用,如果一個(gè)數(shù)據(jù)在最近一段時(shí)間沒有被訪問到,那么在將來(lái)它被訪問的可能性也很小。也就是說(shuō),當(dāng)限定的空間已存滿數(shù)據(jù)時(shí),應(yīng)當(dāng)把最久沒有被訪問到的數(shù)據(jù)移除。

2、接口定義

簡(jiǎn)單定義緩存接口,大致可以抽象如下:

package com.power.demo.cache.contract;

import?java.util.function.Function;

/**
?* 緩存提供者接口
?**/
public?interface?CacheProviderService {

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????**/
????<T?extends?Object> T?get(String?key);

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????**/
????<T?extends?Object> T?get(String?key,?Function<String, T>?function);

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param funcParm function函數(shù)的調(diào)用參數(shù)
?????**/
????<T?extends?Object, M?extends?Object> T?get(String?key,?Function<M, T>?function,?M?funcParm);

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param expireTime 過期時(shí)間(單位:毫秒) 可為空
?????**/
????<T?extends?Object> T?get(String?key,?Function<String, T>?function,?Long?expireTime);

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param funcParm function函數(shù)的調(diào)用參數(shù)
?????* @param expireTime 過期時(shí)間(單位:毫秒) 可為空
?????**/
????<T?extends?Object, M?extends?Object> T?get(String?key,?Function<M, T>?function,?M?funcParm,?Long?expireTime);

????/**
?????* 設(shè)置緩存鍵值
?????*
?????* @param key 緩存鍵 不可為空
?????* @param obj 緩存值 不可為空
?????**/
????<T?extends?Object>?void?set(String?key, T obj);

????/**
?????* 設(shè)置緩存鍵值
?????*
?????* @param key 緩存鍵 不可為空
?????* @param obj 緩存值 不可為空
?????* @param expireTime 過期時(shí)間(單位:毫秒) 可為空
?????**/
????<T?extends?Object>?void?set(String?key, T obj, Long expireTime);

????/**
?????* 移除緩存
?????*
?????* @param key 緩存鍵 不可為空
?????**/
????void?remove(String?key);

????/**
?????* 是否存在緩存
?????*
?????* @param key 緩存鍵 不可為空
?????**/
????boolean?contains(String?key);
}

注意,這里列出的只是常見緩存功能接口,一些在特殊場(chǎng)景下用到的統(tǒng)計(jì)類的接口、分布式鎖、自增(減)等功能不在討論范圍之內(nèi)。

Get相關(guān)方法,注意多個(gè)參數(shù)的情況,緩存接口里面?zhèn)魅说腇unction,這是Java8提供的函數(shù)式接口,雖然支持的入?yún)€(gè)數(shù)有限(這里你會(huì)非常懷念.NET下的Func委托),但是僅對(duì)Java這個(gè)語(yǔ)言來(lái)說(shuō),這真是一個(gè)重大的進(jìn)步^_^。

接口定義好了,下面就要實(shí)現(xiàn)緩存提供者程序了。按照存儲(chǔ)類型的不同,本文簡(jiǎn)單實(shí)現(xiàn)最常用的兩種緩存提供者:本地緩存和分布式緩存

二、本地緩存

本地緩存,也就是JVM級(jí)別的緩存(本地緩存可以認(rèn)為是直接在進(jìn)程內(nèi)通信調(diào)用,而分布式緩存則需要通過網(wǎng)絡(luò)進(jìn)行跨進(jìn)程通信調(diào)用),一般有很多種實(shí)現(xiàn)方式,比如直接使用Hashtable、ConcurrentHashMap等天生線程安全的集合作為緩存容器,或者使用一些成熟的開源組件,如EhCache、Guava Cache等。本文選擇上手簡(jiǎn)單的Guava緩存。

1、什么是Guava

Guava,簡(jiǎn)單來(lái)說(shuō)就是一個(gè)開發(fā)類庫(kù),且是一個(gè)非常豐富強(qiáng)大的開發(fā)工具包,號(hào)稱可以讓使用Java語(yǔ)言更令人愉悅,主要包括基本工具類庫(kù)和接口、緩存、發(fā)布訂閱風(fēng)格的事件總線等。在實(shí)際開發(fā)中,我用的最多的是集合、緩存和常用類型幫助類,很多人都對(duì)這個(gè)類庫(kù)稱贊有加。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-534105.html

2、添加依賴

<dependency>
????<groupId>com.google.guava</groupId>
????<artifactId>guava</artifactId>
</dependency>

3、實(shí)現(xiàn)接口

/*
?* 本地緩存提供者服務(wù) (Guava Cache)
?* */
@Configuration
@ComponentScan(basePackages = AppConst.BASE_PACKAGE_NAME)
@Qualifier("localCacheService")
public?class?LocalCacheProviderImpl?implements?CacheProviderService {

????private?static?Map<String, Cache<String,?Object>> _cacheMap = Maps.newConcurrentMap();

????static?{

????????Cache<String,?Object> cacheContainer = CacheBuilder.newBuilder()
????????????????.maximumSize(AppConst.CACHE_MAXIMUM_SIZE)
????????????????.expireAfterWrite(AppConst.CACHE_MINUTE, TimeUnit.MILLISECONDS)//最后一次寫入后的一段時(shí)間移出
????????????????//.expireAfterAccess(AppConst.CACHE_MINUTE, TimeUnit.MILLISECONDS) //最后一次訪問后的一段時(shí)間移出
????????????????.recordStats()//開啟統(tǒng)計(jì)功能
????????????????.build();

????????_cacheMap.put(String.valueOf(AppConst.CACHE_MINUTE), cacheContainer);
????}

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????**/
????public?<T?extends?Object> T?get(String?key) {
????????T obj =?get(key,?null,?null, AppConst.CACHE_MINUTE);

????????return?obj;
????}

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????**/
????public?<T?extends?Object> T?get(String?key,?Function<String, T>?function)?{
????????T obj =?get(key,?function,?key,?AppConst.CACHE_MINUTE);

????????return?obj;
????}

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param funcParm function函數(shù)的調(diào)用參數(shù)
?????**/
????public?<T?extends?Object, M?extends?Object> T?get(String?key,?Function<M, T>?function,?M?funcParm)?{
????????T obj =?get(key,?function,?funcParm,?AppConst.CACHE_MINUTE);

????????return?obj;
????}

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param expireTime 過期時(shí)間(單位:毫秒) 可為空
?????**/
????public?<T?extends?Object> T?get(String?key,?Function<String, T>?function,?Long?expireTime)?{
????????T obj =?get(key,?function,?key,?expireTime);

????????return?obj;
????}

????/**
?????* 查詢緩存
?????*
?????* @param key 緩存鍵 不可為空
?????* @param function 如沒有緩存,調(diào)用該callable函數(shù)返回對(duì)象 可為空
?????* @param funcParm function函數(shù)的調(diào)用參數(shù)
?????* @param expireTime 過期時(shí)間(單位:毫秒) 可為空
?????**/
????public?<T?extends?Object, M?extends?Object> T?get(String?key,?Function<M, T>?function,?M?funcParm,?Long?expireTime)?{
????????T obj =?null;
????????if?(StringUtils.isEmpty(key) ==?true) {
????????????return?obj;
????????}

????????expireTime = getExpireTime(expireTime);

????????Cache<String,?Object> cacheContainer = getCacheContainer(expireTime);

????????try?{
????????????if?(function?==?null)?{
????????????????obj = (T) cacheContainer.getIfPresent(key);
????????????}?else?{
????????????????final Long cachedTime = expireTime;
????????????????obj = (T) cacheContainer.get(key, () -> {
????????????????????T retObj =?

到了這里,關(guān)于Spring Boot 緩存應(yīng)用實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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 Boot:構(gòu)建獨(dú)立、可擴(kuò)展的企業(yè)級(jí)應(yīng)用程序的最佳實(shí)踐“

    標(biāo)題:深入理解Spring Boot:構(gòu)建獨(dú)立、可擴(kuò)展的企業(yè)級(jí)應(yīng)用程序的最佳實(shí)踐 摘要:Spring Boot是一個(gè)強(qiáng)大的框架,可以幫助開發(fā)人員快速構(gòu)建獨(dú)立、可擴(kuò)展的企業(yè)級(jí)應(yīng)用程序。本文將深入探討Spring Boot的核心概念和最佳實(shí)踐,并通過示例代碼演示其用法。 正文: 什么是Spring Bo

    2024年02月14日
    瀏覽(33)
  • 解鎖Spring Boot中的設(shè)計(jì)模式—04.橋接模式:探索【橋接模式】的奧秘與應(yīng)用實(shí)踐!

    解鎖Spring Boot中的設(shè)計(jì)模式—04.橋接模式:探索【橋接模式】的奧秘與應(yīng)用實(shí)踐!

    橋接模式也稱為橋梁模式、接口模式或者柄體(Handle and Body)模式,是將 抽象部分 與他的 具體實(shí)現(xiàn)部分 分離 ,使它們都可以獨(dú)立地變化,通過 組合 的方式 建立 兩個(gè)類之間的 聯(lián)系 ,而不是繼承。 橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在將抽象部分與實(shí)現(xiàn)部分分離,使它們

    2024年02月21日
    瀏覽(24)
  • 解鎖Spring Boot中的設(shè)計(jì)模式—03.委派模式:探索【委派模式】的奧秘與應(yīng)用實(shí)踐!

    解鎖Spring Boot中的設(shè)計(jì)模式—03.委派模式:探索【委派模式】的奧秘與應(yīng)用實(shí)踐!

    委派模式 是一種負(fù)責(zé)任務(wù)的調(diào)度和分配模式,類似于代理模式但更注重結(jié)果而非過程。它可以被視為一種特殊情況下的靜態(tài)代理的全權(quán)代理,但并不屬于GOF 23種設(shè)計(jì)模式之一,而是歸類為行為型模式。 委派模式在Spring框架中廣泛應(yīng)用,其中最常見的例子是 DispatcherServlet ,它

    2024年02月19日
    瀏覽(27)
  • Spring Boot進(jìn)階(67):高性能緩存!使用Spring Boot輕松集成Memcached。

    Spring Boot進(jìn)階(67):高性能緩存!使用Spring Boot輕松集成Memcached。

    ????????Memcached是一款高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),主要用于動(dòng)態(tài)Web應(yīng)用中減輕數(shù)據(jù)庫(kù)負(fù)載。Spring Boot是一款基于Spring框架的快速開發(fā)框架,集成了大量的常用技術(shù)和組件,方便開發(fā)者快速搭建項(xiàng)目。將兩者結(jié)合起來(lái),可以提高Web應(yīng)用的性能,并減少數(shù)據(jù)庫(kù)的壓力。

    2024年02月07日
    瀏覽(31)
  • 解鎖Spring Boot中的設(shè)計(jì)模式—02.解釋器模式:探索【解釋器模式】的奧秘與應(yīng)用實(shí)踐!

    解鎖Spring Boot中的設(shè)計(jì)模式—02.解釋器模式:探索【解釋器模式】的奧秘與應(yīng)用實(shí)踐!

    解釋器模式(Interpreter Pattern)是一種行為設(shè)計(jì)模式,它用于定義語(yǔ)言的文法,并且解釋語(yǔ)言中的表達(dá)式。在Java中,解釋器模式可以用于構(gòu)建解釋器以解析特定的語(yǔ)言或表達(dá)式,如數(shù)學(xué)表達(dá)式、查詢語(yǔ)言等。 優(yōu)點(diǎn): 靈活性: 解釋器模式可以 靈活地添加新的表達(dá)式和規(guī)則 ,因

    2024年02月19日
    瀏覽(96)
  • Spring Boot 緩存 Cache 入門

    Spring Boot 緩存 Cache 入門

    在系統(tǒng)訪問量越來(lái)越大之后,往往最先出現(xiàn)瓶頸的往往是數(shù)據(jù)庫(kù)。而為了減少數(shù)據(jù)庫(kù)的壓力, 我們可以選擇讓產(chǎn)品砍掉消耗數(shù)據(jù)庫(kù)性能的需求 。 當(dāng)然也可以引入緩存,在引入緩存之后,我們的讀操作的代碼,往往代碼如下: 這段代碼,是比較常用的緩存策略,俗稱**“被動(dòng)寫

    2024年02月15日
    瀏覽(23)
  • Spring Boot多級(jí)緩存實(shí)現(xiàn)方案

    Spring Boot多級(jí)緩存實(shí)現(xiàn)方案

    1.背景 緩存,就是讓數(shù)據(jù)更接近使用者,讓訪問速度加快,從而提升系統(tǒng)性能。工作機(jī)制大概是先從緩存中加載數(shù)據(jù),如果沒有,再?gòu)穆僭O(shè)備(eg:數(shù)據(jù)庫(kù))中加載數(shù)據(jù)并同步到緩存中。 所謂多級(jí)緩存,是指在整個(gè)系統(tǒng)架構(gòu)的不同系統(tǒng)層面進(jìn)行數(shù)據(jù)緩存,以提升訪問速度。主要

    2024年02月14日
    瀏覽(22)
  • 【Spring Boot】實(shí)戰(zhàn):實(shí)現(xiàn)數(shù)據(jù)緩存框架
  • 【Spring Boot】深入解密Spring Boot日志:最佳實(shí)踐與策略解析

    【Spring Boot】深入解密Spring Boot日志:最佳實(shí)踐與策略解析

    ?? 博客主頁(yè):從零開始的-CodeNinja之路 ? 收錄文章:【Spring Boot】深入解密Spring Boot日志:最佳實(shí)踐與策略解析 ??歡迎大家點(diǎn)贊??評(píng)論??收藏?文章 日志對(duì)我們來(lái)說(shuō)并不陌?,通過打印日志來(lái)發(fā)現(xiàn)和定位問題,或者根據(jù)日志來(lái)分析程序的運(yùn)行過程. 日志的用途 Spring Boot中的日

    2024年04月17日
    瀏覽(30)
  • 【Spring Boot】緩存預(yù)熱與緩存清除--原理、作用和目的

    在本文中,我們將詳細(xì)講解兩個(gè)與緩存相關(guān)的重要概念: 緩存預(yù)熱 和 緩存清除 。 我們將了解緩存的基本概念,然后分別介紹緩存預(yù)熱和緩存清除的原理、作用和目的。 緩存是一種數(shù)據(jù)存儲(chǔ)技術(shù),用于存儲(chǔ)經(jīng)常訪問的數(shù)據(jù),以便在需要時(shí)快速獲取 。通過緩存數(shù)據(jù),可以 減

    2023年04月21日
    瀏覽(23)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包