目錄
記憶體維度
控制key的長度
避免儲存bigkey
如何查詢bigkey
選擇合適的資料類型
採用高效的序列化和壓縮方法
設定Redis最大記憶體和淘汰策略
控制Redis實例的大小
定時清除記憶體碎片
慎用全量操作的命令
慎用复杂度过高命令
设置合适的过期时间
采用批量命令代替个命令
Pipeline具体使用:
高可用维度
按照业务部署不同的实例
避免单点问题
合理的设置相关参数
首頁 資料庫 Redis Redis優化實例分析

Redis優化實例分析

Jun 01, 2023 am 08:38 AM
redis

記憶體維度

控制key的長度

key的一般都是採用字串,而字串的底層資料結構為SDS,SDS 結構中會包含字串長度、分配空間大小等元資料訊息,當key字串的長度增加時,SDS中的元資料也會佔用更多記憶體空間,為了減少key的佔用空間,我們可用根據業務名來使用對應的英文縮寫來表示。例如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優化實例分析

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

建議:

  • 如果key為string類型,建議value的存放值的大小為10KB左右。

  • 如果key為List/Hash/Set/ZSet類型,建議存放元素的數量控制在1萬以下的。

選擇合適的資料類型

Redis針對所儲存的資料類型進行了最佳化,同時也對記憶體進行了對應的最佳化。關乎數據結果的相關知識,可以參考先前的文章。

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

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

Redis中的字串都是使用二進位安全的位元組陣列來保存的,所以我們可以把業務的序列化成二進位寫入Redis ,但是採用不同的序列化,所佔用的空間大少不一樣。 Protostuff的序列化比Java內建的序列化更有效率,且佔用的空間更少。為了減少空間佔用,我們可以對JSON和XML資料格式進行壓縮存儲,可選的壓縮演算法包括Gzip和Snappy。

設定Redis最大記憶體和淘汰策略

我們根據業務的資料量提前預估記憶體大小,從而避免Redis的記憶體持續膨脹,導致佔用過多資源。

關於如何設定淘汰策略,需要集合實際的業務特性來選擇:

  • #volatile-lru / allkeys-lru: 優先保留最近訪問過的資料

  • volatile-lfu / allkeys-lfu:優先保留存取次數最頻繁的資料

  • #volatile-ttl :優先淘汰即將過期的資料

  • volatile-random / allkeys-random:隨機淘汰資料

控制Redis實例的大小

Redis單一實例的記憶體大小建議設定在2~6GB之間。由於RDB快照和主從叢集資料同步都能快速完成,因此不會阻塞正常請求的處理。

定時清除記憶體碎片

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

Redis提供了Info memory指令可以查看記憶體使用訊息,如下:

Redis優化實例分析

##說明:

  • used_memory_rss是作業系統實際分配給Redis的實體記憶體空間。

  • used_memory 是 Redis 為了保存資料實際申請使用的空間。

  • mem_fragmentation_ratio=used_memory_rss/ used_memory

  • mem_fragmentation_ratio 大於1但小於1.5。這種情況是合理的。

  • 如果mem_fragmentation_ratio大於1.5,表示記憶體碎片率已經達到50%以上。在這種情況下,通常需要採取一些措施來減少記憶體碎片率。具體的記憶體清理措施,將在後續的文章中進行講解。

效能維度

禁止使用KEYS、FLUSHALL、FLUSHDB指令

  • KEYS 依照key內容進行匹配,傳回符合匹配條件的鍵值對,此指令需要對Redis的全域雜湊表進行全表掃描,嚴重阻塞Redis主執行緒。

  • FLUSHALL 刪除Redis實例上的所有數據,如果資料量很大,會嚴重阻塞Redis主執行緒。

  • FLUSHDB,刪除目前資料庫中的數據,如果資料量很大,會阻塞Redis主執行緒。

優化建議
我們需要在線上要停用這些命令。具體的做法是,管理者採用rename-command指令在設定檔中對這些指令進行重新命名,讓客戶端無法使用這些指令。

慎用全量操作的命令

对于集合类型的来说,在未清楚集合数据大小的情况下,慎用查询集合中的全量数据,例如Hash的HetALL、Set的SMEMBERS命令、LRANGE key 0 -1 或者ZRANGE key 0 -1等命令,因为这些命令会对Hash或者Set类型的底层数据进行全量扫描,当集合数据量比较大时,会阻塞Redis的主线程。

优化建议:

当元素数据量较多时,可以用SSCAN、HSCAN 命令分批返回集合中的数据,减少对主线程的阻塞。

慎用复杂度过高命令

Redis执行复杂度过高的命令,会消耗更多的 CPU 资源,导致主线程中的其它请求只能等待。常见的复杂命令如下:SORT、SINTER、SINTERSTORE、ZUNIONSTORE、ZINTERSTORE 等聚合类命令。

优化建议:

当需要执行排序、交集、并集操作时,可以在客户端完成,避免让Redis进行过多计算,从而影响Redis性能。

设置合适的过期时间

Redis通常用于保存热数据。热数据一般都有使用的时效性。因此,在数据存储的过程中,应根据业务对数据的使用时间合理地设置数据的过期时间。否则写入Redis的数据会一直占用内存,如果数据持续增增长,会达到机器的内存上限,造成内存溢出,导致服务崩溃。

采用批量命令代替个命令

当我们需要一次性操作多个key时,可以使用批量命令来处理,批量命令可以减少客户端与服务端的来回网络IO次数。

  • String或者Hash类型可以使用 MGET/MSET替代 GET/SET,HMGET/HMSET替代HGET/HSET

  • 其它数据类型使用Pipeline命令,一次性打包发送多个命令到服务端执行。

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;
            }
        });
登入後複製

高可用维度

按照业务部署不同的实例

不同的业务线来部署 Redis 实例,这样当其中一个实例发生故障时,不会影响到其它业务。

避免单点问题

业务上根据实际情况采用主从、哨兵、集群方案,避免单点故障,影响业务的正常使用。

合理的设置相关参数

针对主从环境,我们需要合理设置相关参数,具体内容如下:

  • 合理的设置repl-backlog参数:如果repl-backlog设置过小,当写流量比较大的场景下,主从复制中断可能会引发全量复制数据的风险。

  • 合理设置slave client-output-buffer-limit:当从库复制发生问题时,过小的 buffer会导致从库缓冲区溢出,从而导致复制中断。

以上是Redis優化實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

See all articles