Spring cache 和 Redis 的基礎(chǔ)知識

什么是緩存

緩存通俗點說就是臨時存儲數(shù)據(jù)的可高速訪問的地方。

當(dāng)從原始位置獲取數(shù)據(jù)的代價太大或者時間太長的時候鹊漠,就可以把獲取到的數(shù)據(jù)存放在緩存中巴刻,這樣下次訪問的時候就提高了訪問速度降低了訪問成本。

緩存的基本知識點
  1. 緩存的對象
    緩存的對象應(yīng)該是花費了時間計算或者獲取到的數(shù)據(jù)突勇,并且這些數(shù)據(jù)在不久會被訪問到涮因。
    在 Java 應(yīng)用中废睦,常見的緩存例子有如下幾種
  • Web Service 客戶端調(diào)用結(jié)果的緩存
  • 獲取到的 DB 數(shù)據(jù)
  • Servlet response 的緩存
  • 復(fù)雜計算的結(jié)果

代碼實例如 String 的 hashCode 計算結(jié)果

/** Cache the hash code for the string */
private int hash; // Default to 0
public int hashCode() {  
    //get from cache first  
    int h = hash;
    //cannot found    
    if (h == 0 && value.length > 0) { 
       char val[] = value; 
       for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        //set to cache
        hash = h;
    }
    return h;
}
  1. 緩存命中率
    緩存命中指的是當(dāng)前請求發(fā)生在緩存中,就是說數(shù)據(jù)可以從緩存中獲得养泡。

緩存命中率=緩存命中次數(shù)/總請求數(shù)[從緩存中讀取+慢速設(shè)備讀取]

緩存命中率是衡量緩存性能的一個重要指標(biāo)嗜湃。

  1. 緩存清除策略
    當(dāng)緩存失效或者緩存空間不足的時候,需要提供緩存算法來清除一些不再使用的緩存數(shù)據(jù)澜掩,這個時候就涉及到了緩存清除策略购披,一般稱做緩存算法。
    常見的緩存算法有:

等肩榕,具體介紹請參考維基百科或者查閱對應(yīng)算法資料刚陡。

  1. 緩存存活期 TTL(Time To Live)
    存活期即從緩存中創(chuàng)建時間點開始直到它到期的一個時間段(不管在這個時間段內(nèi)有沒有訪問都將過期)
  2. 緩存空閑期 TTI(Time To Idle)
    空閑期即一個數(shù)據(jù)多久沒被訪問將從緩存中移除的時間。

一般緩存使用方式

use cache

Spring cache abstraction

Spring cache 抽象層是 Spring 提供的一種能夠極小沖擊現(xiàn)有代碼的緩存機制株汉。它提供的是不依賴具體緩存框架的筐乳,使用 AOP 方式實現(xiàn)的緩存機制。

Spring 的緩存技術(shù)還具備相當(dāng)?shù)撵`活性乔妈,不僅能夠使用 SpEL(Spring Expression Language)來定義緩存的 key 和各種 condition蝙云,還提供開箱即用的緩存臨時存儲方案如 JDK 實現(xiàn)的緩存和 Guava cache,也支持和主流的專業(yè)緩存例如 EHCache 和 Redis 集成褒翰。

Spring 緩存技術(shù)基于 AOP 實現(xiàn)贮懈, 因此有兩種實現(xiàn)模式 proxy 和 aspectj 可以選擇以適應(yīng)不同情況匀泊。

Spring cache 的使用方式

Spring cache 提供了一些注解來聲明需要使用 Cache 的方法优训。

  • @Cacheable 聲明使用 Cache,方式是 put if not found
  • @CacheEvict 觸發(fā)緩存清除操作
  • @CachePut 在方法執(zhí)行的時候更新特定緩存各聘,不影響方法執(zhí)行結(jié)果
  • @Caching 如果一個方法有多個緩存操作可以使用
  • @CacheConfig 配置當(dāng)前類中使用的緩存配置

每一個注解的使用說明請看 Spring 的文檔揣非。

使用 Spring Data Redis 實現(xiàn) Cache

Spring data redis 是 Spring 提供的對 Redis 操作進行封裝的框架,同時躲因,他還提供了 Spring cache 的 Redis 實現(xiàn)早敬,因此我們可以使用他來完成 Redis 緩存的集成。

Redis

Redis是一個開源大脉、支持網(wǎng)絡(luò)搞监、基于內(nèi)存、鍵值對存儲數(shù)據(jù)庫镰矿,可以用作數(shù)據(jù)庫琐驴、緩存和消息中間件。將 Redis 作為緩存的時候應(yīng)該注意:

  • 設(shè)置最大可用的內(nèi)存,使用 maxmemory 設(shè)置
  • 設(shè)置 Key 的清除策略(也就是緩存策略)绝淡,使用 maxmemory-policy 設(shè)置

如果不設(shè)置最大可用內(nèi)存的話:32位操作系統(tǒng)宙刘,最大默認值為 3G,而64位則不限定牢酵。這樣就會導(dǎo)致內(nèi)存占用過多悬包,并且可能會對緩存特定 Key 的檢索速度有影響。

Redis 真正支持的緩存策略只有 LRU馍乙,但是我們可以在 redis.conf 中配置以下不同的參數(shù)布近,來實現(xiàn)不同效果的 Key 清除策略:

  • noeviction:在客戶端操作會導(dǎo)致更多內(nèi)存占用的時候拋出錯誤。
  • allkeys-lru: 優(yōu)先清除最近最少使用的 key 來為新加數(shù)據(jù)讓出空間丝格。
  • volatile-lru: 優(yōu)先在設(shè)置了過期時間的 key 中清除最近最少使用的來為新加數(shù)據(jù)讓出空間吊输。
  • allkeys-random: 隨機清除 key 來為新加數(shù)據(jù)讓出空間。
  • volatile-random: 隨機在設(shè)置了過期時間的 key 中清除一些
  • volatile-ttl: 在設(shè)置了過期時間的 Key 中根據(jù)存活期長短來清除铁追,優(yōu)先清除存活期短的季蚂。

如果沒有 Key 滿足條件,volatile-lru琅束、volatile-random 和 volatile-ttl 會和 noeviction 一樣的表現(xiàn)扭屁。

配置 Redis 作為 Spring cache 實現(xiàn)

簡單基于注解的配置如下:

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    @Autowired
    private RedisPropertiesVO properties;
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.afterPropertiesSet();
        factory.setHostName(properties.getHost());
        factory.setPort(properties.getPort());
        factory.setUsePool(true);
        factory.setDatabase(properties.getDatabase());
        return factory;
    }
    @Bean
    public RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
    @Bean
    public CacheManager cacheManager() {
        return new RedisCacheManager(redisTemplate());
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市涩禀,隨后出現(xiàn)的幾起案子洒扎,更是在濱河造成了極大的恐慌,老刑警劉巖析砸,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玩般,死亡現(xiàn)場離奇詭異,居然都是意外死亡屿岂,警方通過查閱死者的電腦和手機践宴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爷怀,“玉大人阻肩,你說我怎么就攤上這事≡耸冢” “怎么了烤惊?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吁朦。 經(jīng)常有香客問我柒室,道長,這世上最難降的妖魔是什么逗宜? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任雄右,我火速辦了婚禮剥啤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘不脯。我一直安慰自己府怯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布防楷。 她就那樣靜靜地躺著牺丙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪复局。 梳的紋絲不亂的頭發(fā)上冲簿,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音亿昏,去河邊找鬼峦剔。 笑死,一個胖子當(dāng)著我的面吹牛角钩,可吹牛的內(nèi)容都是我干的吝沫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼递礼,長吁一口氣:“原來是場噩夢啊……” “哼惨险!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脊髓,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辫愉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后将硝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恭朗,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年依疼,在試婚紗的時候發(fā)現(xiàn)自己被綠了痰腮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡涛贯,死狀恐怖诽嘉,靈堂內(nèi)的尸體忽然破棺而出蔚出,到底是詐尸還是另有隱情弟翘,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布骄酗,位于F島的核電站稀余,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏趋翻。R本人自食惡果不足惜睛琳,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师骗,春花似錦历等、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黍少,卻和暖如春寡夹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厂置。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工菩掏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人昵济。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓智绸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親访忿。 傳聞我的和親對象是個殘疾皇子传于,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)醉顽,斷路器沼溜,智...
    卡卡羅2017閱讀 134,696評論 18 139
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,453評論 0 82
  • 本文將從Redis的基本特性入手系草,通過講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對Redis的基本能力進行直觀介紹。之后概...
    kelgon閱讀 61,172評論 23 625
  • 1.1 資料 唆涝,最好的入門小冊子找都,可以先于一切文檔之前看,免費廊酣。 作者Antirez的博客能耻,Antirez維護的R...
    JefferyLcm閱讀 17,066評論 1 51
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,846評論 6 342