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

Redis進行相關優(yōu)化詳解

 更新時間:2022年08月08日 10:04:17   作者:劍圣無痕???????  
這篇文章主要介紹了Redis進行相關優(yōu)化,Redis在項目中進行廣泛使用,那么在日常的開發(fā)過程中,我們在使用Redis的過程中需要注意那些呢?本文將從三個維度來講解如何進行Redis的優(yōu)化

前言

Redis在項目中進行廣泛使用,那么在日常的開發(fā)過程中,我們在使用Redis的過程中需要注意那些呢?本文將從三個維度來講解如何進行Redis的優(yōu)化。

內存維度

控制key的長度

key的一般都是采用字符串,而字符串的底層數據結構為SDS,SDS 結構中會包含字符串長度、分配空間大小等元數據信息,當key字符串的長度增加時,SDS中的元數據也會占用更多內存空間,為了減少key的占用空間,我們可用根據業(yè)務名來使用相應的英文縮寫來表示。例如user用u表示,message 用m來表示。

避免存儲bigkey

我們既要注意key的長度,同時也需要關注value的大小,Redis是使用單線程讀寫數據,bigkey 的讀寫操作會阻塞線程,降低Redis的處理效率。

如何查詢bigkey

我們可以通過--bigkey的命令來查看Redis中所占用的bigkey的信息,具體的命令如下:

redis-cli -h 127.0.0.1 -p 6379 -a 'xxx' --bigkeys

從上述圖所示,我們可以查看到Redis中的key占用了32098個bytes,需要進行相關優(yōu)化的。

建議:

  • 如果key為string類型,建議value的存放值的大小為10KB左右。
  • 如果key為List/Hash/Set/ZSet類型,建議存放元素的的數量控制在1萬以下。

選擇合適的數據類型

Redis提供了豐富的數據類型,對于存放的內存也做了相關優(yōu)化。關乎數據結果的相關知識,可以參考之前的文章。

例如:String和set在存儲int數據時,會采用整數編碼存儲。Hash、ZSet在元素數量比較少時,會采用壓縮列表(ziplist)存儲,在存儲比較多的數據時,才會轉換為哈希表和跳表。

采用高效的序列化和壓縮方法

Redis中的字符串都是使用二進制安全的字節(jié)數組來保存的,所以我們可以把業(yè)務的序列化成二進制寫入Redis,但是采用不同的序列化,所占用的空間大少不一樣。比如使用protostuff的序列化比java內置的序列化效率更高,占用空間更少。針對json和xml數據格式的,可以采用gzip或者snappy算法對數據進行壓縮存儲,從而節(jié)省空間。

設置Redis最大內存和淘汰策略

我們根據業(yè)務的數據量提前預估內存大小,從而避免Redis的內存持續(xù)膨脹,導致占用過多資源。

關于如何設置淘汰策略,需要集合實際的業(yè)務特性來選擇:

  • volatile-lru / allkeys-lru:優(yōu)先保留最近訪問過的數據
  • volatile-lfu / allkeys-lfu:優(yōu)先保留訪問次數最頻繁的數據
  • volatile-ttl :優(yōu)先淘汰即將過期的數據
  • volatile-random / allkeys-random:隨機淘汰數據

控制Redis實例的大小

Redis單實例的內存大小建議設置在2~6GB之間。因為無論是RDB快照,還是主從集群進行數據同步,都能很快完成,不會阻塞正常請求的處理。

定時清除內存碎片

頻繁的新增修改會導致內存碎片的增多,因此需要及時清理內存碎片。

Redis提供了Info memory命令可以查看內存使用信息,具體如下:

說明:

  • used_memory_rss是操作系統(tǒng)實際分配給 Redis的物理內存空間。
  • used_memory 是 Redis 為了保存數據實際申請使用的空間。
  • mem_fragmentation_ratio=used_memory_rss/ used_memory
  • mem_fragmentation_ratio 大于1但小于1.5。這種情況是合理的。
  • mem_fragmentation_ratio大于1.5 這表明內存碎片率已經超過了50%。一般情況下,這個時候,我們就需要采取一些措施來降低內存碎片率了。具體的內存清理措施,將在后續(xù)的文章中進行講解。

性能維度

禁止使用KEYS、FLUSHALL、FLUSHDB命令

  • KEYS 按照key內容進行匹配,返回符合匹配條件的鍵值對,該命令需要對Redis的全局哈希表進行全表掃描,嚴重阻塞 Redis主線程。
  • FLUSHALL 刪除Redis實例上的所有數據,如果數據量很大,會嚴重阻塞Redis主線程。
  • FLUSHDB,刪除當前數據庫中的數據,如果數據量很大,會阻塞Redis主線程。

優(yōu)化建議

我們需要在線上要禁用這些命令。具體的做法是,管理員采用rename-command命令在配置文件中對這些命令進行重命名,讓客戶端無法使用這些命令。

慎用全量操作的命令

對于集合類型的來說,在未清楚集合數據大小的情況下,慎用查詢集合中的全量數據,例如Hash的HetALL、Set的SMEMBERS命令、LRANGE key 0 -1 或者ZRANGE key 0 -1等命令,因為這些命令會對Hash或者Set類型的底層數據進行全量掃描,當集合數據量比較大時,會阻塞Redis的主線程。

優(yōu)化建議:

當元素數據量較多時,可以用SSCAN、HSCAN 命令分批返回集合中的數據,減少對主線程的阻塞。

慎用復雜度過高命令

Redis執(zhí)行復雜度過高的命令,會消耗更多的 CPU 資源,導致主線程中的其它請求只能等待。常見的復雜命令如下:SORT、SINTER、SINTERSTORE、ZUNIONSTORE、ZINTERSTORE 等聚合類命令。

優(yōu)化建議:

當需要執(zhí)行排序、交集、并集操作時,可以在客戶端完成,避免讓Redis進行過多計算,從而影響Redis性能。

設置合適的過期時間

Redis通常用于保存熱數據。熱數據一般都有使用的時效性。所以,在數據保存時,根據業(yè)務使用數據的時長,合理的設置數據的過期時間。否則寫入Redis的數據會一直占用內存,如果數據持續(xù)增增長,會達到機器的內存上限,造成內存溢出,導致服務崩潰。

采用批量命令代替?zhèn)€命令

當我們需要一次性操作多個key時,可以使用批量命令來處理,批量命令可以減少客戶端與服務端的來回網絡IO次數。

  • String或者Hash類型可以使用 MGET/MSET替代 GET/SET,HMGET/HMSET替代HGET/HSET
  • 其它數據類型使用Pipeline命令,一次性打包發(fā)送多個命令到服務端執(zhí)行。

Pipeline具體使用:

redisTemplate.executePipelined(new RedisCallback<String>() {
            @Override
            public String doInRedis(RedisConnection connection) throws DataAccessException {
                for (int i = 0; i < 5; i++) 
                {
                    connection.set(("test:" + i).getBytes(), "test".getBytes());
                }
                return null;
            }
        });

高可用維度

按照業(yè)務部署不同的實例

不同的業(yè)務線來部署 Redis 實例,這樣當其中一個實例發(fā)生故障時,不會影響到其它業(yè)務。

避免單點問題

業(yè)務上根據實際情況采用主從、哨兵、集群方案,避免單點故障,影響業(yè)務的正常使用。

合理的設置相關參數

針對主從環(huán)境,我們需要合理設置相關參數,具體內容如下:

  • 合理的設置repl-backlog參數:如果repl-backlog設置過小,當寫流量比較大的場景下,主從復制中斷可能會引發(fā)全量復制數據的風險。
  • 合理設置slave client-output-buffer-limit:當從庫復制發(fā)生問題時,過小的 buffer會導致從庫緩沖區(qū)溢出,從而導致復制中斷。

總結

本文對于Redis的如何優(yōu)化從內存、性能、高可用等三個維度進行了詳細的講解,如有大家還有什么優(yōu)化建議歡迎提出,大家共同學習,共同進步。

到此這篇關于Redis進行相關優(yōu)化的文章就介紹到這了,更多相關Redis優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 從源碼解讀redis持久化

    從源碼解讀redis持久化

    redis的持久化也就是數據落地,對于任何一個數據系統(tǒng)都要考慮是不是需要數據落地。在系統(tǒng)崩潰或是機房掉電等的情況下,將有用的數據記錄在非易失性存儲器上面,防止數據丟失,以及用來系統(tǒng)重啟時的數據恢復。
    2018-08-08
  • Redis+Lua腳本實現計數器接口防刷功能(升級版)

    Redis+Lua腳本實現計數器接口防刷功能(升級版)

    這篇文章主要介紹了Redis+Lua腳本實現計數器接口防刷功能,使用腳本使得set命令和expire命令一同達到Redis被執(zhí)行且不會被干擾,在很大程度上保證了原子操作,對Redis實現計數器接口防刷功能感興趣的朋友一起看看吧
    2022-02-02
  • Redis序列化存儲及日期格式的問題處理

    Redis序列化存儲及日期格式的問題處理

    這篇文章主要介紹了Redis序列化存儲及其日期格式的問題處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Redis和Lua使用過程中遇到的小問題

    Redis和Lua使用過程中遇到的小問題

    這篇文章主要給大家介紹了關于Redis和Lua使用過程中遇到的小問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-11-11
  • 用Redis實現微博關注關系

    用Redis實現微博關注關系

    在微博中,每一個用戶都會有一個關注列表,一個粉絲列表。用戶可以查看自己的關注,粉絲列表,也可以查看別人的關注,粉絲列表。并且,要展示列表里每個人與當前查看者的關注狀態(tài)。
    2015-09-09
  • redis初學者常見字符亂碼問題及解決方案

    redis初學者常見字符亂碼問題及解決方案

    這篇文章主要介紹了redis初學者常見字符亂碼問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 詳解redis是如何實現隊列消息的ack

    詳解redis是如何實現隊列消息的ack

    這篇文章主要介紹了關于redis是如何實現隊列消息的ack的相關資料,文中介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Redis?sentinel哨兵集群的實現步驟

    Redis?sentinel哨兵集群的實現步驟

    本文主要介紹了Redis?sentinel哨兵集群的實現步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    CentOS 6.5 64位下安裝Redis3.0.2的具體步驟

    這篇文章主要介紹了CentOS 6.5 64位下安裝Redis3.0.2的具體步驟,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • redis key過期監(jiān)聽的實現示例

    redis key過期監(jiān)聽的實現示例

    在Redis中,我們可以為Key設置過期時間,當Key的過期時間到達后,Redis會自動將該Key標記為已失效,本文就來介紹一下redis key過期監(jiān)聽的實現示例,感興趣的可以了解一下
    2024-03-03

最新評論