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

Redis進(jìn)行相關(guān)優(yōu)化詳解

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

前言

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

內(nèi)存維度

控制key的長度

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

避免存儲bigkey

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

如何查詢bigkey

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

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

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

建議:

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

選擇合適的數(shù)據(jù)類型

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

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

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

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

設(shè)置Redis最大內(nèi)存和淘汰策略

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

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

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

控制Redis實例的大小

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

定時清除內(nèi)存碎片

頻繁的新增修改會導(dǎo)致內(nèi)存碎片的增多,因此需要及時清理內(nèi)存碎片。

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

說明:

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

性能維度

禁止使用KEYS、FLUSHALL、FLUSHDB命令

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

優(yōu)化建議

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

慎用全量操作的命令

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

優(yōu)化建議:

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

慎用復(fù)雜度過高命令

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

優(yōu)化建議:

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

設(shè)置合適的過期時間

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

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

當(dāng)我們需要一次性操作多個key時,可以使用批量命令來處理,批量命令可以減少客戶端與服務(wù)端的來回網(wǎng)絡(luò)IO次數(shù)。

  • String或者Hash類型可以使用 MGET/MSET替代 GET/SET,HMGET/HMSET替代HGET/HSET
  • 其它數(shù)據(jù)類型使用Pipeline命令,一次性打包發(fā)送多個命令到服務(wù)端執(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è)務(wù)部署不同的實例

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

避免單點問題

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

合理的設(shè)置相關(guān)參數(shù)

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

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

總結(jié)

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

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

相關(guān)文章

  • Redis 在真實世界的 5 個用法

    Redis 在真實世界的 5 個用法

    Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API這篇文章主要介紹了Redis 在真實世界的 5 個用法,需要的朋友可以參考下
    2018-03-03
  • 詳解Redis如何保證接口的冪等性

    詳解Redis如何保證接口的冪等性

    如何防止接口中同樣的數(shù)據(jù)提交,以及如何保證消息不被重復(fù)消費,這些都是shigen在學(xué)習(xí)的過程中遇到的問題,今天,趁著在學(xué)習(xí)redis的間隙,我寫了一篇文章進(jìn)行簡單的實現(xiàn),需要的朋友可以參考下
    2023-11-11
  • Redis緩存lettuce更換為Jedis的實現(xiàn)步驟

    Redis緩存lettuce更換為Jedis的實現(xiàn)步驟

    在springboot中引入spring-boot-starter-data-redis依賴時,默認(rèn)使用的是lettuce,如果不想使用lettuce而是使用Jedis連接池,本文主要介紹了Redis緩存lettuce更換為Jedis的實現(xiàn)步驟,感興趣的可以了解一下
    2024-08-08
  • redis擊穿現(xiàn)象如何防止

    redis擊穿現(xiàn)象如何防止

    本文主要介紹了redis擊穿現(xiàn)象如何防止,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis配置文件代碼講解

    Redis配置文件代碼講解

    在本篇文章里小編給大家整理的是一篇關(guān)于Redis配置文件的說明內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程(入門)

    通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程(入門)

    這篇文章主要介紹了通俗易懂的Redis數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Redis TTL命令實現(xiàn)數(shù)據(jù)生存時間

    Redis TTL命令實現(xiàn)數(shù)據(jù)生存時間

    生存時間可以通過Redis中的不同命令來設(shè)置、查看和管理,TTL命令是其中之一,本文主要介紹了Redis TTL命令實現(xiàn)數(shù)據(jù)生存時間,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Redis閃退的三種解決辦法(windows版本)

    Redis閃退的三種解決辦法(windows版本)

    目前大部分的項目都需要redis緩存,有時候我們會遇見打開redis緩存出現(xiàn)閃退的狀況,本文小編給大家介紹了Redis閃退的三種解決辦法(windows版本),通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • CentOS系統(tǒng)安裝Redis及Redis的PHP擴展詳解

    CentOS系統(tǒng)安裝Redis及Redis的PHP擴展詳解

    這篇文章主要介紹了CentOS系統(tǒng)下安裝Redis數(shù)據(jù)的教程,以及詳解了Redis數(shù)據(jù)庫的PHP擴展,文中介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Redis分布式鎖與Redlock算法實現(xiàn)

    Redis分布式鎖與Redlock算法實現(xiàn)

    在Redis中,可以使用多種方式實現(xiàn)分布式鎖,如使用SETNX命令或RedLock算法,本文就來介紹一下Redis分布式鎖與Redlock算法實現(xiàn),感興趣的可以了解一下
    2023-12-12

最新評論

安塞县| 蛟河市| 顺昌县| 大姚县| 成安县| 前郭尔| 吉林省| 平阳县| 兰溪市| 梁山县| 密云县| 寻甸| 正定县| 香港| 潮安县| 英吉沙县| 玛沁县| 涪陵区| 山东省| 鄂尔多斯市| 屏东市| 茂名市| 平塘县| 鄂州市| 四子王旗| 玉田县| 夏津县| 繁峙县| 北碚区| 黔东| 罗江县| 藁城市| 儋州市| 通海县| 沙坪坝区| 扶余县| 自贡市| 兴海县| 深州市| 繁昌县| 黎平县|