高效Redis工具類

2021-10-11 01:39:23 字數 3819 閱讀 1868

在日常的開發中,我們或多或少(必須)的會用到快取。為了提高系統效能、提公升使用者體驗度,使用者體驗是多麼的重要;這就要求在軟體設計時,不但要注重可靠性、安全性、可擴充套件性以及可維護性等等的一些指標,更要注重使用者的體驗,使用者體驗分很多方面,但是有一點非常重要就是對使用者操作的響應一定要快;怎樣提高使用者訪問的響應速度,這就是擺在架構設計中必須要解決的問題;說到提高服務的響應速度就不得不說快取了;

從系統的層面說,cpu的速度遠遠高於磁碟io的速度;所以要想提高響應速度,必須減少磁碟io的操作,但是有很多資訊又是存在資料庫當中的,每次查詢資料庫就是一次io操作;請求響應時間等於網路響應時間和伺服器響應時間;網路我們控制不了,伺服器響應時間包括cpu計算時間和磁碟io時間,其中cpu計算時間這個有硬體資源決定的,我們儘量減少演算法的複雜度來減少它,磁碟io時間,這個時間是非常慢的,應該儘量減少;

當客戶端呼叫某個介面獲取資訊的時候,執行順序1、2、3、4;由於資訊存放在db中,所以2、3就有一次磁碟io操作;這個看似非常簡單業務邏輯,但是當你做架構設計的時候往往要考慮最壞的場景,或者當成千上萬的使用者頻繁的呼叫這個介面應該怎麼處理?如果按照上圖這樣的架構處理,這個看似簡單業務的介面會使整個系統變慢,這樣使用者的請求就會長時間得不到響應;這樣的問題怎麼解決那,這時候就該快取登場了;

快取有很多種、也有很多種快取策略。這裡就不一一就**了,畢竟這篇部落格是講關於的工具類!總之一句話,要想提高系統的效能,儘量減少io的操作,特別是磁碟io的操作;使用快取可以有效的避免這種情況;所以在架構設計過程中,涉及到查詢資料庫的時候,應該考慮一下是不是使用快取技術來提高系統的效能,並且降低資料庫的壓力。

在根據某個需求設計業務的時候,比如說購物車:涉及到新增、查詢、修改、刪除。不說這四個具體實現時候的細節,這不就簡單的對資料庫增、刪、改、查嗎?但是,當成千上萬的使用者頻繁訪問的時候,簡單的事情在高併發的情況下就會變的不簡單!這個時候就需要有個東西來代替資料,而且還要比資料庫更快,來應對可能出現的高併發!所以我們想到了(redis)快取,作為乙個key / value 存在,很多開發者自然的使用set/get 方式來使用 redis  ,實際上這並不是最優化的使用方法。尤其在未啟用vm 情況下,redis 全部資料需要放入記憶體,節約記憶體尤其重要。 假如乙個key-value單元需要最小占用512位元組,即使只存乙個位元組也佔了512位元組(比如set/get,乙個key-value對應一條資料)。這時候就有乙個設計模式,可以把key復用,幾個key-value作為乙個大的value,大的value再作為乙個value,set存入乙個key中。這樣同樣512位元組就會存放10-100倍的容量。 這就是為了節約記憶體,建議使用hash型別而不是set/get的方式來使用redis。

在日常開發中,我們會把業務中的所有特性封裝成乙個物件,再把這個物件存入到redis快取中。在使用redis的時候,通常會把redis常用的方法封裝成乙個工具類。然後我們呼叫工具類中的方法,把存入的物件傳到方法中。通常方法會把物件轉換成string存入快取,需要的時候再把string取出來,然後再轉換成物件!大多數的情況就是如此,但是在我實際的開發中傳入的是個和業務有關的物件,返給我的卻是乙個object物件(和業務沒有半毛錢關係)。我想要讓返回的物件和業務有關,還得強轉一下!這返回的是單個物件,如果是個list呢?迴圈強轉嗎?那如果是map呢?當然肯定都是能轉的,但是這樣就增加了實際業務中的**量!在我看來多一行於業務無關的**都是罪惡的(縱然它是為了和業務產生關聯),我想要的是 我給你存的是啥!返回的就是啥!別整那些沒用的......

/**

* 返回hash中指定儲存位置的值

* @param key

* @param fieid

* @param obj

* @param

* @return

*/publict hget(string key,string fieid,t obj) ",key +"+"+ fieid);

jedis = jedispool.getresource();

string hget = jedis.hget(key, fieid);

t t =(t) om.readvalue(hget, obj.getclass());

return t;

} catch (exception e)

finally

}呼叫:

//呼叫hget方法

demodto demodto = jedis.hget(

"key", "fieid", new demodto());

/**

* 獲取hash中value的集合,指定返回的集合型別

* @param key

* @param obj

* @param

* @return

*/publiclisthvals(string key,t obj) ",key);

jedis = jedispool.getresource();

listhvals = jedis.hvals(key);

iteratoriterator = hvals.iterator();

listreturnlist = new arraylist<>();

while (iterator.hasnext())

return returnlist;

} catch (exception e) ",e.getmessage());

return null;

} finally

}呼叫:

//呼叫hvals方法

listdemolistdtos = jedis.hvals("key", new demodto());

/**

* 以map的形式返回hash中的儲存和值

* @param key

* @param obj

* @param

* @return

*/ publicmap hgetall(string key,t obj) ",key+"+"+obj);

jedis = jedispool.getresource();

map map = jedis.hgetall(key);

map returnmap = new hashmap<>();

for (map.entry e : map.entryset())

return returnmap;

} catch (exception e) " + e.getmessage());

return null;

} finally

}呼叫:

//呼叫hgetall方法

map stringdemodtomap = jedis.hgetall("key", new demodto());

/*** 關閉jedis連線池

* @param jedis

*/private void closeredis(jedis jedis)

catch (exception e)}}

closeredis 釋放資源 防止達到最大連線數出現異常 如 :maxtotal=300

如果每次獲取完redis連線,不歸還redis連線池的話,當超過redis的最大連線數。然後redis就雪崩了!注意!注意!!!

redis工具類解析

1 首先在spring redis.xml檔案中配置了jedispoolconfig這樣乙個bean,其對應的class是com sowell redis route redisinitutil,同時在spring載入的時候會呼叫這個類中的init方法。這個方法的作用如下 如果資料庫開啟了redis...

Redis 工具類 鎖

list刪除指定元素 public final long lrem string key,long count,string value finally return var5 從列表中從頭部開始移除count個匹配的值。如果count為零,所有匹配的元素都被刪除。如果count是負數,內容從尾部開...

node 操作redis 工具類

const redis require ioredis const redisconfig require config env redis const redis newredis redisconfig.redis handle redis error logger error redis.on...