用SpringAOP結合MemCached作緩存的設想

方案一:
  • 給DAO的方法上加SpringAOP的Around通知,決定數據從數據庫得到仍是從緩存得到。
  • 自定義一個@MemEntity,對此Dao全部按主鍵和惟一鍵查詢進行緩存。
  • 規則:查詢的方法名getByField 更新updateByField 刪除deleteByField
  • 其餘的方法查詢不做緩存,其餘的方法更新和刪除操做會刷新全部以該類開頭的keys
  • 記錄緩存時用「類名_方法名_參數值」做爲Key,刪除緩存時,刪除全部的「類名_*_參數值」的key對應的緩存
方案二:
1,給DAO的方法上加SpringAOP的Around通知,決定數據從數據庫得到仍是從緩存得到。
2,自定義兩個Annotation,@Cache和@Flush,分別加在DAO的查詢和修改的方法上。
3,Around通知函數內用反射獲取上述的@cache和@Flush,表明是記錄緩存,仍是刪除緩存。
4,記錄緩存時用「類名+方法名+參數的hashcode」做爲Key,刪除緩存時,刪除全部的同類名開頭的key對應的緩存。
5,Memcached不支持遍歷key,因此採用數據庫表記錄key,假設:tbl_memcached(key,exp_date)。
6,定義一個時鐘,按期刪除tbl_memcached的過時記錄(刪除數據庫記錄前,刪除緩存)。
7,記錄緩存時,同時存入一條記錄到tbl_memcached表。
8,刪除緩存是依據tbl_memcache表的key來進行,而且要刪除tbl_memcached表的相關記錄。
 
備註:
a:表tbl_memcache(key,exp_date)存儲全部memcache的key

 

1:對單個記錄進行緩存(查詢條件是主鍵或惟一鍵):
 存儲規則 key  value 
 主鍵  class_method_id_value  search result
 惟一鍵  class_method_unique_value class_method_id_value 

存儲規則:保存到memcache和tbl_memcache中
更新規則:只更新上面的主鍵的search result,並更新key爲class_select*的數據
 

2:只對經常使用而且基本不會修改的列表查詢進行緩存(常常更新不建議緩存)算法

存儲規則:key爲class_method_hashcode,保存到memcache和tbl_memcache中
更新規則:從tbl_memcahce表中查詢全部知足「class_」前綴keys,在memcache和tbl_memcache中刪除
 
3:對 查詢條件不是主鍵或惟一鍵 的數據不進行緩存

4:更新條件不是主鍵和惟一鍵的操做(避免這樣的操做)數據庫

更新規則:從tbl_memcahce表中查詢全部知足「class_」前綴keys,在memcache和tbl_memcache中刪除
 
5:能夠對某一個查詢結果進行緩存,key爲自定義,任何其餘的更新都不會影響它,只有你明確刪除此緩存
 
關於tbl_memcahce:

定義一個時鐘,按期刪除tbl_memcached的過時記錄(刪除數據庫記錄前,刪除緩存)緩存

默認緩存時間爲1個小時,對錶的掃描根據時間段進行分配
防止tbl_memcache過於龐大,能夠進行分表,規則以下:
1:幾個表放入一個tbl_memcache_n
2:根據算法能夠任意累加
相關文章
相關標籤/搜索