1. 程式人生 > >在專案中redis做快取的一些思路

在專案中redis做快取的一些思路

首先,快取的物件有三種:

1:資料庫中單條的的資料(以表名跟id作為key永久儲存到redis),在有更新的地方都要更新快取(不適用於需要經常更新的資料);

2:對於一些不分頁,不需要實時(需要多表查詢)的列表,我們可以將列表結果快取到redis中,設定一定快取時間作為該資料的存活時間。用獲取該列表的方法名作為key,列表結果為value;這種情況只試用於不經常更新且不需要實時的情況下。

3:不需要實時的,需要分頁的列表:可以把分頁的結果列表放到一個map(key為分頁標識,value為分頁結果)中,然後將該map存到redis的list中(用該方法名為key)。然後給該list設定一個快取存活時間(用expire)。這樣通過方法名lrange出來就能獲取存有分頁列表的資料,遍歷該list,通過遍歷list中map的key判斷該分頁資料是否在快取內,是則返回,不存在則rpush進去。這種做法能解決比如1-5頁的資料已經重新載入,而6-10頁的資料依然是快取的資料而導致髒資料的情況。

本人走過的一些彎路:

1.對於資料快取不是所有東西都快取到redis就是好的,而是要針對一些改動不大或者訪問率大的資料進行快取來減少關係型資料庫的壓力。

2.不要試圖在攔截器或者過濾器中判斷是否有快取的存在,因為每個請求(不管該請求對應的方法是否做了快取)它都會去redis中請求資料並判斷,這樣會浪費一定的記憶體資源跟響應時間。所以應該針對需要快取的方法進行判斷。

3.一個方法中使用多個get或者set的方法,我們需要儘可能的減少去jedispool中獲取jedis物件,所以在一個方法中應該只獲取一次jedis物件,在方法結束的時候把該物件return還給連線池,這樣才能做到儘可能的高效。

4.在設定連線池中引數的時候要考慮到自身系統需求,不然會經常出現連線池中無可用物件獲取,spring時不時發起連線請求到redis等不必要的錯誤和資源浪費。