浅谈一个缓存小实践,另外还有更多案例,欢迎关注~
不能辜負大家的關注,來一篇吧!記得面試的時候別說沒用過redis!!!
為防止打穿底層MD部門,所以在調用jsf服務的時候進行查詢數據的緩存處理。我們先說示例,再談理論!
示例
使用的redis是,JD的redis客戶端;
/*** 京東redis客戶端*/ private Cluster jdRedisClient;使用的存儲對象方法,采用setObjectByExpire()
/*** 以有效期的方式存儲對象* * @param key 存儲key* @param object 存儲對象* @param seconds 有效期,秒* @return true:保存成功,false:保存失敗*/ @Override public boolean setObjectByExpire(String key, Object object, long seconds, TimeUnit timeUnit) {try {String json = JSON.toJSONString(object);jdRedisClient.set(key, json);jdRedisClient.expire(key, seconds, timeUnit);return true;} catch (Exception e) {return false;} }根據key獲取元素采用getObject()
/*** 根據key獲取元素* * @param key 存儲key* @param clazz 類類型* @return 如果為空則無數據或拋出異常*/ public <T> T getObject(String key, Class<T> clazz);校驗key是否存在采用exists()
/*** 校驗key是否存在* * @param key* @return true:存在,false:不存在,如果拋出異常則默認不存在*/ public boolean exists(String key);在jsf調用結束將查詢結果進行存儲。
redisUtils.setObjectByExpire(RedisKey.HEALTH_KEY + (自行定義), model, RedisKey.WEEK, TimeUnit.SECONDS);由于數據屬于不輕易會改變的數據,所以設置過期時間1周。 RedisKey.WEEK=606024*7。
然后在每次調用前進行判斷,如果存在這個key,那么我們從緩存中獲取,如果沒有我們再去通過jsf接口調用,并且存儲這個調用結果。
if (redisUtils.exists(RedisKey.HEALTH_KEY + (自行定義))){model = redisUtils.getObject(RedisKey.HEALTH_KEY + (自行定義), ContractAttrVO.class);}整體代碼邏輯:
if (redisUtils.exists(RedisKey.HEALTH_KEY + (自行定義))){model = redisUtils.getObject(RedisKey.HEALTH_KEY + (自行定義), ContractAttrVO.class); }else {conExtAttrByPin = xxx.getxxx((自行定義), atteTypeSet);Assert.notNull(conExtAttrByPin);Assert.notNull(conExtAttrByPin.getModel());model = conExtAttrByPin.getModel();redisUtils.setObjectByExpire(RedisKey.HEALTH_KEY + (自行定義), model, RedisKey.WEEK, TimeUnit.SECONDS); }當然,這只是一個最經典,最常用的緩存手段。
我們知道緩存作為系統性能提升的優先法寶。那么簡單的實踐說過了,說一說概念上的知識!
理論
緩存分類
緩存一般有以下幾類:客戶端、瀏覽器、CDN緩存、NGINX緩存、應用緩存及統一緩存(如redis)。
客戶端緩存:很少使用,一般都是傳統企業才會使用。把不變化或很長時間才變化的數據按一定格式存儲在客戶端的本地文件中,使用時通過js讀取解析使用,延用了C/S結構的方式,適合數據量很大業務且技術有所不足的開發。
瀏覽器緩存:這種形式使用很廣泛,極大地提升了用戶體驗,但有時會出現沒及時更新導致顯示“錯誤”的信息。把已經請求過的Web資源(如html頁面,圖片,js,css等)拷貝一份副本儲存在瀏覽器中,緩存會根據進來的請求保存輸出內容的副本。這種緩存帶來的好處有三點:減少網絡帶寬消耗,降低服務器壓力,減少網絡延遲、加快頁面打開速度,適合請求量大、靜態的數據請求。
CDN緩存:在用戶和服務器之間增加cache層,把數據存放到內容分發網絡機房服務器中,用戶請求進從最近的CDN節點獲取。主要緩存圖片、js及css文件,CDN需要付費,有些規模的網站才會使用。
NGINX緩存:對客戶已經訪問過的內容在Nginx服務器本地建立副本,達到減少Nginx服務器與后端服務器之間的網絡流量。
應用緩存:在后端應用中使用緩存,如java常使用Ehcache及gauva緩存組件進行數據緩存,也可以針對特殊場景在請求中進行線程緩存。適合調用量大且應用內部方法間調用,減少網絡消耗。
統一緩存:使用內存減少對數據庫的直接訪問,提高網站性能,如使用memcache或redis搭建緩存服務。
前四類都是在網絡傳輸中進行數據緩存,一般研發很少會去使用,后兩類在應用中緩存,在開發中經常使用。
結語
具體的案例,下次才說吧,寫文章的時間還是較少,有點空還是想歇歇,貪玩呀!有一起王者的嗎?嘿嘿
總結
以上是生活随笔為你收集整理的浅谈一个缓存小实践,另外还有更多案例,欢迎关注~的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: String 转化 list
- 下一篇: 项目中的异常处理应不应该获取后重新抛?