欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis節(jié)省內(nèi)存的十個技巧分享

 更新時間:2024年04月28日 08:39:31   作者:江小北  
你是否在工作中遇到過Redis的bigkey導(dǎo)致的內(nèi)存占用嚴重、查詢耗時大大增加?同時bigKey還可能導(dǎo)致Redis實例的崩潰,因為內(nèi)存不夠用了,所以本文給大家介紹了Redis極大節(jié)省內(nèi)存的10個技巧,需要的朋友可以參考下

引言

你是否在工作中遇到過Redis的bigkey導(dǎo)致的內(nèi)存占用嚴重、查詢耗時大大增加?

同時bigKey還可能導(dǎo)致Redis實例的崩潰,因為內(nèi)存不夠用了,Redis就會不堪重負,像是被大象坐了一樣,瞬間崩潰!

所以,大家在使用Redis的時候一定要小心,Redis內(nèi)存是十分寶貴的資源,我們在使用時,要特別注意對內(nèi)存資源的合理應(yīng)用。

下面帶大家了解下Redis極大節(jié)省內(nèi)存空間的10個實用技巧。

正文

什么是bigkey

在面試過程中,發(fā)現(xiàn)很多人都對bigkey的概念搞錯了,認為bigkey是一個key比較大的存儲對象。

其實不是的,我們不能用英文直譯的方式來理解它。所以這里還是給大家科普下:

bigkey,其實就是Redis中占用大量內(nèi)存空間的鍵,具體來說,就是那些因為存儲了大量數(shù)據(jù),或者單個數(shù)據(jù)項太大,導(dǎo)致內(nèi)存占用嚴重的鍵。

簡單點來說:就是這個redis的某個鍵(key)存了太多的數(shù)據(jù),占用了太多的內(nèi)存

Redis節(jié)省內(nèi)存的方式就是合理的運用Redis的數(shù)據(jù)結(jié)構(gòu),減少redis的bigkey的產(chǎn)生, 以及做好內(nèi)存的清理和淘汰策略。

1、使用Hash數(shù)據(jù)結(jié)構(gòu)

Hash是Redis提供的一種非常靈活的數(shù)據(jù)結(jié)構(gòu),可以存儲鍵值對的集合。 如果我們存儲對象類型的數(shù)據(jù),建議使用Hsah

假設(shè)我們有一個電商網(wǎng)站,需要存儲商品的信息,比如商品名稱、類目、屬性等,這時候就可以用Hash數(shù)據(jù)結(jié)構(gòu)來存儲,一個商品對應(yīng)一個Hash。

// 使用Hash存儲商品信息
String userId = "product:1001";
jedis.hset(userId, "productName", "xxxx");
jedis.hset(userId, "category", "手機");
jedis.hset(userId, "prop", "xxx");

2、使用壓縮列表優(yōu)化小規(guī)模列表

當(dāng)你需要存儲的列表元素數(shù)量不多時,Redis會自動使用壓縮列表來存儲,這樣可以節(jié)省內(nèi)存空間。

比如在一個論壇系統(tǒng)中,用戶發(fā)布了一篇文章,我們可以用列表來存儲文章的評論,而且這篇文章評論不多的話,就可以充分利用壓縮列表的優(yōu)勢。

// 使用壓縮列表存儲文章評論
String articleId = "article:2001";
jedis.lpush(articleId + ":comments", "評論1", "評論2", "評論3");

3、使用Bitmaps存儲布爾值信息

Bitmaps是一種非常緊湊的數(shù)據(jù)結(jié)構(gòu),適合存儲布爾值信息。

在我們平時開發(fā)過程中,會有一些 bool 型數(shù)據(jù)需要存取,比如用戶一年的簽到記錄,簽了是 1,沒簽是 0,要記錄 365 天。如果使用普通的 key/value,每個用戶要記錄 365 個,當(dāng)用戶上億的時候,需要的存儲空間是驚人的。

為了解決這個問題,Redis 提供了位圖數(shù)據(jù)結(jié)構(gòu),這樣每天的簽到記錄只占據(jù)一個位,365 天就是 365 個位,46 個字節(jié) (一個稍長一點的字符串) 就可以完全容納下,這就大大節(jié)約了存儲空間。

// 使用Bitmaps存儲用戶簽到情況
String userId = "user:1001";
int day = 10; // 簽到的天數(shù),從0開始計算
jedis.setbit("sign_in:" + day, Long.parseLong(userId), true);

4、使用ZSET存儲有序集合

ZSET是Redis中的有序集合數(shù)據(jù)結(jié)構(gòu),可以按照指定的分數(shù)進行排序。

比如在一個新聞網(wǎng)站中,我們可以使用ZSET來存儲新聞文章的閱讀量排行榜,分數(shù)表示閱讀量,文章ID作為成員。

// 使用ZSET存儲文章閱讀量排行榜
String articleId = "article:3001";
jedis.zadd("article:views", 1000, articleId);

5、使用SET存儲唯一值

SET數(shù)據(jù)結(jié)構(gòu)適合存儲唯一值,比如用戶的喜好標簽、商品的標簽等。

在一個電商平臺中,我們可以使用SET來存儲商品的標簽,確保每個標簽都是唯一的。

// 使用SET存儲商品標簽
String productId = "product:5001";
jedis.sadd(productId + ":tags", "電子產(chǎn)品", "數(shù)碼設(shè)備", "智能家居");

6、使用HyperLogLog進行基數(shù)統(tǒng)計

HyperLogLog是一種用于統(tǒng)計不重復(fù)元素數(shù)量的算法,在統(tǒng)計網(wǎng)站的UV(獨立訪客)數(shù)量時非常有用。 比如:

如果你負責(zé)開發(fā)維護一個大型的網(wǎng)站,有一天老板找產(chǎn)品經(jīng)理要網(wǎng)站每個網(wǎng)頁每天的 UV 數(shù)據(jù),然后讓你來開發(fā)這個統(tǒng)計模塊,你會如何實現(xiàn)?

如果統(tǒng)計 PV 那非常好辦,給每個網(wǎng)頁一個獨立的 Redis 計數(shù)器就可以了,這個計數(shù)器的 key 后綴加上當(dāng)天的日期。這樣來一個請求,incrby 一次,最終就可以統(tǒng)計出所有的 PV 數(shù)據(jù)。

但是 UV 不一樣,它要去重,同一個用戶一天之內(nèi)的多次訪問請求只能計數(shù)一次。這就要求每一個網(wǎng)頁請求都需要帶上用戶的 ID,無論是登陸用戶還是未登陸用戶都需要一個唯一 ID 來標識。

這時候就可以引入HyperLogLog, HyperLogLog 數(shù)據(jù)結(jié)構(gòu)就是用來解決這種統(tǒng)計問題的。

HyperLogLog 提供不精確的去重計數(shù)方案,雖然不精確但是也不是非常不精確,標準誤差是 0.81%,這樣的精確度已經(jīng)可以滿足上面的 UV 統(tǒng)計需求了,又大量節(jié)省了內(nèi)存

HyperLogLog 實現(xiàn)中用到的是 16384 個桶,也就是 2^14,每個桶的 maxbits 需要 6 個 bits 來存儲,最大可以表示 maxbits=63,于是總共占用內(nèi)存就是2^14 * 6 / 8 = 12k字節(jié)。

// 使用HyperLogLog統(tǒng)計網(wǎng)站UV
String today = "2024-04-23";
String userId = "user:1001";
jedis.pfadd("uv:" + today, userId);

7、使用String存儲序列化的數(shù)據(jù)

雖然Redis提供了豐富的數(shù)據(jù)結(jié)構(gòu),但有時候我們?nèi)匀恍枰獙?fù)雜的數(shù)據(jù)結(jié)構(gòu)序列化為字符串存儲。

比如在一個微博系統(tǒng)中,我們可以將用戶的微博對象序列化為JSON字符串,然后存儲到Redis中。

// 使用String存儲序列化后的用戶微博對象
UserPost userPost = new UserPost("user:1001", "今天天氣真好!", new Date());
String userPostJson = objectMapper.writeValueAsString(userPost);
jedis.set("user:1001:post:1", userPostJson);

8、使用Pipeline批量操作命令

Pipeline是一種批量操作命令的機制,可以減少網(wǎng)絡(luò)通信開銷,提高操作效率。

在需要進行大量操作時,使用Pipeline可以有效節(jié)省內(nèi)存空間和提升性能。

//使用Pipeline批量設(shè)置鍵值對
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 10000; i++) {
    pipeline.set("key:" + i, "value:" + i);
}
pipeline.sync();

9、定期清理過期數(shù)據(jù)

定期清理過期數(shù)據(jù)是保持Redis內(nèi)存空間有效利用的重要方法之一。通過設(shè)置合適的過期時間,并定期清理過期數(shù)據(jù),可以釋放內(nèi)存空間。

// 定期清理過期數(shù)據(jù)
jedis.setex("key:1001", 600, "value");

10、合理設(shè)置內(nèi)存策略

根據(jù)實際需求和系統(tǒng)情況,合理設(shè)置Redis的內(nèi)存策略,比如最大內(nèi)存限制、淘汰策略等,可以更好地管理和利用內(nèi)存空間。

本文總結(jié)

Redis內(nèi)存是非常寶貴的資源,我們在日常開發(fā)中,要合理運用Redis的數(shù)據(jù)結(jié)構(gòu)以達到節(jié)省內(nèi)存的目的。

以上就是Redis節(jié)省內(nèi)存的十個技巧分享的詳細內(nèi)容,更多關(guān)于Redis節(jié)省內(nèi)存技巧的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    Redis 實現(xiàn)分布式鎖時需要考慮的問題解決方案

    本文詳細探討了使用Redis實現(xiàn)分布式鎖時需要考慮的問題,包括鎖的競爭、鎖的釋放、超時管理、網(wǎng)絡(luò)分區(qū)等,并提供了相應(yīng)的解決方案和代碼實例,有助于開發(fā)者正確且安全地使用Redis實現(xiàn)分布式鎖
    2024-09-09
  • 基于 Redis 的 JWT令牌失效處理方案(實現(xiàn)步驟)

    基于 Redis 的 JWT令牌失效處理方案(實現(xiàn)步驟)

    當(dāng)用戶登錄狀態(tài)到登出狀態(tài)時,對應(yīng)的JWT的令牌需要設(shè)置為失效狀態(tài),這時可以使用基于Redis 的黑名單方案來實現(xiàn)JWT令牌失效,本文給大家分享基于 Redis 的 JWT令牌失效處理方案,感興趣的朋友一起看看吧
    2024-03-03
  • Redis中鍵的過期刪除策略深入講解

    Redis中鍵的過期刪除策略深入講解

    這篇文章主要給大家介紹了關(guān)于Redis中鍵的過期刪除策略的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • redis5集群如何主動手工切換主從節(jié)點命令

    redis5集群如何主動手工切換主從節(jié)點命令

    這篇文章主要介紹了redis5集群如何主動手工切換主從節(jié)點命令,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Redis實現(xiàn)事物以及鎖的方法

    Redis實現(xiàn)事物以及鎖的方法

    本文主要介紹了Redis實現(xiàn)事物以及鎖的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis Cluster 字段模糊匹配及刪除

    Redis Cluster 字段模糊匹配及刪除

    在數(shù)據(jù)庫內(nèi)我們可以通過like關(guān)鍵字、%、*或者REGEX關(guān)鍵字進行模糊匹配。而在Redis內(nèi)我們?nèi)绾芜M行模糊匹配呢?本文就來介紹一下
    2021-05-05
  • 一文搞懂阿里云服務(wù)器部署Redis并整合Spring?Boot

    一文搞懂阿里云服務(wù)器部署Redis并整合Spring?Boot

    這篇文章主要介紹了一文搞懂阿里云服務(wù)器部署Redis并整合Spring?Boot,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Redis分片集群的實現(xiàn)

    Redis分片集群的實現(xiàn)

    Redis 分片集群是一種將 Redis數(shù)據(jù)庫分散到多個節(jié)點上的方式,以提供更高的性能和可伸縮性,本文主要介紹了Redis分片集群的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • 一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例

    一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例

    這篇文章主要介紹了一起raid數(shù)據(jù)恢復(fù)及回遷成功的案例,需要的朋友可以參考下
    2017-04-04
  • 使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案

    使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案

    這篇文章主要介紹了使用Redis實現(xiàn)記錄訪問次數(shù)的三種方案,文中通過代碼示例和圖文講解的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09

最新評論