Redis Glimpse 安裝與設定

2024-12-07

筆記初次使用 Redis 如何進行安裝與設定以及學習 Redis 的進行方式。

logo

說明

快速入門學習使用的方式,使用 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 的資料持久化、高可用性、叢集架構

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