1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        這10個Redis使用技巧,提升90%工作效率(建議收藏)

        共 3464字,需瀏覽 7分鐘

         ·

        2021-11-28 15:36


        關(guān)注我們,設(shè)為星標(biāo),每天7:30不見不散,架構(gòu)路上與您共享?

        回復(fù)"架構(gòu)師"獲取資源


        大家好,我是架構(gòu)君,一個會寫代碼吟詩的架構(gòu)師。


        前言

        Redis 在當(dāng)前的技術(shù)社區(qū)里是非常熱門的。從來自 Antirez 一個小小的個人項目到成為內(nèi)存數(shù)據(jù)存儲行業(yè)的標(biāo)準(zhǔn),Redis已經(jīng)走過了很長的一段路。隨之而來的一系列最佳實踐,使得大多數(shù)人可以正確地使用 Redis。

        ?

        下面我們將探索正確使用 Redis 的10個技巧。

        1、停止使用 KEYS *

        Okay,以挑戰(zhàn)這個命令開始這篇文章,或許并不是一個好的方式,但其確實可能是最重要的一點。很多時候當(dāng)我們關(guān)注一個redis實例的統(tǒng)計數(shù)據(jù),我們會快速地輸入”KEYS *”命令,這樣key的信息會很明顯地展示出來。平心而論,從程序化的角度出發(fā)往往傾向于寫出下面這樣的偽代碼:

        for key in'keys *':  doAllTheThings()  br

        但是當(dāng)你有1300萬個key時,執(zhí)行速度將會變慢。因為KEYS命令的時間復(fù)雜度是O(n),其中n是要返回的keys的個數(shù),這樣這個命令的復(fù)雜度就取決于數(shù)據(jù)庫的大小了。并且在這個操作執(zhí)行期間,其它任何命令在你的實例中都無法執(zhí)行。

        作為一個替代命令,看一下 SCAN 吧,其允許你以一種更友好的方式來執(zhí)行… SCAN 通過增量迭代的方式來掃描數(shù)據(jù)庫。這一操作基于游標(biāo)的迭代器來完成的,因此只要你覺得合適,你可以隨時停止或繼續(xù)。

        ?

        2、找出拖慢 Redis 的罪魁禍?zhǔn)?/span>

        由于 Redis 沒有非常詳細的日志,要想知道在 Redis 實例內(nèi)部都做了些什么是非常困難的。幸運的是 Redis 提供了一個下面這樣的命令統(tǒng)計工具:

        127.0.0.1:6379> INFO commandstats# Commandstatscmdstat_get:calls=78,usec=608,usec_per_call=7.79cmdstat_setex:calls=5,usec=71,usec_per_call=14.20cmdstat_keys:calls=2,usec=42,usec_per_call=21.00cmdstat_info:calls=10,usec=1931,usec_per_call=193.10br

        通過這個工具可以查看所有命令統(tǒng)計的快照,比如命令執(zhí)行了多少次,執(zhí)行命令所耗費的毫秒數(shù)(每個命令的總時間和平均時間)

        只需要簡單地執(zhí)行 CONFIG RESETSTAT 命令就可以重置,這樣你就可以得到一個全新的統(tǒng)計結(jié)果。

        ?

        3、 將 Redis-Benchmark 結(jié)果作為參考,而不要一概而論

        Redis 之父 Salvatore 就說過:“通過執(zhí)行GET/SET命令來測試Redis就像在雨天檢測法拉利的雨刷清潔鏡子的效果”。很多時候人們跑到我這里,他們想知道為什么自己的Redis-Benchmark統(tǒng)計的結(jié)果低于最優(yōu)結(jié)果 。但我們必須要把各種不同的真實情況考慮進來,例如:

        • 可能受到哪些客戶端運行環(huán)境的限制?

        • 是同一個版本號嗎?

        • 測試環(huán)境中的表現(xiàn)與應(yīng)用將要運行的環(huán)境是否一致?

        Redis-Benchmark的測試結(jié)果提供了一個保證你的 Redis-Server 不會運行在非正常狀態(tài)下的基準(zhǔn)點,但是你永遠不要把它作為一個真實的“壓力測試”。壓力測試需要反應(yīng)出應(yīng)用的運行方式,并且需要一個盡可能的和生產(chǎn)相似的環(huán)境。


        4、Hashes 是你的最佳選擇

        以一種優(yōu)雅的方式引入 hashes 吧。hashes 將會帶給你一種前所未有的體驗。之前我曾看到過許多類似于下面這樣的key結(jié)構(gòu):

        foo:first_namefoo:last_namefoo:addressbr

        上面的例子中,foo 可能是一個用戶的用戶名,其中的每一項都是一個單獨的 key。這就增加了 犯錯的空間,和一些不必要的 key。使用 hash 代替吧,你會驚奇地發(fā)現(xiàn)竟然只需要一個 key :

        127.0.0.1:6379> HSET foo first_name 'Joe'(integer) 1127.0.0.1:6379> HSET foo last_name 'Engel'(integer) 1127.0.0.1:6379> HSET foo address '1 Fanatical Pl'(integer) 1127.0.0.1:6379> HGETALL foo1) 'first_name'2) 'Joe'3) 'last_name'4) 'Engel'5) 'address'6) '1 Fanatical Pl'127.0.0.1:6379> HGET foo first_name'Joe'br

        ?

        5、設(shè)置 key 值的存活時間

        無論什么時候,只要有可能就利用key超時的優(yōu)勢。一個很好的例子就是儲存一些諸如臨時認證key之類的東西。當(dāng)你去查找一個授權(quán)key時——以O(shè)AUTH為例——通常會得到一個超時時間。這樣在設(shè)置key的時候,設(shè)成同樣的超時時間,Redis就會自動為你清除!而不再需要使用KEYS *來遍歷所有的key了,怎么樣很方便吧?

        ?

        6、 選擇合適的回收策略

        既然談到了清除key這個話題,那我們就來聊聊回收策略。當(dāng) Redis 的實例空間被填滿了之后,將會嘗試回收一部分key。根據(jù)你的使用方式,我強烈建議使用 volatile-lru 策略——前提是你對key已經(jīng)設(shè)置了超時。但如果你運行的是一些類似于 cache 的東西,并且沒有對 key 設(shè)置超時機制,可以考慮使用 allkeys-lru 回收機制。我的建議是先在這里查看一下可行的方案。

        ?

        7、如果你的數(shù)據(jù)很重要,請使用 Try/Except

        如果必須確保關(guān)鍵性的數(shù)據(jù)可以被放入到 Redis 的實例中,我強烈建議將其放入 try/except 塊中。幾乎所有的Redis客戶端采用的都是“發(fā)送即忘”策略,因此經(jīng)常需要考慮一個 key 是否真正被放到 Redis 數(shù)據(jù)庫中了。至于將 try/expect 放到 Redis 命令中的復(fù)雜性并不是本文要講的,你只需要知道這樣做可以確保重要的數(shù)據(jù)放到該放的地方就可以了。


        8、不要耗盡一個實例

        無論什么時候,只要有可能就分散多redis實例的工作量。從3.0.0版本開始,Redis就支持集群了。Redis集群允許你基于key范圍分離出部分包含主/從模式的key。完整的集群背后的“魔法”可以在這里找到。但如果你是在找教程,那這里是一個再適合不過的地方了。如果不能選擇集群,考慮一下命名空間吧,然后將你的key分散到多個實例之中。關(guān)于怎樣分配數(shù)據(jù),在redis.io網(wǎng)站上有這篇精彩的評論。


        9、內(nèi)核越多越好嗎?!

        當(dāng)然是錯的。Redis 是一個單線程進程,即使啟用了持久化最多也只會消耗兩個內(nèi)核。除非你計劃在一臺主機上運行多個實例——希望只會是在開發(fā)測試的環(huán)境下!——否則的話對于一個 Redis 實例是不需要2個以上內(nèi)核的。

        ?

        10、高可用

        到目前為止 Redis Sentinel 已經(jīng)經(jīng)過了很全面的測試,很多用戶已經(jīng)將其應(yīng)用到了生產(chǎn)環(huán)境中(包括 ObjectRocket )。如果你的應(yīng)用重度依賴于 Redis ,那就需要想出一個高可用方案來保證其不會掉線。當(dāng)然,如果不想自己管理這些東西,ObjectRocket 提供了一個高可用平臺,并提供7×24小時的技術(shù)支持,有意向的話可以考慮一下。

        文章來源:https://www.cnblogs.com/zhuifeng523/p/12274740.html


        到此文章就結(jié)束了。如果今天的文章對你在進階架構(gòu)師的路上有新的啟發(fā)和進步,歡迎轉(zhuǎn)發(fā)給更多人。歡迎加入架構(gòu)師社區(qū)技術(shù)交流群,眾多大咖帶你進階架構(gòu)師,在后臺回復(fù)“加群”即可入群。



        這些年小編給你分享過的干貨


        1.優(yōu)質(zhì)SpringBoot物流管理項目(附源碼)

        2.優(yōu)質(zhì)ERP系統(tǒng)帶進銷存財務(wù)生產(chǎn)功能(附源碼)

        3.優(yōu)質(zhì)SpringBoot帶工作流管理項目(附源碼)

        4.最好用的OA系統(tǒng),拿來即用(附源碼)

        5.SBoot+Vue外賣系統(tǒng)前后端都有(附源碼

        6.SBoot+Vue可視化大屏拖拽項目(附源碼)



        轉(zhuǎn)發(fā)在看就是最大的支持??

        瀏覽 58
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            影音先锋中文字幕一区 | 五月婷婷一区二区三区 | 激情无遮挡 | 欧美人人草 | 大尺度视频网站在线观看 | 爆操少妇91p | 香港日本韩国三级少妇在线观看 | 日日摸夜夜添夜夜添老人妇人 | 男人和女人日批视频 | 亚洲精品少妇久久久久久海角社区 |