原創聲明:本文純屬原創,如需轉載,請指明出處git
關於緩存框架,本人早年在一些中小型項目中本身用Map封裝過一個進程內的本地緩存方案。後來陸續用過ehcache、及memcache等特定廠商實現的緩存。他們之間沒有太大的可比性,由於各自都有本身的特色和優劣。而因業務場景的複雜多變,讓我開始考慮在同一個應用系統中可否同時使用不一樣的緩存實現。spring
然而,若是直接使用每一個緩存廠商本身的api來實現這種需求,將會使得業務代碼與緩存操做的在代碼混在一塊兒,可移值和可維護性都不好。爲了解決可移值性問題,spring3給出了一種經過註解的方式來統一api,spring3的緩存模塊,除了給出了一種基於Map的內存實現外,並無其它的具體實現,須要用戶本身配置一個特定緩存實現的緩存管理器。數據庫
然而,spring的support包中只提供ehcache等少數幾種緩存的緩存管理器實現。對於諸如memcache等緩存,仍是要本身實如今緩存管理器。並且還有諸如當數據庫中沒有數據時,由於沒有緩存null值,致使每次從都數據庫中查詢引發緩存穿透現象,還有諸如,當memcache掛掉時,若是暫停使用緩存等等。再如,如何要爲同一種類型的不一樣實例在緩存中緩存存活時間不同等等這種個性化的需求spring框架並無很好的支持,須要本身實現。api
從本週開始,將陸續經過文檔展現一個本身實現的通用緩存框架,知足上述全部需求,總結以下:緩存
一、提供統一的緩存操做api(包括註解以及相應的工具類)。服務器
2、支持同時使用多種緩存實現。這樣作可適用的一個業務場景就是:如在某遊戲系統中能夠經過配置將會員信息緩存到分佈式部署的memcache緩存中,而將會員後臺界面中的權限菜單緩存在本地ehcache緩存或者乾脆放到基於Map的內置緩存中(會員只能在同一個服務器登陸,所以好比權限菜單之類的數據不必緩存到分佈式緩存容器中)。微信
3、提供靈活的配置。全部須要緩存的數據都經過配置實如今具體使用什麼緩存,並能夠隨時經過修改配置進行切換。框架
4、須要防止緩存穿透。以便在數據庫中沒有數據時,因緩存沒法命中而每次都查詢數據庫。分佈式
5、須要能夠靈活指定緩存存活時間。好比讓某些比較重要的會員在緩存中存久一點,而讓某些不重要的會員在緩存中存短一點。工具
6、須要任意控制緩存的停用或啓用。好比,在使用memcache緩存時,memcache服務器尚未搭建好,能夠先在應用層上暫停使用緩存,等memcache服務器正常了,再啓用緩存。
知足以上需求的通用緩存框架,本人已經基本實現,目前處於測試和寫文檔階段。
目前JAD-CACHE項目已在開源中國碼雲平臺上開源,地址:
https://git.oschina.net/457049726/jad-cache
想了解更多信息或者想及時知道進展的同窗們能夠掃描如下二維碼關注本人的微信公衆號,多謝。
歡迎掃碼關注本人微信公衆號以獲取最新進展及更多信息