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

Redis 鍵值設(shè)計(jì)使用總結(jié)

 更新時(shí)間:2023年04月07日 11:38:27   作者:逆風(fēng)飛翔的小叔  
這篇文章主要介紹了Redis鍵值設(shè)計(jì)的使用總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

對(duì)redis的使用,想必做過(guò)后端開(kāi)發(fā)的同學(xué)都不陌生,redis為key/value非關(guān)系型數(shù)據(jù)庫(kù),使用起來(lái)簡(jiǎn)單高效,支持的數(shù)據(jù)類(lèi)型也比較豐富,幾乎在日常開(kāi)發(fā)中沒(méi)有不涉及的;

但如果對(duì)redis使用比較深入的話(huà),還需要綜合考慮多方面的因素,比如使用redis時(shí)如何兼具高效與性能,如何設(shè)計(jì)合理的key以達(dá)到存取時(shí)最高效等等,這都是應(yīng)該考慮的,下面結(jié)合redis中一個(gè)比較簡(jiǎn)單但也容易的問(wèn)題,關(guān)于redis的鍵值設(shè)計(jì)做一個(gè)全面的探討;

Redis使用中不規(guī)范的現(xiàn)象

  • Redis 存儲(chǔ)的key命名不規(guī)范,比較隨意;
  • Redis 被當(dāng)成存儲(chǔ)庫(kù)使用,存在數(shù)據(jù)丟失風(fēng)險(xiǎn),且無(wú)重新加載方案;
  • Redis 緩存key,未設(shè)置過(guò)期時(shí)間, 緩存低頻數(shù)據(jù)占用大量?jī)?nèi)存, 進(jìn)而導(dǎo)致服務(wù)崩潰;
  • Redis 緩存大量big key, 應(yīng)用獲取時(shí)會(huì)占用大量網(wǎng)絡(luò)帶寬,刪除也容易造成阻塞;
  • Redis 客戶(hù)端使用不當(dāng),導(dǎo)致其它客戶(hù)端連接timeout, 原因可能客戶(hù)端密碼錯(cuò)誤,且沒(méi)有使用連接池,大量連接重試導(dǎo)致系統(tǒng)端口資源耗光;
  • Redis 客戶(hù)端命令使用不當(dāng),導(dǎo)致大量的慢查詢(xún),影響其它應(yīng)用業(yè)務(wù),比如在業(yè)務(wù)高峰期時(shí)使用 keys* 或flushall 這樣的命令;

Redis 使用業(yè)務(wù)場(chǎng)景推薦與建議

  • 高并發(fā)場(chǎng)景:熱點(diǎn)數(shù)據(jù)緩存, 可提升系統(tǒng)整體響應(yīng)速度,降低數(shù)據(jù)庫(kù)IO壓力 ;
  • 限時(shí)場(chǎng)景:利用Redis expire命令設(shè)置session過(guò)期和續(xù)期、手機(jī)驗(yàn)證碼等;
  • 排行榜: 利用Redis list 和 sorted sets 數(shù)據(jù)結(jié)構(gòu)能實(shí)現(xiàn)各種復(fù)雜的排行榜應(yīng)用;
  • 數(shù)據(jù)集合操作:利用Redis list、set、sorted set, 方便進(jìn)行數(shù)據(jù)計(jì)算, 如交集、并集、差集等;
  • 連續(xù)簽到:可以利用redis的bitmap數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)簽到相關(guān)的業(yè)務(wù);
  • 計(jì)數(shù)器:利用Redis incr、incrby命令實(shí)現(xiàn)api調(diào)用次數(shù)統(tǒng)計(jì), api限流等場(chǎng)景;
  • 分布式鎖:利用 Redis 的 setnx 功能來(lái)編寫(xiě)分布式的鎖, 典型開(kāi)源組件比如redisson;

如何設(shè)計(jì)出優(yōu)雅的key

可以這么說(shuō),線(xiàn)上關(guān)于redis的性能優(yōu)化這個(gè)問(wèn)題上,不合理的key的設(shè)計(jì)經(jīng)常是引發(fā)問(wèn)題的根因,究其本質(zhì),就個(gè)人看到的情況來(lái)說(shuō),大多數(shù)同學(xué)在對(duì)redis使用過(guò)程中,對(duì)于key的設(shè)計(jì)幾乎是沒(méi)有什么概念的,因?yàn)榇蠖鄶?shù)同學(xué)使用的場(chǎng)景就是 key/val ,對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)就是 字符串key/字符串val;

稍微對(duì)redis有更深入的了解的同學(xué),在進(jìn)行存儲(chǔ)時(shí),可能會(huì)知道 key的設(shè)計(jì)盡量短一點(diǎn),中間最好有層次感,最好以 : 進(jìn)行分割 ......

那么如何才能設(shè)計(jì)出比較優(yōu)雅的key呢?下面結(jié)合小編實(shí)際使用中的經(jīng)驗(yàn)以及踩過(guò)的坑,來(lái)具體談?wù)劊?/p>

一、遵循如下幾個(gè)最佳實(shí)踐約定

  1. 遵循基本格式:[業(yè)務(wù)名稱(chēng)]:[數(shù)據(jù)名]:[id];
  2. key的長(zhǎng)度不超過(guò)44字節(jié);
  3. 不要包含特殊字符;

關(guān)于上面幾條建議,這樣做有如下幾點(diǎn)好處:

  • 可讀性強(qiáng),比如當(dāng)我們?cè)O(shè)計(jì)這樣的key結(jié)構(gòu), order:user:10,一眼看過(guò)去就知道這是關(guān)于用戶(hù)訂單相關(guān)的key;
  • 方便維護(hù)管理,不同的應(yīng)用,或者不同的業(yè)務(wù)采用不同的前綴,在可視化客戶(hù)端工具或者命令行中很方便進(jìn)行key的查找定位;
  • 避免key沖突,避免在使用過(guò)程中多個(gè)人都用userId這樣的值作為key引發(fā)的緩存key沖突;
  • 更節(jié)省內(nèi)存: key是string類(lèi)型,底層編碼包含int、embstr和raw三種。embstr在小于44字節(jié)使用,采用連續(xù)內(nèi)存空間,內(nèi)存占用更?。?/li>

推薦值:

  • 單個(gè)key的value小于10KB;
  • 對(duì)于集合類(lèi)型的key,建議元素?cái)?shù)量小于1000;

二、盡量避免bigkey

1、什么是bigkey呢

BigKey通常以Key的大小和Key中成員的數(shù)量來(lái)綜合判定,例如:

  • Key本身的數(shù)據(jù)量過(guò)大:一個(gè)String類(lèi)型的Key,它的值為5 MB;
  • Key中的成員數(shù)過(guò)多:一個(gè)ZSET類(lèi)型的Key,它的成員數(shù)量為10,000個(gè);
  • Key中成員的數(shù)據(jù)量過(guò)大:一個(gè)Hash類(lèi)型的Key,它的成員數(shù)量雖然只有1,000個(gè)但這些成員的Value(值)總大小為100 MB;

2、BigKey的危害

網(wǎng)絡(luò)阻塞

  • 對(duì)BigKey執(zhí)行讀請(qǐng)求時(shí),少量的QPS就可能導(dǎo)致帶寬使用率被占滿(mǎn),導(dǎo)致Redis實(shí)例,乃至所在物理機(jī)變慢;

數(shù)據(jù)傾斜

  • BigKey所在的Redis實(shí)例內(nèi)存使用率遠(yuǎn)超其他實(shí)例,無(wú)法使數(shù)據(jù)分片的內(nèi)存資源達(dá)到均衡;

Redis阻塞

  • 對(duì)元素較多的hash、list、zset等做運(yùn)算會(huì)耗時(shí)較舊,使主線(xiàn)程被阻塞;

CPU壓力

  • 對(duì)BigKey的數(shù)據(jù)序列化和反序列化會(huì)導(dǎo)致CPU的使用率飆升,影響Redis實(shí)例和本機(jī)其它應(yīng)用;

3、如何發(fā)現(xiàn)BigKey

在安裝的機(jī)器上執(zhí)行 redis-cli --bigkeys命令

  • 利用redis-cli提供的--bigkeys參數(shù),可以遍歷分析所有key,并返回Key的整體統(tǒng)計(jì)信息與每個(gè)數(shù)據(jù)的Top1的big key;

通過(guò)scan掃描

  • 編寫(xiě)程序,利用scan掃描Redis中的所有key,利用strlen、hlen等命令判斷key的長(zhǎng)度(此處不建議使用MEMORY USAGE);

使用第三方工具

  • 利用第三方工具,如 Redis-Rdb-Tools 分析RDB快照文件,全面分析內(nèi)存使用情況;

使用網(wǎng)絡(luò)監(jiān)控

  • 自定義工具,監(jiān)控進(jìn)出Redis的網(wǎng)絡(luò)數(shù)據(jù),超出預(yù)警值時(shí)主動(dòng)告警;

三、使用恰當(dāng)?shù)臄?shù)據(jù)類(lèi)型

正如上面所說(shuō),很多初次使用redis的同學(xué),對(duì)于很多業(yè)務(wù)場(chǎng)景,都是一個(gè)key/val的簡(jiǎn)單的結(jié)構(gòu)搞定,而不會(huì)深入思考這樣做是否合理,或者說(shuō)這樣做以后會(huì)不會(huì)引發(fā)相關(guān)的性能方面的問(wèn)題;

對(duì)于這個(gè)問(wèn)題,從根本上來(lái)說(shuō),需要深入了解并掌握redis的常用的數(shù)據(jù)類(lèi)型,在這個(gè)基礎(chǔ)上,才能針對(duì)不同的業(yè)務(wù)場(chǎng)景,設(shè)計(jì)出高效的存儲(chǔ)存儲(chǔ)結(jié)構(gòu)數(shù)據(jù);

讓我們思考一下,如何緩存用戶(hù)對(duì)象列表這樣的數(shù)據(jù)呢?

  • 方案1:key為usrId,value為對(duì)象的序列化字符串,數(shù)據(jù)結(jié)構(gòu)類(lèi)似下面這樣; 

優(yōu)點(diǎn):存取方便,簡(jiǎn)單粗暴,存取時(shí)只需要做下json和對(duì)象的互轉(zhuǎn)即可;

缺點(diǎn):數(shù)據(jù)耦合,不夠靈活,一旦對(duì)象新增了字段或刪減了字段,緩存重建的成本非常大;

  • 方案2:使用一個(gè)list結(jié)構(gòu),緩存用戶(hù)ID列表,數(shù)據(jù)結(jié)構(gòu)如下;

優(yōu)點(diǎn):對(duì)內(nèi)存的占用小,操作高效;

缺點(diǎn):獲取到val之后,需要進(jìn)一步查庫(kù)才能得到完整的對(duì)象;

方案3:使用hash結(jié)構(gòu),緩存對(duì)象,數(shù)據(jù)如下所示;

優(yōu)點(diǎn):底層使用ziplist,空間占用小,可以靈活訪(fǎng)問(wèn)對(duì)象的任意字段;

缺點(diǎn):編碼上相對(duì)復(fù)雜;

Redis 緩存在實(shí)際應(yīng)用中的使用建議

  • 【推薦】對(duì)緩存進(jìn)行預(yù)熱。在訪(fǎng)問(wèn)數(shù)據(jù)前,應(yīng)先對(duì)緩存進(jìn)行預(yù)熱,避免大量請(qǐng)求直接進(jìn)入數(shù)據(jù)存儲(chǔ)層;應(yīng)根據(jù)業(yè)務(wù)情況劃分合適的冷熱數(shù)據(jù),對(duì)熱點(diǎn)數(shù)據(jù)進(jìn)行預(yù)熱。如許可授權(quán)信息, apikey等;
  • 【推薦】配合使用本地緩存。使用本地緩存能更穩(wěn)定、更快速地訪(fǎng)問(wèn)到數(shù)據(jù),但在分布式架構(gòu)下,要慎用本地緩存,避免造成服務(wù)器節(jié)點(diǎn)帶狀態(tài)。同時(shí)由于本地緩存直接占用應(yīng)用服務(wù)器的資源,要避免過(guò)度占用資源導(dǎo)致應(yīng)用節(jié)點(diǎn)崩潰;
  • 【推薦】緩存變更策略,應(yīng)先更新數(shù)據(jù)庫(kù),再更新緩存;
  • 【推薦】一次業(yè)務(wù)調(diào)用需要訪(fǎng)問(wèn)多次redis服務(wù)端,可采用pipleline或其它批量操作方式;
  • 【推薦】大List,Set,Hash,存儲(chǔ)的數(shù)量巨大。獲得大量元素時(shí)延遲較大阻塞其他命令.建議切割成多個(gè)小的list,set,hash;

使用業(yè)務(wù)規(guī)范

不管是redis,還是其他開(kāi)發(fā)中使用到的中間件,具體到開(kāi)發(fā)使用時(shí),最好都應(yīng)該提前制定出一套合理的規(guī)范,這個(gè)規(guī)范應(yīng)該是大多數(shù)開(kāi)發(fā)人員認(rèn)可并在實(shí)踐中得到檢驗(yàn),且能有效規(guī)避一些問(wèn)題的,一旦指定為規(guī)范,應(yīng)該成為指導(dǎo)內(nèi)部開(kāi)發(fā)人員日常的規(guī)則,這里提如下幾點(diǎn):

  • Redis 應(yīng)該定位為緩存數(shù)據(jù), 不可用于存儲(chǔ)大規(guī)模數(shù)據(jù)(不可替代數(shù)據(jù)庫(kù));
  • Redis 適合讀多寫(xiě)少場(chǎng)景,如存在高頻寫(xiě)入,低頻查詢(xún)場(chǎng)景,則不推薦使用;
  • 在不確定key的存活時(shí)間時(shí),最好設(shè)置過(guò)期時(shí)間,控制 key 的生命周期;
  • 應(yīng)該考慮冷熱數(shù)據(jù)分離,對(duì)于查詢(xún), 高頻次業(yè)務(wù)查詢(xún)走Redis,低頻查詢(xún)考慮走數(shù)據(jù)庫(kù);
  • Redis 有數(shù)據(jù)丟失風(fēng)險(xiǎn),程序處理數(shù)據(jù)時(shí),應(yīng)該考慮數(shù)據(jù)丟失后能自動(dòng)從數(shù)據(jù)庫(kù)加載并緩存到Redis;
  • 謹(jǐn)慎使用O(N)命令, 如list, set, hash 數(shù)據(jù)結(jié)構(gòu)操作時(shí), hgetall、lrange、smembers、zrange等并非不能使用,優(yōu)先考慮使用 hscan、sscan、zscan 代替。

以上就是Redis 鍵值設(shè)計(jì)使用總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Redis 鍵值設(shè)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redis創(chuàng)建并修改Lua 環(huán)境的實(shí)現(xiàn)方法

    Redis創(chuàng)建并修改Lua 環(huán)境的實(shí)現(xiàn)方法

    為了在Redis服務(wù)器中執(zhí)行Lua腳本, Redis在服務(wù)器內(nèi)嵌了一個(gè)Lua環(huán)境, 并對(duì)這個(gè)Lua環(huán)境進(jìn)行了一系列修改,本文主要介紹了Redis創(chuàng)建并修改Lua 環(huán)境的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法

    redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法

    redis在2.6推出了腳本功能,允許開(kāi)發(fā)者使用Lua語(yǔ)言編寫(xiě)腳本傳到redis中執(zhí)行。本文就介紹了redis執(zhí)行l(wèi)ua腳本的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2021-11-11
  • SpringBoot整合Mybatis-plus和Redis實(shí)現(xiàn)投票功能

    SpringBoot整合Mybatis-plus和Redis實(shí)現(xiàn)投票功能

    投票功能是一個(gè)非常常見(jiàn)的Web應(yīng)用場(chǎng)景,這篇文章將為大家介紹一下如何將Redis和Mybatis-plus整合到SpringBoot中,實(shí)現(xiàn)投票功能,感興趣的可以了解一下
    2023-05-05
  • Redis未授權(quán)訪(fǎng)問(wèn)配合SSH key文件利用詳解

    Redis未授權(quán)訪(fǎng)問(wèn)配合SSH key文件利用詳解

    這篇文章主要給大家介紹了關(guān)于Redis未授權(quán)訪(fǎng)問(wèn)配合SSH key文件利用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 淺談Redis分布式鎖的正確實(shí)現(xiàn)方式

    淺談Redis分布式鎖的正確實(shí)現(xiàn)方式

    這篇文章主要介紹了淺談Redis分布式鎖的正確實(shí)現(xiàn)方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • 關(guān)于Redis中bitmap的原理和使用詳解

    關(guān)于Redis中bitmap的原理和使用詳解

    這篇文章主要介紹了關(guān)于Redis中bitmap的原理和使用詳解,BitMap即位圖,使用每個(gè)位表示某種狀態(tài),適合處理整型的海量數(shù)據(jù),本質(zhì)上是哈希表的一種應(yīng)用實(shí)現(xiàn),需要的朋友可以參考下
    2023-05-05
  • Redis通用命令介紹以及key的層級(jí)結(jié)構(gòu)講解

    Redis通用命令介紹以及key的層級(jí)結(jié)構(gòu)講解

    這篇文章主要介紹了Redis通用命令以及key的層級(jí)結(jié)構(gòu),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)

    Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)

    這篇文章主要介紹了Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • Redis刪除策略的三種方法及逐出算法

    Redis刪除策略的三種方法及逐出算法

    這篇文章主要介紹了Redis刪除策略的三種方法及逐出算法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟

    redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟

    這篇文章主要介紹了redis?sentinel監(jiān)控高可用集群實(shí)現(xiàn)的配置步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04

最新評(píng)論