目錄
Redis 安裝與數據類型
安裝指南
Windows
Linux
性能測試
基本知識
數據類型
String
List(雙向列表)
Set(集合)
Hash(哈希)
Zset(有序集合)
高級功能
地理位置(Geospatial)
Hyperloglog
Bitmaps
Redis高級功能與配置指南
1. 事務
1.1 事務簡介
1.2 事務命令
1.3 鎖機制
1.3.1 悲觀鎖
1.3.2 樂觀鎖
2. Redis配置文件(redis.conf)
2.1 網絡配置
2.2 通用配置
2.3 快照配置(RDB)
2.4 客戶端限制
2.5 內存管理
2.6 AOF配置
3. 持久化
3.1 RDB持久化
3.2 AOF持久化
4. 訂閱/發布
4.1 概述
4.2 命令說明
4.3 使用示例
4.4 應用場景
Redis主從復制、哨兵模式及緩存問題解決策略
1. Redis主從復制
1.1 概述
1.2 主從復制的工作原理
1.3 配置主從復制
1.4 主從復制的優缺點
2. 哨兵模式
2.1 概述
2.2 哨兵的工作原理
2.3 配置哨兵
2.4 簡單部署
2.5?哨兵的優缺點
3. 緩存穿透、擊穿與雪崩問題及解決策略
3.1 緩存穿透
3.2 緩存擊穿
3.3 緩存雪崩
Redis 安裝與數據類型
Redis(Remote Dictionary Server)是一個開源的、支持網絡的Key-Value數據庫,使用ANSI C語言編寫,支持內存和日志型持久化。它提供多種數據類型,常用于數據庫、緩存和消息中間件。
安裝指南
Windows
- 安裝:從 MicrosoftArchive/redis 下載安裝包并安裝。
- 測試:
ping
:測試服務是否啟動。set name cht
:設置鍵值對。get name
:獲取鍵對應的值。
Linux
????????前提:確保已安裝Java和gcc-c++
。
- 使用源碼:
- 下載源碼包:
wget -http://download.redis.io/releases/redis-<version>.tar.gz
- 解壓:
tar -xzf redis-<version>.tar.gz ?
- 進入目錄:
cd redis-<version>
- 編譯:make
- 安裝:
sudo make install
- 驗證安裝:redis-server -version
- 下載源碼包:
- 使用Docker:(下面的相關展示使用的是docker)
- 拉取鏡像:
docker pull redis
- 運行容器:
docker run -d --name myredis redis
- 進入容器客戶端:
docker exec -it myredis redis-cli
- 查看連接:
ps -ef | grep redis
- 停止服務:
shutdown
- 拉取鏡像:
性能測試
使用redis-benchmark
測試性能:
- 示例命令:
docker exec -it myredis redis-benchmark -p 6379 -c 100 -n 1000000
- 參數說明:
-h
:主機名/IP。-p
:端口號,默認6379。-c
:并發連接數,默認50。-n
:請求數,默認100000。-d
:數據大小,默認3字節。-t
:指定測試類型。-P
:管道機制。-q
:安靜模式。--csv
:輸出CSV格式。-r
:隨機鍵空間。
基本知識
- 數據庫:默認16個數據庫,切換使用
select dbindex
。 - 線程模型:單線程(Redis 6.0起支持多線程)。
- 常用命令:
DBSIZE
:查看鍵數。key *
:列出所有鍵。flushdb/FLUSHALL
:清空數據庫。exists key
:檢查鍵是否存在。expire key seconds
:設置過期時間。ttl key
:查看剩余時間。type key
:查看鍵類型。
數據類型
String
適用于字符串存儲:
set key value
:設置值。get key
:獲取值。append key value
:追加字符串。strlen key
:字符串長度。incr/decr key
:自增/自減。getrange/setrange
:截取/替換子串。setex key seconds value
:設置帶過期時間的值。setnx key value
:鍵不存在時設置。mset/mget
:批量操作。getset key value
:先獲取后設置。
List(雙向列表)
lpush/rpush
:左邊/右邊添加元素。lrange
:獲取范圍內元素。lpop/rpop
:移除左/右邊元素。lrem
:移除指定元素。ltrim
:截取并保留范圍內元素。rpoplpush
:從源列表末尾移到目標列表開頭。lset
:替換元素。linsert
:在指定元素前/后插入新元素。
Set(集合)
不允許重復元素:
sadd
:添加元素。smembers
:查看所有元素。sismember
:檢查元素是否存在。scard
:元素個數。srem
:移除元素。srandmember
:隨機獲取元素。spop
:隨機移除元素。smove
:移動元素到另一個集合。sdiff/sinter/sunion
:集合運算。
Hash(哈希)
適合對象存儲:
hset
:設置鍵值。hget/hmget
:獲取值。hmset
:批量設置。hgetall
:獲取所有鍵值。hlen
:鍵的數量。hexists
:檢查鍵是否存在。hkeys/hvals
:鍵列表/值列表。hincrby/hdecrby
:增量/減量。hsetex/hsetnx
:帶過期時間/不存在時設置。
Zset(有序集合)
按分數排序:
zadd
:添加元素。zrange/zrevrange
:升序/降序獲取元素。zrem
:移除元素。zcard
:元素個數。zcount
:統計分數區間內的元素。zrangebyscore/zrevrangebyscore
:按分數范圍獲取元素。
高級功能
地理位置(Geospatial)
處理地理位置數據:
geoadd
:添加地理位置。geopos
:獲取位置坐標。geodist
:計算兩點距離。georadius/geomember
:查詢區域內的位置。geohash
:生成Geohash字符串。zrange/zrem
:操作有序集合。
Hyperloglog
用于基數統計:
pfadd
:添加元素。pfcount
:統計基數。pfmerge
:合并集合。
Bitmaps
位運算支持布爾標志:
setbit/getbit
:設置/獲取位值。bitcount
:統計1的位數。bitop
:進行AND、OR、XOR、NOT操作。
Redis高級功能與配置指南
1. 事務
1.1 事務簡介
Redis的事務通過MULTI
命令開始,所有事務命令會緩沖到隊列中,直到執行EXEC
才會運行。如果在事務執行過程中出現編譯錯誤,所有命令都不執行;運行時錯誤則繼續執行其他命令。
1.2 事務命令
MULTI
:開始事務。EXEC
:執行事務。DISCARD
:取消事務,放棄緩沖中的命令。
1.3 鎖機制
1.3.1 悲觀鎖
- 總是假設最壞情況會發生,所有操作都加鎖。
- 適用于并發沖突較高的場景。
1.3.2 樂觀鎖
- 假設沖突可能性較小,使用
WATCH
監視鍵。 - 事務執行前檢查鍵是否被修改:
WATCH
命令監視鍵。MULTI
開始事務。- 執行事務命令,如果鍵未被修改,
EXEC
運行,否則事務中止。
- 優點:提高并發性能,簡化邏輯。
- 缺點:可能出現數據不一致,重試邏輯復雜。
2. Redis配置文件(redis.conf)
2.1 網絡配置
bind 127.0.0.1
:綁定IP地址,限制訪問來源。protected-mode yes
:保護模式,防止未設置密碼時外部訪問。port 6379
:設置Redis服務端口。
2.2 通用配置
daemonize yes
:以守護進程運行。pidfile /var/run/redis_6379.pid
:指定PID文件。requirepass <password>
:設置客戶端連接密碼。loglevel notice
:設置日志級別(debug, verbose, notice, warning)。logfile ""
:指定日志文件路徑。databases 16
:設置默認數據庫數量。always-show-logo yes
:顯示Redis啟動Logo。
2.3 快照配置(RDB)
save 900 1
:在900秒內有至少1個鍵變化時觸發持久化。stop-writes-on-bgsave-error yes
:持久化錯誤時停止寫入。rdbcompression yes
:對RDB文件進行壓縮。rdbchecksum yes
:對RDB文件進行校驗。dbfilename dump.rdb
:指定RDB文件名。dir ./
:設置RDB文件存儲目錄。
2.4 客戶端限制
maxclients 10000
:設置最大客戶端連接數。
2.5 內存管理
maxmemory <bytes>
:設置最大內存限制。maxmemory-policy noeviction
:內存超出策略(默認不移除任何鍵)。
2.6 AOF配置
appendonly yes
:啟用AOF持久化。appendfilename "appendonly.aof"
:指定AOF文件名。appendfsync everysec
:設置AOF同步策略(默認每秒一次)。
3. 持久化
3.1 RDB持久化
- 快照機制:fork子進程生成RDB文件。
- 觸發機制:
- 滿足
save
規則。 - 執行
flushall
。 - 退出Redis。
- 滿足
- 恢復:Redis啟動時自動加載
dump.rdb
文件。 - 優點:
- 高效:主進程繼續處理請求。
- 恢復快:二進制文件直接加載。
- 適合備份:文件緊湊,便于存儲。
- 缺點:可能丟失最近數據。
3.2 AOF持久化
- 日志機制:記錄每個寫操作,重啟時回放。
- 優先級:高于RDB,啟動時優先加載。
- 修復工具:
redis-check-aof --fix
修復損壞的AOF文件。 - 重寫機制:
- 觸發條件:
- 文件增長到一定比例(
auto-aof-rewrite-percentage
)。 - 達到最小大小(
auto-aof-rewrite-min-size
)。
- 文件增長到一定比例(
- 優點:減少文件碎片,優化存儲。
- 觸發條件:
- 優點:
- 更高可靠性:最多丟失1秒數據。
- 緊急恢復:可手動編輯AOF文件。
- 可讀性:明確的操作日志,便于分析。
- 缺點:
- 文件較大:同等數據占用空間更大。
- 效率:比RDB慢,尤其在不同步時。
4. 訂閱/發布
4.1 概述
Redis的發布/訂閱功能用于實時消息傳輸,適用于實時數據更新的場景,如實時新聞、系統通知等。
4.2 命令說明
- 訂閱:
SUBSCRIBE channel [channel ...]
:訂閱一個或多個頻道。PSUBSCRIBE pattern [pattern ...]
:訂閱符合模式的頻道。
- 取消訂閱:
UNSUBSCRIBE [channel ...]
:取消訂閱指定頻道。PUNSUBSCRIBE [pattern ...]
:取消訂閱符合模式的頻道。
- 發布消息:
PUBLISH channel message
:向指定頻道發送消息。
4.3 使用示例
# 訂閱頻道"cht"
127.0.0.1:6379> SUBSCRIBE cht
1) "subscribe"
2) "cht"
3) (integer) 1# 發布消息
127.0.0.1:6379> PUBLISH cht "hello world"
(integer) 1# 接收到的消息:
1) "message"
2) "cht"
3) "hello world"
4.4 應用場景
- 實時更新:如實時信息展示。
- 消息隊列:用于分布式系統的消息傳遞。
- 動態通知:用戶行為觸發的實時通知。
Redis主從復制、哨兵模式及緩存問題解決策略
1. Redis主從復制
1.1 概述
Redis的主從復制功能用于實現數據的讀寫分離、數據備份和故障恢復。通過配置主從節點,可以將寫操作集中在主節點,讀操作分散到多個從節點,提升系統的整體性能和可用性。
1.2 主從復制的工作原理
-
全量復制:
- 從節點在初次連接主節點時,會觸發一次全量復制。
- 主節點執行
BGSAVE
命令生成RDB文件,并將其發送給從節點。 - 從節點加載RDB文件,初始化數據。
- 主節點記錄此時的復制偏移量和數據。
-
增量復制:
- 全量復制完成后,主節點繼續處理新的寫操作,并將這些操作記錄在復制緩沖區中。
- 從節點定期請求主節點發送增量數據,主節點根據復制偏移量,發送從節點缺少的數據。
- 從節點接收并執行這些寫操作,確保數據與主節點一致。
1.3 配置主從復制
-
設置從節點:
- 在從節點的配置文件
redis.conf
中,添加replicaof <master_ip> <master_port>
,指定主節點的IP和端口。 - 或者在Redis客戶端中執行
SLAVEOF <master_ip> <master_port>
命令。
- 在從節點的配置文件
-
驗證主從復制:
- 在主節點執行
INFO replication
命令,查看從節點的連接狀態。 - 確認從節點已經正確連接,并且數據同步完成。
- 在主節點執行
1.4 主從復制的優缺點
- 優點:
- 數據備份與冗余,避免單點故障。
- 讀寫分離,提升讀操作的吞吐量。
- 負載均衡,分散讀操作到多個從節點。
- 缺點:
- 主節點成為性能瓶頸,所有寫操作必須經過主節點。
- 數據一致性存在延遲,增量復制過程中可能出現短暫的不一致。
- 手動干預切換,主節點故障時需要人工介入,切換從節點為主節點。
2. 哨兵模式
2.1 概述
哨兵模式是在主從復制的基礎上,引入了一組哨兵進程,用于監控主節點和從節點的狀態。當主節點出現故障時,哨兵會自動將一個從節點提升為新的主節點,實現故障的自動轉移。
2.2 哨兵的工作原理
- 監控:
- 哨兵進程通過定期向主節點和從節點發送
PING
命令,監控它們的運行狀態。
- 哨兵進程通過定期向主節點和從節點發送
- 主觀下線:
- 如果節點在指定時間內未回復,哨兵會將其標記為“主觀下線”。
- 客觀下線:
- 當一定數量的哨兵進程(由
quorum
參數配置)都標記主節點為主觀下線時,主節點被判定為“客觀下線”。
- 當一定數量的哨兵進程(由
- 故障轉移:
- 哨兵集群選舉出一個領頭哨兵。
- 領頭哨兵選擇一個健康的從節點作為新的主節點。
- 更新所有從節點的復制目標,確保它們指向新的主節點。
- 通知客戶端主節點的變更,完成故障轉移。
2.3 配置哨兵
以下是一個示例的哨兵配置文件sentinel.conf
:
port 26379 # 哨兵監聽的端口
daemonize yes # 以守護進程運行
pidfile "/var/run/redis-sentinel.pid" # PID文件路徑
logfile "26379.log" # 日志文件路徑
dir "/var/tmp/redis-sentinel/data" # 工作目錄# 監控的主節點,指定主節點名稱、IP地址、端口和哨兵判定主節點下線的票數
sentinel monitor mymaster 127.0.0.1 6379 2# 主節點的密碼,如果主節點設置了密碼需要配置
sentinel auth-pass mymaster 123456# 哨兵判定主節點下線的超時時間,單位是毫秒
sentinel down-after-milliseconds mymaster 30000# 故障轉移時,允許并行同步的從節點個數,默認是1
sentinel parallel-syncs mymaster 1# 故障轉移超時時間,單位是毫秒
sentinel failover-timeout mymaster 180000# 是否允許通過腳本配置重新配置客戶端
sentinel deny-scripts-reconfig yes
2.4 簡單部署
redis 使用 Docker 部署 Redis 集群(包括哨兵機制)-CSDN博客
2.5?哨兵的優缺點
- 優點:
- 自動故障轉移,減少人工干預。
- 監控與通知,及時發現和處理問題。
- 提高系統的高可用性和穩定性。
- 缺點:
- 配置較為復雜,增加了維護成本。
- 增加資源開銷,需要額外的服務器運行哨兵進程。
- 單點故障隱患,哨兵本身也可能成為潛在的單點故障。
3. 緩存穿透、擊穿與雪崩問題及解決策略
3.1 緩存穿透
- 問題描述:
- 用戶頻繁查詢不存在的數據,導致請求直接打到數據庫,增加數據庫負擔,影響性能。
- 解決方法:
- 緩存空對象:
- 在數據庫未找到數據時,向緩存中設置一個空對象,設置較短的過期時間,避免占用過多內存。
- 布隆過濾器:
- 使用布隆過濾器過濾不存在的數據,減少對數據庫的無效查詢。
- 參數校驗:
- 對用戶輸入的參數進行嚴格的校驗,防止惡意請求或爬蟲攻擊。
- 緩存空對象:
3.2 緩存擊穿
- 問題描述:
- 熱點數據過期后,大量并發請求直接訪問數據庫,導致數據庫壓力驟增。
- 解決方法:
- 設置熱點數據永不過期:
- 對于某些熱點數據,可以配置為永不過期,確保這些數據始終在緩存中。
- 互斥鎖:
- 使用分布式鎖(如Redis的
SETNX
命令),確保只有一個請求能訪問數據庫,其余請求等待,防止數據庫被壓垮。
- 使用分布式鎖(如Redis的
- 后臺刷新:
- 開啟后臺線程,定期更新熱點數據的緩存,避免因緩存失效導致的并發請求。
- 分級緩存:
- 使用多級緩存策略,如一級緩存和二級緩存,確保數據在多級緩存中有效,減少對數據庫的直接訪問。
- 設置熱點數據永不過期:
3.3 緩存雪崩
- 問題描述:
- 大量緩存同時過期,導致短時間內有大量請求直接打到數據庫,可能引起數據庫宕機。
- 解決方法:
- 隨機過期時間:
- 在設置緩存過期時間時,加上一個隨機的時間值,避免大量緩存集中過期。
- 互斥鎖或隊列:
- 使用互斥鎖或隊列控制對數據庫的并發訪問,防止大量請求同時訪問數據庫。
- 二級緩存:
- 建立二級緩存層,當主緩存失效時,從二級緩存中獲取數據,減少對數據庫的壓力。
- 數據預熱:
- 在緩存過期前,主動刷新和更新緩存,確保熱點數據始終存在于緩存中。
- 監控與預警:
- 實時監控緩存的命中率和請求量,及時發現潛在的問題,提前采取措施。
- 隨機過期時間: