對caffeine的配置我們只要配置乙個快取的最大值和過期時間即可,這是我們在專案中需要用到的。
# caffeine
caffeine.posts.max-size=
15caffeine.posts.expire-seconds=
180
這是一篇對caffeine進行簡單但是詳細介紹的部落格
在我們的專案中我們主要使用loadingcache,是乙個同步快取會阻塞的介面。
宣告兩個分別表示帖子列表的快取和帖子總數的快取列表的loadingcache例項。
// 帖子列表的快取
private loadingcache
> postlistcache;
// 帖子總數的快取
private loadingcache
postrowscache;
我們先不例項化這兩個物件,先來看看怎麼在原來的方法中使用,當是查詢熱門帖子列表的時候,直接使用postlistcache.get()方法即可,該方法會得到該cache中的內容,如果過期或者沒有內容的話會呼叫其load()方法得到資料返回並同步快取。
public list
finddiscussposts
(int userid,
int offset,
int limit,
int ordermode)
logger.
debug
("load post list from db.");
selectdiscussposts
(userid,offset,limit,ordermode)
;}
接下來,我們就來初始化帖子列表的快取,我們可以在@postconstruct註解標註的init()方法中初始化。我們使用caffeine提供的newbuilder()方法來設定快取的最大容量和過期方式和時間,然後在build()中匿名例項化乙個cacheloader物件即可。在該方法中我們首先檢查key是否合法,合法的話就得到offset和limit,然後這裡我們使用二級快取的方式,caffeine->redis->db這樣的方式。
因此,當本地快取不存在的時候,我們先去redis里查,如果redis裡沒有就去資料庫里查到需要的資料,然後存入redis並設定過期時間,然後返回該資料即可,caffeine會將該資料作為快取進行同步。如果redis中有,首先檢視是否過期,如果過期了也是從資料庫裡查詢然後同步到redis和caffeine中,如果沒有過期就將redis中的資料作為結果返回。
redis對於過期資料的處理一般是惰性刪除,即過期之後不立刻刪除,等到下次讀/寫的時候才會將資料刪除,因此其實可以不用寫過期之後的處理,同沒有該key是一樣的,但是為了邏輯的完善還是寫上去了。
// 初始化帖子列表快取
postlistcache = caffeine.
newbuilder()
.maximumsize
(maxsize)
.expireafterwrite
(expireseconds, timeunit.seconds)
.build
(new
cacheloader
>()
string[
] params = key.
split
(":");
if(params == null || params.length !=2)
int offset = integer.
valueof
(params[0]
);int limit = integer.
valueof
(params[1]
);// 二級快取:redis -> mysql
string rediskey = rediskeyutil.
gethotpostlistkey
(offset,limit)
;// 如果redis中不存在就去資料庫里查,查到了就更新到redis中,然後返回作為本地快取的同步if(
!redistemplate.
haskey
(rediskey)
) redistemplate.
expire
(rediskey,
15,timeunit.seconds)
;return result;
}else
redistemplate.
expire
(rediskey,7*
60,timeunit.seconds)
;return result;
}else
return list;}}
}});
這樣就實現了對熱門帖子的二級快取,然後我們需要對快取的效能進行簡單的測試,這裡我們使用jmeter進行測試,我們使用120個執行緒組以隨機時間對不使用快取的熱門頁進行訪問,檢視其吞吐量,然後以同樣的條件訪問帶快取的熱門帖子進行對比吞吐量。
我們可以看到有快取的吞吐量有200+,而沒有快取的吞吐量只有14不到,吞吐量的差距是十分巨大的。
mysql效能優化 伺服器優化(筆記四)
伺服器的硬體效能直接決定著mysql資料庫的效能,硬體的效能瓶頸,直接決定mysql資料庫的執行速度和效率。需要從以下幾個方面考慮 1 配置較大的記憶體。足夠大的記憶體,是提高mysql資料庫效能的方法之一。記憶體的 io比硬碟快的多,可以增加系統的緩衝區容量,使資料在記憶體停留的時間更長,以減少磁...
優化伺服器設定 高效能MySQL
mysql有大量可以修改的引數 但不應該隨便去修改。通常只需要把基本的項配置正確 大部分情況下只有很少一些引數是真正重要的 應該將更多的時間花在schema的優化 索引,以及查詢設計上。在正確地配置了mysql的基本配置項之後,再花力氣去修改其它配置項的收益通常就比較小了。1.建立mysql配置檔案...
c 伺服器開發之效能優化
為什麼要寫這篇文章?聊技術的時候,談到記憶體問題 cpu問題 效率問題的時候,無疑是考量乙個工程師的實戰水平,作為c 開發工程師,沒有自己解決以上問題的專業手段,或許就是缺陷。我之所以寫這個文章,主要是為了記錄 分享我的辦法。我之前寫過記憶體洩漏的一篇文章 其實也是一種手段,如果為你所用,聊技術的時...