新聞中心
壓力

高并發(fā)場景下,讀取大KEY的壓力是一種普遍的問題,Redis常用于緩存相關服務,并且對大Key讀取做了優(yōu)化。對于大Key讀取,能夠優(yōu)雅地處理這種現(xiàn)象。
##### 1.切分大Key
在redis讀取大key的場景下,首先要做的就是切分大Key,并將之分到多個小Key下。切分的時候需要考慮用戶的完整使用體驗,將界面上不容易區(qū)分的部分切分,但是又不影響整體的流程。切分后的小Key,可以精準的跟蹤用戶行為,可以更直觀的分析數(shù)據(jù),而且讀取數(shù)據(jù)的時候也更快更靈活,如下所示:
//例如:將大Key"userInfo"切分為以下幾個小Key
userInfo:username
userInfo:phone
userInfo:eml
##### 2.哈希類型存儲
對大Key讀取的時候,我們可以使用哈希類型來存儲,相比于字符串或者列表,哈希類型只要取出一次,就能讀取出多個字段,大大減少IO操作次數(shù),提高性能。如下所示:
//在存儲的時候:
HSET userinfo username Tom
HSET userinfo phone 15511111111
HSET userinfo eml [email protected]
//在獲取的時候:
HMSET userinfo username Tom phone 15511111111 eml [email protected]
+ HMGet命令可以快速獲取用戶手機號,郵箱等字段值,而不需要遍歷全部字段,大幅減少IO操作。
+ 由于大量Key使用哈希類型存儲,碎片化問題會急劇加劇,而因此Redis 4.0之后的版本采用了虛擬槽(cluster slot)的技術,將哈希類型的存儲分散到多個節(jié)點中,使Redis在存儲哈希類型的時候更加穩(wěn)定。
##### 3.對象緩存
在存儲大Key的時候,可以使用JSON格式存儲,然后將其緩存到Redis中,極大的簡化了存儲和讀取的工作量。實現(xiàn)方式如下所示:
//定義User對象
class User{
private String username;
private String phone;
private String eml;
//getter/setter
}
//存儲對象
JSONObject userJsonObject = new JSONObject();
//將user對象轉換成json
userJsonObject.put("username",user.getUsername());
userJsonObject.put("phone",user.getPhone());
userJsonObject.put("eml",user.getEml());
//存儲到Redis
jedis.set("userInfo",userJsonObject.toJSONString());
//讀取對象
String userJsonString = jedis.get("userInfo");
//將json轉換成User對象
User user = (User)JSONObject.toBean(JSONObject.fromObject(userJsonString),User.class);
使用對象緩存能夠更簡單的讓我們的數(shù)據(jù)存儲在Redis中,同時讀取也更加方便。
以上三個方式,都可以優(yōu)雅的解決大Key讀取的壓力,能有效的提高系統(tǒng)的并發(fā)吞吐性能。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
文章標題:Redis優(yōu)雅地解決大Key讀?。╮edis讀取大key)
標題網(wǎng)址:http://www.fisionsoft.com.cn/article/cdioihc.html


咨詢
建站咨詢
