<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          這份 Redis 使用規(guī)范,拿走不謝

          共 2074字,需瀏覽 5分鐘

           ·

          2022-04-12 12:19


          在公司項(xiàng)目中,redis屬于高頻使用,在使用中,我們遇到了各種各樣的redis問(wèn)題,于是針對(duì)自身情況梳理了一個(gè)redis使用規(guī)范。

          一、鍵名設(shè)計(jì)

          1、key名設(shè)計(jì)

          1. 禁止包含特殊字符(比如空格、換行、單雙引號(hào)以及其他轉(zhuǎn)義字符)

          2. 建議以業(yè)務(wù)名為前綴,以冒號(hào)分割來(lái)構(gòu)造一定規(guī)則的key名(比如業(yè)務(wù)名:表名:id)

          比如:teach:leeson_id:21

          3. 控制key的長(zhǎng)度

          key太長(zhǎng)量一大起來(lái)就會(huì)非常占用內(nèi)存

          2、value設(shè)計(jì)

          1. 拒絕大key操作

          禁用超過(guò)10K的string大key(雖然redis支持512MB大小的string),如果1mb的key每秒重復(fù)寫(xiě)入10次,就會(huì)導(dǎo)致寫(xiě)入網(wǎng)絡(luò)IO達(dá)10MB。

          錯(cuò)誤示范:直接將laravel的整個(gè)模型或者對(duì)象當(dāng)成value存儲(chǔ)

          2. 設(shè)計(jì)key時(shí)使用合適的數(shù)據(jù)類(lèi)型(在資源利用和性能之間作平衡)

          錯(cuò)誤示范:一個(gè)普通字符串弄成hash類(lèi)型進(jìn)行存儲(chǔ)

          3. 一定要控制key的生命周期

          錯(cuò)誤示范:key設(shè)置為永不過(guò)期

          4. 控制value長(zhǎng)度

          比如string類(lèi)型,如果value為'8個(gè)字節(jié)的長(zhǎng)整型'則內(nèi)部使用int類(lèi)型,如果value為'小于等于39個(gè)字節(jié)的字符串'則內(nèi)部使用embstr類(lèi)型,如果value為'大于39個(gè)字節(jié)的字符串'則內(nèi)部使用raw類(lèi)型。這樣能很好的利用redis的性能。

          5. 數(shù)據(jù)按需存儲(chǔ)

          不需要的數(shù)據(jù)千萬(wàn)不要存儲(chǔ)在redis,只會(huì)浪費(fèi)內(nèi)存空間

          二、命令使用

          1.禁止使用keys、flushall、hmgetall等命令

          為防止業(yè)務(wù)研發(fā)的誤操作,通常可以在交付redis實(shí)例之前將默認(rèn)命令rename掉;而真正需要?jiǎng)h除或者遍歷key時(shí)可以使用scan家族命令

          2.慎用hgetall、lrange、smembers、zrange等命令

          除非業(yè)務(wù)場(chǎng)景需要,盡量不要使用這些命令。如果沒(méi)有控制好會(huì)導(dǎo)致操作量過(guò)大,形成阻塞。

          三、緩存設(shè)計(jì)

          1. 多個(gè)庫(kù)的使用

          如果應(yīng)用中會(huì)涉及到各種不同的redis數(shù)據(jù)存儲(chǔ),應(yīng)該分庫(kù)存儲(chǔ),最好是一種業(yè)務(wù)使用一個(gè)庫(kù)

          比如:課程緩存:庫(kù)1;訂單隊(duì)列:庫(kù)2;日志處理:庫(kù)3

          2.避免多個(gè)應(yīng)用公用一個(gè)redis實(shí)例

          避免一個(gè)應(yīng)用出現(xiàn)問(wèn)題或者錯(cuò)誤使用拖累其他應(yīng)用

          3.合理評(píng)估業(yè)務(wù)場(chǎng)景,并設(shè)置最大內(nèi)存以及內(nèi)存淘汰策略(maxmemory和maxmemory-policy)

          目前我們用的阿里云redis,不太存在這個(gè)問(wèn)題

          4.使用帶有連接池的數(shù)據(jù)庫(kù),可以有效控制連接,同時(shí)提高效率

          5.給redis設(shè)置一個(gè)密碼

          目前我們用的阿里云redis,不太存在這個(gè)問(wèn)題

          6.冷熱數(shù)據(jù)區(qū)分

          雖然 Redis支持持久化,但將所有數(shù)據(jù)存儲(chǔ)在redis中,成本非常昂貴。

          建議將熱數(shù)據(jù) (如 QPS超過(guò) 5k) 的數(shù)據(jù)加載到redis中。

          低頻數(shù)據(jù)可存儲(chǔ)在Mysql、ElasticSearch中。

          7.緩存非特殊情況不做中間態(tài)redis大多數(shù)時(shí)候都是做緩存用,去掉后業(yè)務(wù)邏輯不應(yīng)發(fā)生改變,萬(wàn)不可切入到業(yè)務(wù)里。

          1. 緩存的高可用會(huì)影響業(yè)務(wù);
          2. 產(chǎn)生深耦合會(huì)發(fā)生無(wú)法預(yù)料的效果;
          3. 會(huì)對(duì)維護(hù)產(chǎn)生負(fù)效果。

          四、場(chǎng)景實(shí)戰(zhàn)問(wèn)題

          1、項(xiàng)目redis使用問(wèn)題

          當(dāng)前的使用方式是,每個(gè)接入的應(yīng)用要配置核心項(xiàng)目的redis配置。這樣是不合理的,核心項(xiàng)目的redis應(yīng)該只能在核心項(xiàng)目中使用,對(duì)外應(yīng)該是提供api接口或者rpc進(jìn)行訪(fǎng)問(wèn)。

          2、慎用laravel自帶的cache功能

          laravel自帶的cache功能最容易導(dǎo)致大key,經(jīng)常由于簡(jiǎn)單使用至今將整個(gè)對(duì)象模型存儲(chǔ)到redis,造成大key。

          3、注意key的過(guò)期時(shí)間設(shè)置

          在報(bào)名等高峰期的時(shí)候,key值設(shè)置過(guò)短容易造成緩存穿透,導(dǎo)致大量請(qǐng)求直接打到mysql數(shù)據(jù)庫(kù)。

          4、小心緩存穿透

          經(jīng)常使用會(huì)只給有數(shù)據(jù)的結(jié)果進(jìn)行緩存,結(jié)果導(dǎo)致空數(shù)據(jù)無(wú)法緩存,相同查詢(xún)直接每次都到達(dá)數(shù)據(jù)庫(kù),所以空值也應(yīng)該被緩存。

          5、慎用緩存層層包裹

          緩存里面的數(shù)據(jù)還有一層緩存數(shù)據(jù),會(huì)導(dǎo)致問(wèn)題排查麻煩,出問(wèn)題也不容易處理。

          6、慎用將redis做為消息隊(duì)列

          如沒(méi)有非常特殊的需求,嚴(yán)禁將 Redis 當(dāng)作消息隊(duì)列使用。redis 當(dāng)作消息隊(duì)列使用,會(huì)有容量、網(wǎng)絡(luò)、效率、功能方面的多種問(wèn)題。

          如需要消息隊(duì)列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ,nsq,(花園同步有時(shí)間前后要求,且量不大才使用的)。

          五、查詢(xún)使用問(wèn)題

          1、線(xiàn)上Redis禁止使用Keys正則匹配操作

          redis是單線(xiàn)程處理,在線(xiàn)上Key數(shù)量較多時(shí),操作效率極低【時(shí)間復(fù)雜度為O(N)】,該命令一旦執(zhí)行會(huì)嚴(yán)重阻塞線(xiàn)上其它命令的正常請(qǐng)求,而且在高QPS情況下會(huì)直接造成redis服務(wù)崩潰!如果有類(lèi)似需求,請(qǐng)使用scan命令代替。

          六、其他

          1、redis同步工具

          阿里云的redis-shake工具,方便快速

          2、大key查詢(xún)

          阿里云有大key分析工具

          來(lái)源:my.oschina.net/kenblog/blog/3196207


          如有文章對(duì)你有幫助,

          在看”和轉(zhuǎn)發(fā)是對(duì)我最大的支持!

          推薦

          點(diǎn)擊領(lǐng)取:151個(gè)大廠(chǎng)面試講解!(圖片可上下滑動(dòng)!)??

          瀏覽 50
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  中文人妻无码一区二区三区久久 | 2016一级片免费看 | 蜜桃福利网| 婷婷国产亚洲精品网站 | 在线观看欧美日韩 |