方案一:
- 給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:根據算法能夠任意累加