目錄
1、停止使用 KEYS *
2、找出拖慢 Redis 的罪魁禍首
3、将 Redis-Benchmark 结果作为参考,而不要一概而论
4、Hashes 是你的最佳选择
5、设置 key 值的存活时间
6、 選擇適當的回收策略
7、如果你的資料很重要,請使用Try/Except
8、不要耗盡一個實例
9、核心越多越好嗎? !
10、高可用
首頁 運維 linux運維 Linux維運需要知道的Redis經驗

Linux維運需要知道的Redis經驗

Aug 04, 2023 pm 04:17 PM
linux redis


Redis 在目前的科技社群裡是非常熱門的。從來自 Antirez 一個小小的個人專案到成為記憶體資料儲存產業的標準,Redis已經走過了很長的一段路。隨之而來的一系列最佳實踐,使得大多數人可以正確地使用 Redis。

下面我們將探討正確使用 Redis 的10個經驗。

1、停止使用 KEYS *

Okay,以挑戰這個指令開始這篇文章,或許不是一個好的方式,但其確實可能是最重要的一點。很多時候當我們專注於一個redis實例的統計數據,我們會快速地輸入”KEYS *”命令,這樣key的資訊會很明顯地展示出來。平心而論,從程式化的角度出發往往傾向於寫出下面這樣的偽代碼:

for key in'keys *':
doAllTheThings() 
登入後複製

但是當你有1300萬個key時,執行速度將會變慢。因為KEYS指令的時間複雜度是O(n),其中n是要回傳的keys的個數,這樣這個指令的複雜度就取決於資料庫的大小了。並且在這個操作執行期間,其它任何命令在你的實例中都無法執行。

作為一個替代命令,看看 SCAN 吧,其允許你以更友善的方式來執行… SCAN 透過增量迭代的方式來掃描資料庫。這項操作是基於遊標的迭代器來完成的,因此只要你覺得合適,你可以隨時停止或繼續。

2、找出拖慢 Redis 的罪魁禍首

由於 Redis 沒有非常詳細的日誌,要想知道在 Redis 實例內部都做了些什麼是非常困難的。幸運的是Redis 提供了一個下面這樣的命令統計工具:

127.0.0.1:6379> INFO commandstats

# Commandstats

cmdstat_get:calls=78,usec=608,usec_per_call=7.79

cmdstat_setex:calls=5,usec=71,usec_per_call=14.20

cmdstat_keys:calls=2,usec=42,usec_per_call=21.00

cmdstat_info:calls=10,usec=1931,usec_per_call=193.10
登入後複製

透過這個工具可以查看所有命令統計的快照,例如命令執行了多少次,執行命令所耗費的毫秒數(每個命令的總時間和平均時間) 只需要簡單地執行CONFIG RESETSTAT 指令就可以重置,這樣你就可以得到一個全新的統計結果。

3、将 Redis-Benchmark 结果作为参考,而不要一概而论

Redis 之父 Salvatore 就说过:“通过执行GET/SET命令来测试Redis就像在雨天检测法拉利的雨刷清洁镜子的效果”。很多时候人们跑到我这里,他们想知道为什么自己的Redis-Benchmark统计的结果低于最优结果 。但我们必须要把各种不同的真实情况考虑进来,例如:

  • 可能受到哪些客户端运行环境的限制?
  • 是同一个版本号吗?
  • 测试环境中的表现与应用将要运行的环境是否一致?

Redis-Benchmark的测试结果提供了一个保证你的 Redis-Server 不会运行在非正常状态下的基准点,但是你永远不要把它作为一个真实的“压力测试”。压力测试需要反应出应用的运行方式,并且需要一个尽可能的和生产相似的环境。

4、Hashes 是你的最佳选择

以一种优雅的方式引入 hashes 吧。hashes 将会带给你一种前所未有的体验。之前我曾看到过许多类似于下面这样的key结构:

foo:first_name

foo:last_name

foo:address
登入後複製

上面的例子中,foo 可能是一个用户的用户名,其中的每一项都是一个单独的 key。这就增加了 犯错的空间,和一些不必要的 key。使用 hash 代替吧,你会惊奇地发现竟然只需要一个 key :

127.0.0.1:6379> HSET foo first_name 'Joe'

(integer) 1

127.0.0.1:6379> HSET foo last_name 'Engel'

(integer) 1

127.0.0.1:6379> HSET foo address '1 Fanatical Pl'

(integer) 1

127.0.0.1:6379> HGETALL foo

1) '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'
登入後複製

5、设置 key 值的存活时间

无论什么时候,只要有可能就利用key超时的优势。一个很好的例子就是储存一些诸如临时认证key之类的东西。当你去查找一个授权key时——以OAUTH为例——通常会得到一个超时时间。这样在设置key的时候,设成同样的超时时间,Redis就会自动为你清除!而不再需要使用KEYS *来遍历所有的key了,怎么样很方便吧?

6、 選擇適當的回收策略

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

7、如果你的資料很重要,請使用Try/Except

如果必須確保關鍵性的資料可以放入到Redis 的實例中,我強烈建議將其放入try/except 區塊中。幾乎所有的Redis客戶端採用的都是「發送即忘」策略,因此經常需要考慮一個 key 是否真正被放到 Redis 資料庫中了。至於將 try/expect 放到 Redis 指令中的複雜性並不是本文要講的,你只需要知道這樣做可以確保重要的資料放到該放的地方就可以了。

8、不要耗盡一個實例

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

9、核心越多越好嗎? !

當然是錯的。 Redis 是一個單執行緒進程,即使啟用了持久化最多也只會消耗兩個核心。除非你打算在一台主機上執行多個實例-希望只會在開發測試的環境下! ——否則的話對於一個 Redis 實例是不需要2個以上核心的。

10、高可用

到目前為止 Redis Sentinel 已經經過了很全面的測試,許多用戶已經將其應用到了生產環境中(包括 ObjectRocket )。如果你的應用程式嚴重依賴 Redis ,那就需要想出一個高可用方案來保證其不會斷線。當然,如果不想自己管理這些東西,ObjectRocket 提供了一個高可用平台,並提供7×24小時的技術支持,有意向的話可以考慮一下。

以上是Linux維運需要知道的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脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

docker原理詳解 docker原理詳解 Apr 14, 2025 pm 11:57 PM

Docker利用Linux內核特性,提供高效、隔離的應用運行環境。其工作原理如下:1. 鏡像作為只讀模板,包含運行應用所需的一切;2. 聯合文件系統(UnionFS)層疊多個文件系統,只存儲差異部分,節省空間並加快速度;3. 守護進程管理鏡像和容器,客戶端用於交互;4. Namespaces和cgroups實現容器隔離和資源限制;5. 多種網絡模式支持容器互聯。理解這些核心概念,才能更好地利用Docker。

docker desktop怎麼用 docker desktop怎麼用 Apr 15, 2025 am 11:45 AM

如何使用 Docker Desktop? Docker Desktop 是一款工具,用於在本地機器上運行 Docker 容器。其使用步驟包括:1. 安裝 Docker Desktop;2. 啟動 Docker Desktop;3. 創建 Docker 鏡像(使用 Dockerfile);4. 構建 Docker 鏡像(使用 docker build);5. 運行 Docker 容器(使用 docker run)。

REDIS:對其數據庫方法進行分類 REDIS:對其數據庫方法進行分類 Apr 15, 2025 am 12:06 AM

Redis的數據庫方法包括內存數據庫和鍵值存儲。 1)Redis將數據存儲在內存中,讀寫速度快。 2)它使用鍵值對存儲數據,支持複雜數據結構,如列表、集合、哈希表和有序集合,適用於緩存和NoSQL數據庫。

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Docker使用了哪些底層技術? Docker使用了哪些底層技術? Apr 15, 2025 am 07:09 AM

Docker 使用容器引擎、鏡像格式、存儲驅動程序、網絡模型、容器編排工具、操作系統虛擬化和容器註冊表等技術來支持其容器化功能,提供輕量級、可移植且自動化的應用程序部署和管理。

docker鏡像失敗怎麼辦 docker鏡像失敗怎麼辦 Apr 15, 2025 am 11:21 AM

Docker鏡像構建失敗的故障排除步驟:檢查Dockerfile語法和依賴項版本。檢查構建上下文中是否包含所需源代碼和依賴項。查看構建日誌以獲取錯誤詳細信息。使用--target選項構建分層階段以識別失敗點。確保使用最新版本的Docker引擎。使用--t [image-name]:debug模式構建鏡像以調試問題。檢查磁盤空間並確保足夠。禁用SELinux以防止干擾構建過程。向社區平台尋求幫助,提供Dockerfile和構建日誌描述以獲得更具體的建議。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

怎麼看docker進程 怎麼看docker進程 Apr 15, 2025 am 11:48 AM

Docker 進程查看方法:1. Docker CLI 命令:docker ps;2. Systemd CLI 命令:systemctl status docker;3. Docker Compose CLI 命令:docker-compose ps;4. Process Explorer(Windows);5. /proc 目錄(Linux)。

See all articles