最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ù)類型也比較豐富,幾乎在日常開(kāi)發(fā)中沒(méi)有不涉及的;

但如果對(duì)redis使用比較深入的話,還需要綜合考慮多方面的因素,比如使用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 客戶端使用不當(dāng),導(dǎo)致其它客戶端連接timeout, 原因可能客戶端密碼錯(cuò)誤,且沒(méi)有使用連接池,大量連接重試導(dǎo)致系統(tǒng)端口資源耗光;
  • Redis 客戶端命令使用不當(dāng),導(dǎo)致大量的慢查詢,影響其它應(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ō),線上關(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ù)名稱]:[數(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)于用戶訂單相關(guān)的key;
  • 方便維護(hù)管理,不同的應(yīng)用,或者不同的業(yè)務(wù)采用不同的前綴,在可視化客戶端工具或者命令行中很方便進(jìn)行key的查找定位;
  • 避免key沖突,避免在使用過(guò)程中多個(gè)人都用userId這樣的值作為key引發(fā)的緩存key沖突;
  • 更節(jié)省內(nèi)存: key是string類型,底層編碼包含int、embstr和raw三種。embstr在小于44字節(jié)使用,采用連續(xù)內(nèi)存空間,內(nèi)存占用更??;

推薦值:

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

二、盡量避免bigkey

1、什么是bigkey呢

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

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

2、BigKey的危害

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

  • 對(duì)BigKey執(zhí)行讀請(qǐng)求時(shí),少量的QPS就可能導(dǎo)致帶寬使用率被占滿,導(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í)較舊,使主線程被阻塞;

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ù)類型

正如上面所說(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ù)類型,在這個(gè)基礎(chǔ)上,才能針對(duì)不同的業(yè)務(wù)場(chǎng)景,設(shè)計(jì)出高效的存儲(chǔ)存儲(chǔ)結(jié)構(gòu)數(shù)據(jù);

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

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

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

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

  • 方案2:使用一個(gè)list結(jié)構(gòu),緩存用戶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,空間占用小,可以靈活訪問(wèn)對(duì)象的任意字段;

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

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

  • 【推薦】對(duì)緩存進(jìn)行預(yù)熱。在訪問(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)定、更快速地訪問(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)用需要訪問(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ě)入,低頻查詢場(chǎng)景,則不推薦使用;
  • 在不確定key的存活時(shí)間時(shí),最好設(shè)置過(guò)期時(shí)間,控制 key 的生命周期;
  • 應(yīng)該考慮冷熱數(shù)據(jù)分離,對(duì)于查詢, 高頻次業(yè)務(wù)查詢走Redis,低頻查詢考慮走數(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中三種特殊數(shù)據(jù)類型命令詳解

    Redis中三種特殊數(shù)據(jù)類型命令詳解

    Geospatial是地理位置類型,我們可以用來(lái)查詢附近的人、計(jì)算兩人之間的距離等,這篇文章主要介紹了Redis中三種特殊數(shù)據(jù)類型命令詳解,需要的朋友可以參考下
    2024-05-05
  • Redis+Caffeine實(shí)現(xiàn)多級(jí)緩存的步驟

    Redis+Caffeine實(shí)現(xiàn)多級(jí)緩存的步驟

    隨著不斷的發(fā)展,這一架構(gòu)也產(chǎn)生了改進(jìn),在一些場(chǎng)景下可能單純使用Redis類的遠(yuǎn)程緩存已經(jīng)不夠了,還需要進(jìn)一步配合本地緩存使用,例如Guava cache或Caffeine,從而再次提升程序的響應(yīng)速度與服務(wù)性能,這篇文章主要介紹了Redis+Caffeine實(shí)現(xiàn)多級(jí)緩存,需要的朋友可以參考下
    2024-01-01
  • Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)

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

    這篇文章主要介紹了Redis中的配置文件,數(shù)據(jù)持久化,事務(wù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-12-12
  • SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)Jedis技術(shù)切換功能

    這篇文章主要介紹了SpringBoot讀寫(xiě)Redis客戶端并實(shí)現(xiàn)技術(shù)切換功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-01-01
  • Redis中哈希分布不均勻的解決辦法

    Redis中哈希分布不均勻的解決辦法

    這篇文章主要介紹了Redis中哈希分布不均勻的解決辦法的相關(guān)資料,需要的朋友可以參考下
    2021-02-02
  • Redis之如何實(shí)現(xiàn)用戶關(guān)注

    Redis之如何實(shí)現(xiàn)用戶關(guān)注

    這篇文章主要介紹了Redis之如何實(shí)現(xiàn)用戶關(guān)注問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Windows設(shè)置Redis為開(kāi)機(jī)自啟動(dòng)的流程步驟

    Windows設(shè)置Redis為開(kāi)機(jī)自啟動(dòng)的流程步驟

    Redis作為當(dāng)前最常用的當(dāng)前緩存技術(shù),基本上Web應(yīng)用中都有使用,所以,每次我們?cè)诒镜貑?dòng)項(xiàng)目前,都必須將Redis服務(wù)端啟動(dòng),但是,每次都要去啟動(dòng)Redis就很麻煩,本文主要就是介紹Windows系統(tǒng)如何配置開(kāi)機(jī)啟動(dòng)Redis,需要的朋友可以參考下
    2024-05-05
  • 淺談Redis的幾個(gè)過(guò)期策略

    淺談Redis的幾個(gè)過(guò)期策略

    在使用redis時(shí),一般會(huì)設(shè)置一個(gè)過(guò)期時(shí)間,當(dāng)然也有不設(shè)置過(guò)期時(shí)間的,也就是永久不過(guò)期。當(dāng)設(shè)置了過(guò)期時(shí)間,redis是如何判斷是否過(guò)期,以及根據(jù)什么策略來(lái)進(jìn)行刪除的。
    2021-05-05
  • redis?zrange?與?zrangebyscore的區(qū)別解析

    redis?zrange?與?zrangebyscore的區(qū)別解析

    這篇文章主要介紹了redis?zrange與zrangebyscore的區(qū)別,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • springboot使用Redis作緩存使用入門教程

    springboot使用Redis作緩存使用入門教程

    這篇文章主要介紹了springboot使用Redis作緩存使用入門教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

永德县| 临湘市| 青铜峡市| 仁化县| 乡宁县| 烟台市| 鄂伦春自治旗| 盐源县| 杨浦区| 虞城县| 中西区| 天水市| 清丰县| 崇阳县| 新闻| 高州市| 沅江市| 景德镇市| 高州市| 衡阳市| 沈丘县| 定南县| 长治县| 出国| 玛多县| 宽城| 西乌珠穆沁旗| 渑池县| 汪清县| 班戈县| 襄樊市| 泗阳县| 米易县| 金华市| 绿春县| 新民市| 富顺县| 博湖县| 山阴县| 郑州市| 顺义区|