偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

注解式兩級(jí)緩存服務(wù)框架設(shè)計(jì)與構(gòu)建

開發(fā) 架構(gòu)
緩存在現(xiàn)代計(jì)算機(jī)系統(tǒng)中無(wú)處不在,各式各樣硬件和軟件的組合構(gòu)成和管理著緩存,一個(gè)編寫良好的計(jì)算機(jī)程序傾向于展示出良好的局部性。

前言 

緩存在現(xiàn)代計(jì)算機(jī)系統(tǒng)中無(wú)處不在,各式各樣硬件和軟件的組合構(gòu)成和管理著緩存,一個(gè)編寫良好的計(jì)算機(jī)程序傾向于展示出良好的局部性。

圖片

在高性能服務(wù)架構(gòu)設(shè)計(jì)中,緩存是一個(gè)不可或缺的環(huán)節(jié)。以Java體系為例,我們從傳統(tǒng)的硬編碼方式使用緩存到基于注解的spring-cache框架,確實(shí)大大提升了我們的效率,代碼也更加的簡(jiǎn)潔易維護(hù)。

但隨著越來(lái)越多的項(xiàng)目使用spring-cache,場(chǎng)景越來(lái)越復(fù)雜,我們逐漸發(fā)現(xiàn)緩存配置代碼重復(fù)、緩存策略不能在注解上直接配置、不支持多級(jí)緩存、不支持自動(dòng)刷新緩存等問(wèn)題逐漸突顯。

基于這些在業(yè)務(wù)中遇到的問(wèn)題點(diǎn),我們構(gòu)建了一套注解式兩級(jí)緩存服務(wù)框架。在實(shí)際設(shè)計(jì)和構(gòu)建過(guò)程中積累了一些經(jīng)驗(yàn),借此機(jī)會(huì)分享給大家,希望對(duì)業(yè)務(wù)中使用緩存尤其使用spring-cache場(chǎng)景的可以提供一些幫助。

 1. spring-cache簡(jiǎn)介 

Spring 3.1之后,引入了注解緩存技術(shù),其本質(zhì)上不是一個(gè)具體的緩存實(shí)現(xiàn)方案,而是一個(gè)對(duì)緩存使用的抽象,不僅能夠使用SpEL(Spring Expression Language)來(lái)定義緩存的key和各種condition,還提供開箱即用的緩存臨時(shí)存儲(chǔ)方案,也支持和主流的專業(yè)緩存集成。

事物都有兩面性,優(yōu)點(diǎn)如此優(yōu)秀,那么缺點(diǎn)或不足是否也是如此的突出呢?

  • spring-cache問(wèn)題點(diǎn)(我們認(rèn)為)
  • 不支持緩存策略在注解上設(shè)置,每個(gè)方法的緩存策略需要單獨(dú)硬編碼方式配置
  • 不支持多級(jí)緩存
  • 不支持自動(dòng)刷新緩存
  • 不支持緩存統(tǒng)計(jì)看板
  • 不支持熔斷降級(jí)
  • 不支持?jǐn)?shù)據(jù)壓縮
  • 代碼重復(fù)不易維護(hù)

基于以上我們認(rèn)為的問(wèn)題點(diǎn),我們?cè)炝艘粋€(gè)輪子,來(lái)試圖解決這些問(wèn)題,這個(gè)輪子就是“注解式兩級(jí)緩存框架”。

2. 注解式兩級(jí)緩存框架簡(jiǎn)介

  • 是一個(gè)注解式兩級(jí)緩存框架:通過(guò)注解實(shí)現(xiàn)聲明式的方法緩存,使用方式和spring-cache類似,提供了比spring-cache更加強(qiáng)大的注解。
  • 是一個(gè)全新的注解式兩級(jí)緩存框架:一級(jí)緩存使用本地緩存(目前只支持Caffeine,后續(xù)可擴(kuò)展),二級(jí)緩存使用集中式緩存(目前只支持Redis)。目前支持三種緩存策略:

只使用一級(jí)緩存

只使用二級(jí)緩存

同時(shí)用兩級(jí)緩存

2.1全部特性

  • 支持TTL在注解上直接配置
  • 支持本地緩存容量在注解上直接配置
  • 支持condition在注解上直接配置,指定符合條件的情況下才緩存
  • 支持緩存Key的SpEL表達(dá)式、自定義生成策略(已提供默認(rèn)生成策略)
  • 支持只使用一級(jí)緩存或者只使用二級(jí)緩存或者使用兩級(jí)緩存
  • 支持value序列化策略配置,默認(rèn)GenericJackson2JsonRedisSerializer
  • 支持異步加載緩存的方式
  • 支持自動(dòng)刷新緩存
  • redis客戶端選擇
  • 支持熔斷與降級(jí) --- 延遲支持
  • 支持緩存數(shù)據(jù)壓縮 --- 延遲支持
  • 支持緩存一致性 --- 延遲支持
  • 支持緩存監(jiān)控統(tǒng)計(jì)看板 --- 延遲支持
  • 支持自定義緩存中間件 --- 延遲支持
  • 支持緩存接口用于手工緩存操作 --- 延遲支持

前菜我們品完了,接下來(lái)我們開始正餐,一步步介紹下設(shè)計(jì)思路,聊下如何站在spring-cache巨人肩膀上,試圖解決上述問(wèn)題點(diǎn)的。

 3. 注解式兩級(jí)緩存框架架構(gòu)設(shè)計(jì)

3.1注解@EnableCache

圖片

1、注解@EnableCache導(dǎo)入CacheConfigurationSelector。

CacheConfigurationSelector向容器內(nèi)注入了AutoProxyRegistrar和ProxyCacheAutoConfiguration這兩個(gè)Bean

2、AutoProxyRegistrar會(huì)確保容器中存在一個(gè)自動(dòng)代理創(chuàng)建器(APC),緩存的代理對(duì)象最終是委托給自動(dòng)代理創(chuàng)建器來(lái)完成。

AutoProxyRegistrar在容器啟動(dòng)階段對(duì)每個(gè)bean創(chuàng)建進(jìn)行處理,如果bean中有方法標(biāo)記了cache注解,為其創(chuàng)建代理對(duì)象, 包裹定義的CacheOperationSourceAdvisor bean

3、ProxyCacheAutoConfiguration向容器定義如下基礎(chǔ)設(shè)施bean。

CacheOperationSourceAdvisor 用于管理CacheOperationSource和CacheInterceptor, CacheOperationSource 用于獲取方法調(diào)用時(shí)最終應(yīng)用的Cache注解的元數(shù)據(jù), CacheInterceptor 包裹在目標(biāo)bean外面用于操作Cache的AOP Advice

3.2攔截器

由于AutoProxyRegistrar在容器啟動(dòng)階段會(huì)對(duì)標(biāo)有cache注解的bean創(chuàng)建代理對(duì)象,這時(shí)我們可以獲取到具體方法和注解元數(shù)據(jù), 我們針對(duì)兩部分?jǐn)?shù)據(jù)進(jìn)行綁定提前緩存起來(lái),這樣目標(biāo)方法調(diào)用時(shí)直接從緩存中獲取元數(shù)據(jù)即可,避免了反射效率低下影響性能。

圖片

1、根據(jù)目標(biāo)方法和目標(biāo)類獲取注解元數(shù)據(jù),元數(shù)據(jù)包括緩存名稱、緩存key、過(guò)期時(shí)間、自動(dòng)刷新時(shí)間、本地緩存容量、緩存類型、緩存條件等。

2、根據(jù)緩存條件是否走注解緩存,緩存條件支持SpEL表達(dá)式,如果為false則直接執(zhí)行目標(biāo)方法,為ture走緩存邏輯。

3、生成key:支持SpEL表達(dá)式,可以自定義生成規(guī)則,默認(rèn)規(guī)則:命名空間、所屬類名稱、方法名稱、方法參數(shù)以冒號(hào)相連。

4、獲取cache:根據(jù)cacheName和cacheType獲取cache,對(duì)應(yīng)cache有本地cache、遠(yuǎn)程cache、兩級(jí)cache,根據(jù)key獲取緩存結(jié)果, 緩存結(jié)果為空則執(zhí)行目標(biāo)方法并對(duì)結(jié)果緩存,反之直接返回緩存結(jié)果。

3.3獲取cache組件

cache實(shí)現(xiàn)類有三種LocalCache、RemoteCache和TwoLevelCache,每個(gè)緩存實(shí)現(xiàn)類集成了具體的緩存中間件,LocalCache可以集成Caffeine、Guava、ehCache等, RemoteCache可以集成Redis、Memcache等,TwoLevelCache是LocalCache和RemoteCache組合實(shí)現(xiàn)。

圖片

1、CacheManagerContainer管理著所有的CacheManager,每個(gè)cacheType對(duì)應(yīng)一個(gè)CacheManager的實(shí)現(xiàn)。

2、CacheManager提供了cache實(shí)現(xiàn)bean的創(chuàng)建,管理著多個(gè)cache,每個(gè)cache有對(duì)應(yīng)的cacheName,每個(gè)應(yīng)用里可以通過(guò)cacheName來(lái)對(duì)cache進(jìn)行隔離,如果cacheName對(duì)應(yīng)的cache不存在則會(huì)注冊(cè)一個(gè)新的cache。

3、Cache接口提供了緩存的具體操作,例如放入,讀取,清理等。

3.4兩級(jí)緩存

兩級(jí)緩存的產(chǎn)生是因?yàn)檫h(yuǎn)程緩存有網(wǎng)絡(luò)開銷,大量的緩存讀取會(huì)導(dǎo)致遠(yuǎn)程緩存網(wǎng)絡(luò)成為整個(gè)系統(tǒng)的瓶頸,本地緩存是和應(yīng)用程序在一個(gè)進(jìn)程內(nèi),請(qǐng)求緩存速度快,沒(méi)有過(guò)多的網(wǎng)絡(luò)開銷, 加入本地緩存目標(biāo)是降低對(duì)遠(yuǎn)程緩存的讀取次數(shù),減輕網(wǎng)絡(luò)開銷,從而再次提升程序的響應(yīng)速度與服務(wù)性能。

圖片

1、從本地緩存讀出數(shù)據(jù),如果存在則直接返回,進(jìn)行后續(xù)具體業(yè)務(wù)邏輯。

2、本地緩存如果不存在則讀取遠(yuǎn)程緩存,遠(yuǎn)程緩存如果存在則更新本地緩存,不存在則從數(shù)據(jù)源讀取,然后依次更新遠(yuǎn)程緩存、本地緩存,然后進(jìn)行后續(xù)具體業(yè)務(wù)邏輯。

3.5自動(dòng)刷新緩存

防止某個(gè)緩存失效時(shí),訪問(wèn)量突然大增,所有請(qǐng)求訪問(wèn)數(shù)據(jù)庫(kù),可能導(dǎo)致數(shù)據(jù)庫(kù)掛掉;適用場(chǎng)景:key數(shù)量比較少,訪問(wèn)量大,加載開銷較大的情況。

圖片

1、緩存讀取時(shí)如果元數(shù)據(jù)自動(dòng)刷新時(shí)間有值,會(huì)根據(jù)緩存key、目標(biāo)方法、刷新時(shí)間創(chuàng)建一個(gè)給定初始延遲的間隔性的任務(wù),任務(wù)自動(dòng)執(zhí)行間隔為自動(dòng)刷新時(shí)間, 任務(wù)執(zhí)行時(shí)會(huì)根據(jù)緩存key、目標(biāo)方法重新加載緩存,保持緩存一直生效。

2、根據(jù)自動(dòng)刷新時(shí)間會(huì)生成一個(gè)停止刷新時(shí)間,如果緩存key訪問(wèn)間隔時(shí)間超過(guò)了停止刷新時(shí)間或者緩存key過(guò)期,會(huì)刪除該定時(shí)任務(wù),釋放資源,避免無(wú)效的刷新緩存。

3、兩級(jí)緩存刷新緩存順序?yàn)椋合人⑿逻h(yuǎn)程緩存,然后根據(jù)Redis的pub/sub模式去監(jiān)測(cè)和操作本地cache的刪除動(dòng)作,隨后第一次請(qǐng)求會(huì)檢查本地緩存--->再檢查Redis緩存--->回源。

4、遠(yuǎn)程緩存自動(dòng)刷新使用分布式鎖,對(duì)同一key,全局只有一臺(tái)機(jī)器自動(dòng)刷新。

3.6注解@Cacheable

1、 @Cacheable可以作用在方法上,也可以標(biāo)記在一個(gè)類上,當(dāng)標(biāo)記在一個(gè)方法上時(shí)表示該方法是支持緩存的,當(dāng)標(biāo)記在一個(gè)類上時(shí)則表示該類所有的方法都是支持緩存的

名稱

默認(rèn)值

說(shuō)明

value

空字符串

緩存名稱,cacheName的別名

cacheName

空字符串

緩存名稱

key

空字符串

緩存key,支持SpEL表達(dá)式,提供默認(rèn)生成策略

ttl

10分鐘

過(guò)期時(shí)間,d/h/m/s四種時(shí)間單位選擇,分別代表天/時(shí)/分/秒, ttl="10m"表示10分鐘過(guò)期時(shí)間

refreshTime

空字符串

自動(dòng)刷新時(shí)間,d/h/m/s四種時(shí)間單位選擇,分別代表天/時(shí)/分/秒

maximumSize

5000

本地緩存容量

cacheType

REMOTE

緩存類型,LOCAL/REMOTE/BOTH三種選擇,分別代表本地緩存/集中式緩存/兩級(jí)緩存

condition

空字符串

指定符合條件的情況下才緩存,為空則認(rèn)為全部無(wú)條件緩存,支持SpEL表達(dá)式

2、key默認(rèn)生成規(guī)則:命名空間、所屬類名稱、方法名稱、方法參數(shù)以冒號(hào)相連。

3、如果設(shè)置ttl為空:表示緩存永不過(guò)期。

3.7緩存配置

這里舉個(gè)例子,具體的參數(shù)值,根據(jù)自己業(yè)務(wù)情況自行調(diào)整。

auto:
cache:
local:
type: caffeine
remote:
type: redis
host: localhost #服務(wù)器地址
port: 6379 #服務(wù)器連接端口
timeout: 2000 #連接超時(shí)時(shí)間(毫秒)
pool:
min-idle: 2 #最小空閑連接數(shù)
max-idle: 10 #最大空閑連接數(shù)
max-active: 20 #連接池的最大數(shù)據(jù)庫(kù)連接數(shù)
max-wait: 200 #最大建立連接等待時(shí)間
key-serializer: org.springframework.data.redis.serializer.StringRedisSerializer #key序列化策略
value-serializer: org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer #value序列化策略
namespace: testCache # 緩存的命名空間前綴,最終緩存格式為:testCache:xxx:xx
allow-null-values: true #防止緩存穿透

 4. 總結(jié)和展望

本文主要是記錄了商業(yè)資源組在使用spring-cache過(guò)程中遇到的問(wèn)題點(diǎn)及注解式兩級(jí)緩存服務(wù)框架設(shè)計(jì)思路,通過(guò)一步步拆解,將問(wèn)題點(diǎn)逐個(gè)擊破。該框架在實(shí)際項(xiàng)目中也經(jīng)過(guò)了千萬(wàn)級(jí)別的驗(yàn)證,為我們的線上服務(wù)提供了良好的性能。

構(gòu)建一套完整的服務(wù)框架需要不斷的迭代功能開發(fā),后續(xù)要逐步支持的功能如下:

增加熔斷與降級(jí)

增加緩存數(shù)據(jù)壓縮

增加緩存一致性

增加緩存監(jiān)控統(tǒng)計(jì)看板

增加自定義緩存中間件

增加緩存接口用于手工緩存操作

參考文獻(xiàn)

??https://github.com/ben-manes/caffeine/wiki/Benchmarks??

??https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/expressions.html??

作者介紹:王云朋

  • 經(jīng)銷商技術(shù)部-商業(yè)資源團(tuán)隊(duì)
  • 2017年加入汽車之家經(jīng)銷商事業(yè)部,目前主要負(fù)責(zé)智能展廳核心功能開發(fā)工作
責(zé)任編輯:武曉燕 來(lái)源: 之家技術(shù)
相關(guān)推薦

2019-07-10 15:41:50

RedisJava緩存

2024-02-29 09:20:10

2022-04-15 11:26:14

緩存功能

2009-09-08 09:12:12

LINQ構(gòu)建框架設(shè)計(jì)

2022-09-25 21:45:54

日志平臺(tái)

2022-03-31 13:58:37

分布式SpringRedis

2014-09-23 10:05:55

2022-09-15 18:32:13

SPI模型框架

2022-06-15 11:01:59

自定義SPIJava

2022-03-18 13:59:46

緩存RedisCaffeine

2023-02-26 11:15:42

緩存循環(huán)依賴

2012-06-25 12:43:26

.NET框架

2012-06-25 09:28:42

.NET可逆框架

2016-03-23 11:05:58

Socket開發(fā)框架分析

2020-07-30 10:35:32

Java反射框架設(shè)計(jì)

2022-04-03 15:44:55

Vue.js框架設(shè)計(jì)設(shè)計(jì)與實(shí)現(xiàn)

2012-01-18 10:20:42

框架設(shè)計(jì)

2023-10-26 09:02:30

框架設(shè)計(jì)模式

2018-02-01 08:47:00

對(duì)象存儲(chǔ)服務(wù)

2024-01-31 22:08:18

分布式重試框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)