欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種基于數(shù)據(jù)版本的高效管理緩存的方法與流程

文檔序號:12720147閱讀:367來源:國知局

本發(fā)明涉及軟件開發(fā)技術(shù)領(lǐng)域,具體地說是一種基于數(shù)據(jù)版本的高效管理緩存的方法。



背景技術(shù):

軟件開發(fā)中,有相當(dāng)多的內(nèi)容需要跟數(shù)據(jù)庫交互,一般的處理是直接跟數(shù)據(jù)庫進(jìn)行數(shù)據(jù)交換,但是數(shù)據(jù)庫的處理任務(wù)相當(dāng)繁重,往往成為系統(tǒng)運(yùn)行緩慢或者宕機(jī)的關(guān)鍵環(huán)節(jié)。即便使用了緩存技術(shù),也會由開發(fā)人員直接操作緩存,對開發(fā)人員的開發(fā)能力和代碼質(zhì)量要求較高。

MyBatis是一種數(shù)據(jù)持久化的技術(shù)框架,主要實現(xiàn)業(yè)務(wù)應(yīng)用與數(shù)據(jù)庫交互的支撐,目前已經(jīng)廣泛應(yīng)用于基于J2EE開發(fā)技術(shù)平臺之中。MyBatis提供了一種二級緩存機(jī)制,能夠簡單的緩存相應(yīng)的數(shù)據(jù),但是二級緩存Cache和數(shù)據(jù)庫數(shù)據(jù)的同步性和一致性有所欠缺,設(shè)計一種自動緩存系統(tǒng),直接根據(jù)業(yè)務(wù)需求自主緩存,同時又要保持?jǐn)?shù)據(jù)一致,滿足業(yè)務(wù)需求同時避免大量的數(shù)據(jù)庫交互和代碼人員的開發(fā)成為一種必然的需求。



技術(shù)實現(xiàn)要素:

本發(fā)明的技術(shù)任務(wù)是針對以上不足之處,提供一種基于數(shù)據(jù)版本的高效管理緩存的方法,解決現(xiàn)有軟件開發(fā)過程中系統(tǒng)跟數(shù)據(jù)大量交互帶來的數(shù)據(jù)庫壓力問題,滿足業(yè)務(wù)數(shù)據(jù)一致性的要求,同時降低代碼開發(fā)的難度,提高已有或者新建系統(tǒng)的性能和并發(fā)能力。

本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是:

一種基于數(shù)據(jù)版本的高效管理緩存的方法,彌補(bǔ)MyBatis二級緩存控制上的不足,提高二級緩存Cache和數(shù)據(jù)庫數(shù)據(jù)的同步性和一致性,處理各個Cache之間的關(guān)聯(lián)關(guān)系;精確地管理MyBatis的二級緩存,實現(xiàn)對MyBatis二級緩存細(xì)粒度的控制;當(dāng)執(zhí)行過對數(shù)據(jù)庫表的更新操作時,可以指定清除由特定的StatementId表示的查詢語句產(chǎn)生的緩存;對緩存的維護(hù)都是獨(dú)立的,緩存之間不會相互影響,指定的Mapper中的語句只會影響到該Mapper對應(yīng)的Cache緩存,當(dāng)執(zhí)行某些更新操作時,能夠刷新或者清空特定的查詢語句產(chǎn)生的緩存,以避免數(shù)據(jù)不一致。

優(yōu)選的,對數(shù)據(jù)庫表的更新操作包括update、delete和insert。

進(jìn)一步的,緩存中Key的標(biāo)準(zhǔn)形式,Key的形式實際上是:

GroupPrefix-ident1-ident2-ident1version-ident2version-HashKey,

GroupPrefix為配置文件中配置的每個緩存組的組標(biāo)識,

Ident1為緩存維度1,

Ident2為緩存維度2,

ident1version為維度1的版本信息,

ident2version為維度2的版本信息,

Hashkey為select語句帶參數(shù) 進(jìn)行hash后的值。

這里為了敘述的方便 設(shè)定GroupPrefix=AAA,維度1為comid,維度2為custcode。

那么key的組織形式就變成了以下:

AAA-comid-custcode-a-b-Hashkey

解釋:

AAA為配置文件中配置的每個緩存組的組標(biāo)識。

Comid為緩存的數(shù)據(jù)的Comid信息。

custcode為緩存的數(shù)據(jù)的custcode信息。

a為 于comid對應(yīng)的版本號。

b為 于custcode對應(yīng)的版本號。

Hashkey為select語句帶參數(shù) 進(jìn)行hash后的值。

2 緩存版本更新策略

這里為了敘述的方便 設(shè)定GroupPrefix=AAA,維度1為comid,維度2為custcode。

Comid=0031111301123 custcode=3701234567891,下面的描述comid和custcode為兩個維度的示意名稱。

2.1 查詢SQL處理。

2.1.1 獲取緩存數(shù)據(jù)

如果SelectSql中 參數(shù)帶 comid 和custcode,那么此SQL執(zhí)行前獲取緩存,GetObject的操作中會進(jìn)行以下:

A、查詢AAA- comidver-comid 如果有 取值為a,沒有 直接返回NULL,

此步查詢AAA組下第1維度的版本信息,如果有那么取值為a,如果沒有那么直接返回NULL。比如查詢AAA- comidver-0031111301123的key值,來查詢AAA組下 第1維度為0031111301123的版本信息。

B、查詢AAA-custcodever-custcode如果有 取值為b,沒有直接返回NULL,

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,如果沒有那么直接返回NULL。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下 第2維度為3701234567891的版本信息。

C、查詢AAA- comid-custcode-a-b-key 如果有 那么 取值, 返回。如果沒有, 返回NULL。

此步驟 組裝key值,比如

AAA-0031111301123-3701234567891-11-32-HashKey

用此key來查詢緩存,查詢AAA組下第1維度為0031111301123,第2維度為3701234567891,第1維度版本為11,第2維度版本為32 的某個緩存。

2.1.2 添加緩存數(shù)據(jù)

當(dāng)從數(shù)據(jù)庫里查詢到數(shù)據(jù),那么需要把數(shù)據(jù)添加到緩存中,Put操作的時候,會有以下步驟的操作:

A、查詢AAA- comidver-comid 如果有 取為a,沒有建一個, 值為1,

此步查詢AAA組下第1維度的版本信息,如果有那么取值為a,如果沒有那么建一個Key。比如查詢AAA- comidver-0031111301123的key值,來查詢AAA組下 第1維度為0031111301123的版本信息。如果沒有這個Key,那么建一個Key,并設(shè)定值為1。

B、查詢AAA-custcodever-custcode如果有 取為b,沒有建一個 值為1 ,

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,如果沒有那么建一個Key。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下 第2維度為3701234567891的版本信息。如果沒有這個Key,那么建一個Key,并設(shè)定值為1。

C、 Put(AAA- comid-custcod-a-b-key,object)。

此步驟 組裝key值,比如

AAA-0031111301123-3701234567891-1-21-HashKey

用此key來添加緩存,AAA組下第1維度為0031111301123,第2維度為3701234567891,第1維度版本為1,第2維度版本為21 的某個SQL(帶參數(shù))的緩存。

2.4 Update delete insert 參數(shù)帶 comid和 custcode

當(dāng)Update Delete Insert執(zhí)行時,會觸發(fā)清空緩存的操作,如果參數(shù)中有comid和custcode那么步驟如下:

查詢AAA- custcodever- custcode 如果有, 那么 取值 b,修改為b+1, 沒有建一個 Key值為1。

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,修改為b+1,提升版本,如果沒有那么新建1個Key。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下第2維度為3701234567891的版本信息。然后將版本增1。

3 Sql語句的支持

暫時只支持帶有兩個維度條件的SQL(或或者其中之一)。

也就是說如果SQL語句沒有設(shè)定的兩個維度,那么put get clear,操作都會直接返回,不影響也不使用緩存。

4部署實現(xiàn)

在lib下增加spymemcache.jar MybatisMemcache.jar 更新mybatis.jar

A、在classes下面 增加兩個配置文件

《memcached.properties》

org.mybatis.caches.memcached.servers=192.168.31.242:11211

org.mybatis.caches.memcached.expiration=604800

org.mybatis.caches.memcached.asyncget=false

org.mybatis.caches.memcached.compression=true

《mybatismem.conf》

[OVERALL]

[DesDBC1]

NameSpace=UserMapper.insertAuthor,UserMapper.batchDeleteStudent,UserMapper.batchUpdateStudentWithMap

NameSpaceId=UserMapper.findById

GroupKeyPrefix=AAA

ident1=comid

ident2=custcode

[Log]

DesDBCCount=1

NameSpace維護(hù)增刪改的sql語句的 namespace.sqlid

NameSpaceId維護(hù)查詢的sql語句的 namespace.sqlid

GroupKeyPrefix維護(hù)組號或者叫組索引前綴。

ident1第1維度標(biāo)識。

Ident2第2維度標(biāo)識。

如果2個維度有交叉,請將大的維度放在第1維度,小的維度放在第2維度。

比如 comid custcode,comid放到第1維度,custcode放到第2維度。

B、修改 mybatis的緩存配置:

《configuration.xml》

增加

<settings>

<setting name="cacheEnabled" value="true" />

</settings>

本發(fā)明的一種基于數(shù)據(jù)版本的高效管理緩存的方法和現(xiàn)有技術(shù)相比,具有以下有益效果:

通過簡單的配置方式,提升MyBatis緩存的數(shù)據(jù)一致性問題,原MyBatis實現(xiàn)了緩存的定時刷新(時間長短可配置,但是頻度過高會帶來緩存效能的下降),無法實時提現(xiàn)更新的數(shù)據(jù),本發(fā)明通過定義緩存更新和緩存數(shù)據(jù)的關(guān)系,在數(shù)據(jù)更新的同時清除緩存(下次使用時及時更新緩存數(shù)據(jù)),實現(xiàn)確保應(yīng)用調(diào)用到的緩存數(shù)據(jù)是當(dāng)前最新數(shù)據(jù),避免出現(xiàn)臟數(shù)據(jù)返回用戶。拓展了MyBatis的應(yīng)用范圍。

通過簡單的配置,無需應(yīng)用研發(fā)人員介入,即可實現(xiàn)按照版本控制緩存的數(shù)據(jù),當(dāng)應(yīng)用數(shù)據(jù)更新時,自動更新緩存的數(shù)據(jù)版本,保證緩存中的數(shù)據(jù)版本有效性,滿足業(yè)務(wù)對數(shù)據(jù)一致性的需求。版本控制Key的實現(xiàn)方式,主要實現(xiàn)兩個維度的鍵值表示,能夠解決80%問題,但是極大的降低了配置部署的難度。數(shù)據(jù)更新時自動刷新緩存數(shù)據(jù)版本,通過擴(kuò)展MyBatis攔截器自動實現(xiàn),無需開發(fā)人員干預(yù)即可實現(xiàn)已建或者在建項目的緩存使用,提升系統(tǒng)的能力,降低開發(fā)難度。

具體實施方式

下面結(jié)合具體實施例對本發(fā)明作進(jìn)一步說明。

一種基于數(shù)據(jù)版本的高效管理緩存的方法,彌補(bǔ)MyBatis二級緩存控制上的不足,提高二級緩存Cache和數(shù)據(jù)庫數(shù)據(jù)的同步性和一致性,處理各個Cache之間的關(guān)聯(lián)關(guān)系;精確地管理MyBatis的二級緩存,實現(xiàn)對MyBatis二級緩存細(xì)粒度的控制;當(dāng)執(zhí)行過對數(shù)據(jù)庫表的更新操作時,可以指定清除由特定的StatementId表示的查詢語句產(chǎn)生的緩存;對緩存的維護(hù)都是獨(dú)立的,緩存之間不會相互影響,指定的Mapper中的語句只會影響到該Mapper對應(yīng)的Cache緩存,當(dāng)執(zhí)行某些更新操作時,能夠刷新或者清空特定的查詢語句產(chǎn)生的緩存,以避免數(shù)據(jù)不一致。

優(yōu)選的,對數(shù)據(jù)庫表的更新操作包括update、delete和insert。

進(jìn)一步的,緩存中Key的標(biāo)準(zhǔn)形式,Key的形式實際上是:

GroupPrefix-ident1-ident2-ident1version-ident2version-HashKey,

GroupPrefix為配置文件中配置的每個緩存組的組標(biāo)識,

Ident1為緩存維度1,

Ident2為緩存維度2,

ident1version為維度1的版本信息,

ident2version為維度2的版本信息,

Hashkey為select語句帶參數(shù) 進(jìn)行hash后的值。

這里為了敘述的方便 設(shè)定GroupPrefix=AAA,維度1為comid,維度2為custcode。

那么key的組織形式就變成了以下:

AAA-comid-custcode-a-b-Hashkey

解釋:

AAA為配置文件中配置的每個緩存組的組標(biāo)識。

Comid為緩存的數(shù)據(jù)的Comid信息。

custcode為緩存的數(shù)據(jù)的custcode信息。

a為 于comid對應(yīng)的版本號。

b為 于custcode對應(yīng)的版本號。

Hashkey為select語句帶參數(shù) 進(jìn)行hash后的值。

2 緩存版本更新策略

這里為了敘述的方便 設(shè)定GroupPrefix=AAA,維度1為comid,維度2為custcode。

Comid=0031111301123 custcode=3701234567891,下面的描述comid和custcode為兩個維度的示意名稱。

2.1 查詢SQL處理。

2.1.1 獲取緩存數(shù)據(jù)

如果SelectSql中 參數(shù)帶 comid 和custcode,那么此SQL執(zhí)行前獲取緩存,GetObject的操作中會進(jìn)行以下:

A、查詢AAA- comidver-comid 如果有 取值為a,沒有 直接返回NULL,

此步查詢AAA組下第1維度的版本信息,如果有那么取值為a,如果沒有那么直接返回NULL。比如查詢AAA- comidver-0031111301123的key值,來查詢AAA組下 第1維度為0031111301123的版本信息。

B、查詢AAA-custcodever-custcode如果有 取值為b,沒有直接返回NULL,

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,如果沒有那么直接返回NULL。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下 第2維度為3701234567891的版本信息。

C、查詢AAA- comid-custcode-a-b-key 如果有 那么 取值, 返回。如果沒有, 返回NULL。

此步驟 組裝key值,比如

AAA-0031111301123-3701234567891-11-32-HashKey

用此key來查詢緩存,查詢AAA組下第1維度為0031111301123,第2維度為3701234567891,第1維度版本為11,第2維度版本為32 的某個緩存。

2.1.2 添加緩存數(shù)據(jù)

當(dāng)從數(shù)據(jù)庫里查詢到數(shù)據(jù),那么需要把數(shù)據(jù)添加到緩存中,Put操作的時候,會有以下步驟的操作:

A、查詢AAA- comidver-comid 如果有 取為a,沒有建一個, 值為1,

此步查詢AAA組下第1維度的版本信息,如果有那么取值為a,如果沒有那么建一個Key。比如查詢AAA- comidver-0031111301123的key值,來查詢AAA組下 第1維度為0031111301123的版本信息。如果沒有這個Key,那么建一個Key,并設(shè)定值為1。

B、查詢AAA-custcodever-custcode如果有 取為b,沒有建一個 值為1 ,

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,如果沒有那么建一個Key。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下 第2維度為3701234567891的版本信息。如果沒有這個Key,那么建一個Key,并設(shè)定值為1。

C、 Put(AAA- comid-custcod-a-b-key,object)。

此步驟 組裝key值,比如

AAA-0031111301123-3701234567891-1-21-HashKey

用此key來添加緩存,AAA組下第1維度為0031111301123,第2維度為3701234567891,第1維度版本為1,第2維度版本為21 的某個SQL(帶參數(shù))的緩存。

2.4 Update delete insert 參數(shù)帶 comid和 custcode

當(dāng)Update Delete Insert執(zhí)行時,會觸發(fā)清空緩存的操作,如果參數(shù)中有comid和custcode那么步驟如下:

查詢AAA- custcodever- custcode 如果有, 那么 取值 b,修改為b+1, 沒有建一個 Key值為1。

此步查詢AAA組下第2維度的版本信息,如果有那么取值為b,修改為b+1,提升版本,如果沒有那么新建1個Key。比如查詢AAA- custcodever-3701234567891的key值,來查詢AAA組下第2維度為3701234567891的版本信息。然后將版本增1。

3 Sql語句的支持

暫時只支持帶有兩個維度條件的SQL(或或者其中之一)。

也就是說如果SQL語句沒有設(shè)定的兩個維度,那么put get clear,操作都會直接返回,不影響也不使用緩存。

4部署實現(xiàn)

在lib下增加spymemcache.jar MybatisMemcache.jar 更新mybatis.jar

A、在classes下面 增加兩個配置文件

《memcached.properties》

org.mybatis.caches.memcached.servers=192.168.31.242:11211

org.mybatis.caches.memcached.expiration=604800

org.mybatis.caches.memcached.asyncget=false

org.mybatis.caches.memcached.compression=true

《mybatismem.conf》

[OVERALL]

[DesDBC1]

NameSpace=UserMapper.insertAuthor,UserMapper.batchDeleteStudent,UserMapper.batchUpdateStudentWithMap

NameSpaceId=UserMapper.findById

GroupKeyPrefix=AAA

ident1=comid

ident2=custcode

[Log]

DesDBCCount=1

NameSpace維護(hù)增刪改的sql語句的 namespace.sqlid

NameSpaceId維護(hù)查詢的sql語句的 namespace.sqlid

GroupKeyPrefix維護(hù)組號或者叫組索引前綴。

ident1第1維度標(biāo)識。

Ident2第2維度標(biāo)識。

如果2個維度有交叉,請將大的維度放在第1維度,小的維度放在第2維度。

比如 comid custcode,comid放到第1維度,custcode放到第2維度。

B、修改 mybatis的緩存配置:

《configuration.xml》

增加

<settings>

<setting name="cacheEnabled" value="true" />

</settings>

從Mybatis的CacheExecutor里面把sql、參數(shù)和操作都分離出來,然后傳遞給外部的MybatisMemcache類,在MybatisMemcache類中將參數(shù)分離為2個維度,利用namespace.sqlid從配置文件中讀出緩存組編號,然后將緩存組編號,2個維度的信息,傳遞給MemcachedClientWrapper類,在這個類中進(jìn)行版本控制,和GetObject、PutObject或者Clear的操作。Memcached的客戶端用的Spymemcached。

緩存對象層是在MemCache中實現(xiàn)的,是業(yè)務(wù)數(shù)據(jù)緩存的存放空間,并根據(jù)LRU算法自動清除不常用數(shù)據(jù),保證內(nèi)存的充足,保證緩存存取性能;

緩存插件層即為本發(fā)明的核心實現(xiàn),在插件層中處理業(yè)務(wù)層對緩存的增刪改查。處理緩存版本序列的更新,處理配置文件的更新和加載,使數(shù)據(jù)庫中的數(shù)據(jù)和最新版本的業(yè)務(wù)緩存中的數(shù)據(jù)一致。

緩存插件層主要由三個組件構(gòu)成:

MemCacheExecutor 、 CacheVersionManager和ConfigrationManager 。

一、MemCacheExecutor是執(zhí)行器層緩存接口的一種實現(xiàn),是一個攔截器,攔截BaseExecutor(持久化執(zhí)行器)的幾個關(guān)鍵的方法,是本文實現(xiàn)方式的執(zhí)行核心;

MemCacheExecutor攔截器實現(xiàn)了BaseExecutor事件的響應(yīng),主要有以下幾點(diǎn):

1. BaseExecutor執(zhí)行query操作時,

1.1 記錄下該查詢StatementId和sql,解析出GroupPrefix、ident1和ident2并將其傳遞給CacheVersionManager;

1.2 收到CacheVersionManager返回的版本信息,組裝成Key,到緩存對象層查詢數(shù)據(jù)。

2. 每當(dāng)Executor執(zhí)行了update操作時,使用此update操作的StatementId和sql,解析出GroupPrefix、ident1和ident2,傳遞給 CacheVersionManager,讓 CacheVersionManager根據(jù)此update的具體信息,去提升緩存對象層的緩存版本對象中的版本信息。

二、CacheVersionManager,是本文實現(xiàn)方式的管理核心,體現(xiàn)著本文實現(xiàn)方式的高效,它維護(hù)著緩存對象層的緩存版本對象中的版本信息,具有以下工作場景:

1. 如果MemCacheExecutor執(zhí)行Query的時候,CacheVersionManager為MemCacheExecutor在緩存對象層的緩存版本對象選定或新建版本信息,并返回;

2. 如果MemCacheExecutor執(zhí)行Update的時候,CacheVersionManager在緩存對象層的緩存版本對象選定版本信息,并提升此版本信息,使歷史緩存失效;

三、ConfigrationManager,是配置管理的一種實現(xiàn),讀取配置文件,形成 GroupPrefix:[ident1,ident2]的映射關(guān)系,來決定哪些StatementId需要緩存,建立緩存的2個參數(shù)維度是什么,來給MemCacheExecutor和CacheVersionManager來使用。

通過上面具體實施方式,所述技術(shù)領(lǐng)域的技術(shù)人員可容易的實現(xiàn)本發(fā)明。但是應(yīng)當(dāng)理解,本發(fā)明并不限于上述的具體實施方式。在公開的實施方式的基礎(chǔ)上,所述技術(shù)領(lǐng)域的技術(shù)人員可任意組合不同的技術(shù)特征,從而實現(xiàn)不同的技術(shù)方案。

除說明書所述的技術(shù)特征外,均為本專業(yè)技術(shù)人員的已知技術(shù)。

當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
桃江县| 贵德县| 南京市| 永顺县| 上犹县| 鄄城县| 墨竹工卡县| 临朐县| 康定县| 阿拉善左旗| 辽宁省| 宽甸| 深圳市| 库伦旗| 曲水县| 绥化市| 朝阳区| 邵武市| 南宁市| 平昌县| 华宁县| 敖汉旗| 轮台县| 科尔| 宁化县| 如东县| 东乡| 子洲县| 扶风县| 湘乡市| 临海市| 开封市| 镇远县| 延庆县| 遵化市| 缙云县| 额敏县| 平昌县| 建平县| 井研县| 扎赉特旗|