亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

引言

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

同時(shí)bigKey還可能導(dǎo)致Redis實(shí)例的崩潰,因?yàn)閮?nèi)存不夠用了,Redis就會(huì)不堪重負(fù),像是被大象坐了一樣,瞬間崩潰!

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

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

正文

什么是bigkey

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

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

bigkey,其實(shí)就是Redis中占用大量?jī)?nèi)存空間的鍵,具體來(lái)說(shuō),就是那些因?yàn)榇鎯?chǔ)了大量數(shù)據(jù),或者單個(gè)數(shù)據(jù)項(xiàng)太大,導(dǎo)致內(nèi)存占用嚴(yán)重的鍵。

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

Redis節(jié)省內(nèi)存的方式就是合理的運(yùn)用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),可以存儲(chǔ)鍵值對(duì)的集合。 如果我們存儲(chǔ)對(duì)象類型的數(shù)據(jù),建議使用Hsah

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

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

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

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

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

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

3、使用Bitmaps存儲(chǔ)布爾值信息

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

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

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

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

4、使用ZSET存儲(chǔ)有序集合

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

比如在一個(gè)新聞網(wǎng)站中,我們可以使用ZSET來(lái)存儲(chǔ)新聞文章的閱讀量排行榜,分?jǐn)?shù)表示閱讀量,文章ID作為成員。

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

5、使用SET存儲(chǔ)唯一值

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

在一個(gè)電商平臺(tái)中,我們可以使用SET來(lái)存儲(chǔ)商品的標(biāo)簽,確保每個(gè)標(biāo)簽都是唯一的。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

8、使用Pipeline批量操作命令

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

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

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

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

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

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

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

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

本文總結(jié)

Redis內(nèi)存是非常寶貴的資源,我們?cè)谌粘i_(kāi)發(fā)中,要合理運(yùn)用Redis的數(shù)據(jù)結(jié)構(gòu)以達(dá)到節(jié)省內(nèi)存的目的。

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

相關(guān)文章

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

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

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

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

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

    Redis中鍵的過(guò)期刪除策略深入講解

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

    redis5集群如何主動(dòng)手工切換主從節(jié)點(diǎn)命令

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

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

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

    Redis Cluster 字段模糊匹配及刪除

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

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

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

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

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

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

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

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

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

最新評(píng)論