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