Redis Glimpse 安裝與設定
2024-12-07
筆記初次使用 Redis 如何進行安裝與設定以及學習 Redis 的進行方式。
說明
快速入門學習使用的方式,使用 Docker 的方式進行部署,練習各種資料物件的寫入、讀取等操作,並且搭配 RedisInsight 進行視覺化的資料結果瀏覽。
在操作過程,如果要執行 Redis 是透過 redis-server
的方式進行啟動,並且再搭配 redis-cli
連線使用與發送指令。
如果要學習 Redis 可以透過 Redis University 進行學習,有許多免費的課程及實作練習可以進行,並針對 Python、.NET 等程式語言有專門的課程模組。
安裝設定的最佳實務
Redis 的設定檔案有許多眉角可以設定,例如是否開啟 AOF、RDB、記憶體限制等等,針對不同的使用情境,可以進行不同的設定。
淺談高可用與叢集架構
Redis 的高可用與叢集架構,可以在單一虛擬機上完成設定,對於學習概念的驗證來說,非常方便。
而 Redis 的高可用主要是將節點 (Replica) 分為 Master 與 Slave,Master 是主要的讀寫節點,並且會透過非同步的方式將資料複製到 Slave 節點。當需要容錯移轉的時候,可以透過手動的方式切換,或者是搭配設計 Redis Sentinel 進行自動化的容錯移轉。
叢集架構則是將多個 Master 節點組成一個叢集,並且透過 Redis Cluster 的方式進行資料的分散與複製,當有節點掛掉的時候,叢集會自動進行資料的重新分配,以達到高可用的目標。
理想的架構設置是以分散式的方式進行,並且搭配 Redis Sentinel 進行監控。
Redis 的安裝方式
使用 Docker 是最簡易的方式。
此外也可以在 Linux 伺服器上,透過編譯並複製執行檔的方式進行安裝。
安裝設定
可以透過 cat /etc/sysctl.conf
確認下列關於 Redis 的設定
vm.overcommit_memory = 1 # 實體記憶體不足時不要主動關閉
net.core.somaxconn = 32767 # 最大連線數
vm.swappiness = 10 # 在記憶體不足時,才進行 Swap Out
確認 /etc/security/limits.conf 當中 redis 能夠開啟的最大檔案數量
cat /etc/security/limits.conf | grep redis
關閉 HugePage,HugePage 的用途是將記憶體分成大塊,減少 Page Table 的使用,但是 Redis 會使用大量的記憶體,所以不建議使用 HugePage。
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
# 關閉後進行確認
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
確認 gcc version,因為使用編譯的方式進行安裝,所以需要確認 gcc 是否有安以及版本是否符合需求
gcc -v
下載、解壓縮 redis 並且進行編譯與安裝
curl -O https://download.redis.io/releases/redis-7.4.0.tar.gz
tar -zxf redis-7.4.0.tar.gz
make install BUILD_TLS=yes # 編譯 Redis 並自動將執行檔放置在 /usr/local/bin,省去 PATH 的設定需求
使用 ls -l /usr/local/bin/redis*
確認是否有安裝成功
接著將 conf 複製到 home 路徑,使用非 root 身分進行操作
cp /root/redis-7.4.0/redis.conf /home/redis/redis.conf
chown redis.redis /home/redis/redis.conf
測試開發環境的特別設定
開發期間的操作,關閉防火牆與關閉自動啟動
su - root
systemctl stop firewalld
systemctl disable firewalld
# 使用以下指令確認
systemctl status firewalld
setenforce
設定為 0
,關閉 SELinux,正式環境不建議關閉
setenforce 0
# 使用以下指令確認
getenforce
細說 Redis Conf 設定
使用準備好的 conf 檔案進行 Redis 伺服器的啟動
redis-server /home/redis/redis.conf
如果要調整 Redis 的設定,可以透過 redis-cli
進行操作
config set loglevel warning
config rewrite
shutdown
注意在設定檔案上,容量的單位 大k 與 小k 有差異:
- 大k 指 1kb = 1024bytes
- 小k 指 1kb = 1000bytes
綜合相關設定設定
bind 127.0.0.1 # 限制只能透過本機進行連線
protected-mode yes # 限制只能透過本機進行連線
port 6379
timeout 0
tcp-keepalive 300 # 每 300 秒進行一次 TCP 保持連線
如果想要加入加密安全連線可以藉由以下設定完成
tls-port 16379 # 指定 TLS 連線的 Port
tls-cert-file redis.crt # TLS 憑證檔案
tls-key-file redis.key # TLS 金鑰檔案
其他相關設定
daemonize no # 是否背景執行
logfile /var/log/redis_6379.log # 搭配背景執行,指定 log 檔案路徑與檔案名稱
loglevel notice # log 訊息多寡程度
databases 1 # 最新實務設定,不再需要切換資料庫\
pidfile /var/run/redis_6379.pid
# PID 文件的用途為方便管理 Redis 進程,例如停止或重啟 Redis 伺服器時,可以通過讀取這個文件來取得 PID,並確保同一台 Redis 伺服器不會被多次啟動,因為啟動時會檢查這個文件是否已經存在。
其中 loglevel
的設定從訊息最多至最精簡等級如下: 🐞 debug > 🗣️ verbose > 📢 notice > ⚠️ warning > 🚫 nothing
Snapshot 相關設定
save "" # 不產生 dump.rdb 快照
# save 的其他設定方式
save 900 30 # 900 秒內有 30 次變更就進行快照 1 次
stop-writes-on-bgsave-error yes # 當快照失敗時則停止寫入快照
rdbcompression yes # 是否啟用壓縮快照
rdbchecksum yes # 是否啟用快照檢查碼
dbfilename dump.rdb # 快照檔案名稱
rdb-del-sync-files no # 是否刪除舊的快照檔案
dir /var/local/var/db/redis # 快照檔案存放路徑
Append Only File 相關設定
Append Only File 簡稱為 AOF 模式,啟動會將每次寫入的指令記錄下來,相當於交易日誌,會造成效能的降低。好處是當 Redis 伺服器重啟時,會讀取 AOF 檔案,並且將檔案中的指令重新執行一次,以達到資料不會遺失的目的。
appendonly no # AOF 模式,預設無啟動
appendfilename "appendonly.aof" # AOF 檔案名稱
aof-use-rdb-preamble yes # 整合 AOF 與 RDB 快照
appendfsync everysec # 每秒進行一次寫入
no-appendfsync-on-rewrite no # 重寫時是否停止寫入
一般的 RDBMS 屬於 Write Ahead Log,先寫入 Log 檔案,再寫入資料庫,所以保證不會造成資料遺失,然而 Redis 屬於 Write Behind Log,先寫入資料庫,再寫入 Log 檔案,會有效能的提升,但是會造成資料遺失的風險。
Security 相關設定
requirepass foobared # 預設的密碼,不需要帳號,最簡單形式的安全設定
maxclients 10000 # 最大連線數需要與 net.core.somaxconn 取最小值
Performance 相關設定
maxmemory 1gb # 最大記憶體使用量
maxmemory-policy noeviction # 記憶體不足時不進行快取驅逐
其他記憶體管理策略
策略名稱 | 說明 |
---|---|
volatile-lru | 僅在設定了過期時間的鍵中,淘汰最近最少使用的鍵 |
allkeys-lru | 在所有鍵中,淘汰最近最少使用的鍵,無論是否設定了過期時間 |
volatile-lfu | 僅在設定了過期時間的鍵中,淘汰使用頻率最低的鍵 |
allkeys-lfu | 在所有鍵中,淘汰使用頻率最低的鍵,無論是否設定了過期時間 |
volatile-random | 僅在設定了過期時間的鍵中,隨機淘汰鍵 |
allkeys-random | 在所有鍵中,隨機淘汰鍵,無論是否設定了過期時間 |
volatile-ttl | 僅在設定了過期時間的鍵中,淘汰剩餘時間最短的鍵 |
noeviction | 當記憶體不足以容納新寫入資料時,直接返回錯誤,不淘汰任何鍵 |
- volatile 策略只會淘汰那些設定了過期時間的鍵。
- allkeys 策略會在所有鍵中進行淘汰,不管是否設定了過期時間。
Lazy Freeing 相關設定
不實際釋放記憶體,而是等到有需要時才釋放記憶體,這樣可以減少記憶體的碎片化,提升記憶體的使用效率。
lazyfree-lazy-eviction yes # 是否啟用懶惰快取驅逐
lazyfree-lazy-expire yes # 是否啟用懶惰過期
lazyfree-lazy-server-del yes # 是否啟用懶惰伺服器刪除
replica-lazy-flush yes # 是否啟用複製懶惰刷新
執行緒相關設定
Redis 是單執行緒,但是可以透過 IO 執行緒來提升效能,實務建議只有在作業系統核心數量大於 4 核心時才需要設定,而最多設定到 8 個執行緒,更高沒有提升的效益。
io-threads 4 # IO 執行緒數量
io-threads-do-reads yes # 是否啟用 IO 執行緒讀取
關閉 Transparent Huge Page,可以提升 Redis 的穩定性與效能。
disable-thp yes
Slow Log 相關設定
用於記錄超過指定時間的指令,其他指令不會被記錄,可以用於分析效能問題。
slowlog-log-slower-than 10000 # 記錄超過 10 秒的指令
slowlog-max-len 128 # 最多記錄 128 條指令
細說 Redis 內建的資料結構與操作指令
關於 Redis 的資料持久化、高可用性、叢集架構
Redis 的安全性與效能優化
常見的 Anti-Patterns:
- 沒有設定密碼
- 經常執行
KEYS *
,造成 Redis 效能負擔 - 太多資料庫,最佳實務是使用單一資料庫
- HGETALL, LRANGE, SMEMBERS, ZRANGE 沒有使用
COUNT
參數 - 一次連線只處理一個指令,造成反覆開啟連線的負擔
Name | Description |
---|---|
快取雪崩 Cache Avalanche | 同時間大量的快取過期,導致大量直接對資料庫查詢,可以讓快取的過期時間加上隨機值,避免同時間大量過期 |
快取擊穿 Hotspot Invalid | 少數的熱門快取失效,直造成接對資料庫查詢,熱門的快取可以設定永不過期 |
快取穿透 Cache Penetration | 快取不存在且也不存在資料庫,造成無效的查詢。可以使用 Bloom Filter 來過濾不存在的快取 |
關於 Benchmark Operation 可以使用 redis-benchmark
來進行 Redis 的效能測試。
對於 Slowlog 的處理,可以將 Redis 的慢查詢記錄起來,用以分析效能問題。
CONFIG SET slowlog-log-slower-than 10 # 設定慢查詢時間 10 ms
CONFIG SET slowlog-max-len 1000 # 設定最多記錄 1000 筆慢查詢
SLOWLOG GET 10 # 取得最近 10 筆慢查詢
可以使用 redis-cli --bigkeys
來查看 Redis 中的大 Key (對於記憶體的使用量及效能有影響)
redis-cli --bigkeys