文章目錄
- 一、初識 Redis
- 1.1 Redis 概述
- 1. Redis 簡介
- 2. Redis 的發展歷程
- 1.2 Redis 核心特性
- 1. 高性能
- 2. 豐富的數據類型
- 3. 持久化
- 4. 原子操作
- 5. 主從復制
- 6. 高可用性與分布式
- 7. 內存存儲與低延遲
- 8. 靈活的過期策略
- 9. 事務支持
- 10. 簡單的 API
- 總結
- 1.3 Redis 應用場景
- Redis 適用場景
- Redis 不適用場景
- 1.4 Redis 版本
- 二、Redis 安裝與基礎操作
- 2.1 安裝 Redis
- 2.2 支持遠程連接
- 2.3 Redis 基礎控制
- 三、Redis 重要文件 & 作用
- 3.1 工具 & 腳本
- 3.2 配置文件
- 3.3 持久化文件存儲目錄
- 3.4 日志文件目錄
- 四、Redis 命令行客戶端
- 4.1 連接Redis服務器的兩種模式
- 1. 交互式連接(推薦用于日常操作)
- 2. 命令行模式(適合腳本調用)
- 4.2 連接參數簡化技巧
- 4.3 高級連接技巧
- 4.4 連接問題排查
一、初識 Redis
1.1 Redis 概述
1. Redis 簡介
Redis(Remote Dictionary Server) 是一款高性能的 鍵值存儲(Key-Value Store) 數據庫,屬于 NoSQL 數據庫的一種。相較于傳統鍵值數據庫,Redis 的核心優勢在于其支持 多種數據結構,包括:
- String(字符串)
- Hash(哈希表)
- List(列表)
- Set(集合)
- Sorted Set(有序集合)
- Bitmaps(位圖)
- HyperLogLog(基數統計)
- GEO(地理空間索引)
由于 Redis 數據主要存儲在內存中,其讀寫性能極高(可達 10萬+ QPS)。同時,Redis 提供 持久化機制(RDB 快照和 AOF 日志),確保數據在宕機或故障時不會丟失。
此外,Redis 還支持:
- 鍵過期(Key Expiration)
- 發布訂閱(Pub/Sub)
- 事務(Transactions)
- 流水線(Pipeline)
- Lua 腳本(Lua Scripting)
2. Redis 的發展歷程
- 2008 年:Redis 由 Salvatore Sanfilippo(@antirez) 開發,最初用于優化其項目 LLOOGG 的隊列性能(替代 MySQL)。
- 2009 年:Redis 1.0 開源發布,迅速獲得廣泛關注。
- 至今:Redis 已成為全球最受歡迎的 內存數據庫 之一,被眾多 大型互聯網公司 采用。
1.2 Redis 核心特性
- MySQL 主要通過 表 存儲數據,“關系型數據庫”
- Redis 通過 鍵值對 存儲數據,“非關系型數據庫”
根據官方的介紹,Redis 具有以下特性和優點:
1. 高性能
- Redis 提供極高的讀寫性能,能在毫秒級的時間內完成數據操作。
- 支持單線程架構,利用事件循環處理多個客戶端請求,避免了上下文切換的開銷。
- 從網絡角度上,Redis 使用了IO多路復用的機制(epoll)
- Redis是C語言開發的,從某種程度上也減少了延遲以及提高了處理速度
2. 豐富的數據類型
- 除了傳統的鍵值對數據存儲,Redis 支持多種復雜的數據類型,如:
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
- 位圖(Bitmap)
- HyperLogLog(用于基數統計)
- 地理空間(Geospatial)
3. 持久化
- Redis 提供了兩種持久化機制:
- RDB(Redis 數據庫快照):通過定期將數據保存到磁盤中來持久化數據。
- AOF(追加文件):每次對 Redis 進行寫操作時,將操作命令追加到日志文件中。
- 這兩種方式可以結合使用,以確保數據的持久性和高可用性。
4. 原子操作
- Redis 提供對數據的原子操作支持,確保在并發情況下,數據的修改不會發生沖突或不一致。
5. 主從復制
- Redis 支持主從復制機制,可以通過復制將數據同步到多個從節點,從而提高數據的可用性與讀取性能。
6. 高可用性與分布式
- Redis 通過 Redis Sentinel 實現高可用性,能夠自動故障轉移(failover),保證系統的持續可用性。
- Redis Cluster 支持分布式部署,可以自動分片(sharding),以支持大規模的數據存儲。
7. 內存存儲與低延遲
- Redis 完全基于內存(RAM)操作,具有極低的延遲。
- 適用于高頻的讀寫操作,如實時應用程序、緩存等。
8. 靈活的過期策略
- Redis 支持鍵值對的過期時間設置,可以自動刪除過期的數據。
- 支持 LRU(Least Recently Used)算法來清除最少使用的鍵,幫助控制內存使用。
9. 事務支持
- Redis 提供了事務機制,支持 MULTI、EXEC、WATCH 等命令來實現一組操作的原子執行。
10. 簡單的 API
- Redis 提供了非常簡單直觀的 API,易于集成和使用,支持多種編程語言,如 Python、Java、C、Go 等。
總結
下圖是總結了Redis的核心功能:
- 速度快:由于是內存數據庫,讀取速度極快。
- 數據結構豐富:支持多種數據結構,能夠滿足不同場景的需求。
- 高可用性:通過復制和故障轉移機制確保系統的高可用性。
- 易于擴展:支持分片和分布式架構,能輕松擴展為大規模分布式系統。
- 靈活性強:支持多種持久化方案和過期策略。
1.3 Redis 應用場景
Redis 適用場景
-
緩存
- Web緩存:Redis 常被用作緩存系統,以提高Web應用的響應速度和減輕數據庫的負載。它通過存儲熱數據,避免重復查詢數據庫。
- 頁面緩存:可以將渲染過的頁面存儲在 Redis 中,從而快速返回給用戶,減少服務器端渲染負擔。
- 數據庫查詢結果緩存:將數據庫查詢結果緩存在 Redis 中,避免對數據庫的重復查詢,減少數據庫負載。
-
會話存儲(Session Store)
- Redis 常被用作會話存儲,尤其是在處理大量用戶會話時。由于 Redis 支持鍵值對存儲和高效的過期策略,非常適合存儲用戶會話數據。
- 它能支持高并發的讀寫,并且提供自動過期功能,確保會話數據能在合理時間后自動清理。
-
實時數據分析
- Redis 的快速讀寫能力使它非常適合做實時數據分析。例如,使用 Redis 存儲網站的實時訪問數據、用戶活動數據等。
- 計數器:利用 Redis 的自增操作,可以很方便地實現點擊計數、PV(頁面瀏覽量)和 UV(獨立訪客數)等功能。
- 實時流數據處理:借助 Redis 的 列表 和 集合 等數據結構,可以實時處理和分析大量流數據。
-
排行榜/計分系統
- 有序集合(Sorted Set) 是 Redis 的一項強大功能,非常適合實現排行榜和計分系統。通過有序集合,可以高效地存儲并排序用戶分數。
- 常見應用如在線游戲的排行榜、社交平臺的用戶積分等。
-
消息隊列(Message Queue)
- Redis 可以作為高效的消息隊列系統,支持 發布/訂閱(Pub/Sub) 模式以及 列表 結構作為隊列實現。
- 它可以用來在分布式系統中進行異步任務處理、事件通知等場景。其快速的生產者/消費者模型能夠實現低延遲的消息傳遞。
-
實時聊天系統
- Redis 的發布/訂閱模型(Pub/Sub)常常用于實現實時消息推送系統。通過 Redis,用戶可以在不同的聊天室中實時交換消息。
- 該功能非常適合社交應用、即時通訊工具、在線客服等場景。
-
隊列任務系統
- Redis 的列表(List)數據結構非常適合用來實現任務隊列,支持 LPUSH 和 RPOP 等原子操作,可以高效地進行任務的推送和消費。
- 例如,后臺任務處理、異步任務分發等場景。
-
分布式鎖
- 在分布式系統中,Redis 可以作為分布式鎖的實現方式。通過 Redis 提供的 SETNX 命令,多個進程可以競爭獲取鎖,確保資源在同一時刻只被一個進程訪問。
- 這種鎖的機制可廣泛應用于分布式系統中的資源控制、事務管理等場景。
Redis 不適用場景
站在數據規模的角度看,數據可以分為大規模數據和小規模數據;我們知道 Redis 的數據是存在內存中的,如果數據量過于大的情況下,使用Redis經濟成分很高(內存的價格遠高于磁盤)
站在數據冷熱的角度看,數據分為熱數據與冷數據;熱數據通常指需要頻繁操作的數據,反之為冷數據,對于一個視頻網站來說,視頻的基本信息就屬于熱數據,用戶觀看記錄一般情況下不會經常訪問,屬于冷數據。
如果將這些冷數據放在Redis中,就浪費了其內存空間。這些冷數據就不適合放在Redis中。
即將那些要經常被訪問的數據放到內存中,而不經常被訪問的放在磁盤中存儲。
1.4 Redis 版本
Redis 借鑒了 Linux 操作系統的版本號命名規則:如果版本號的第二位是奇數,則表示該版本為非穩定版本(例如 2.7、2.9、3.1);如果是偶數,則為穩定版本(例如 2.6、2.8、3.0、3.2)。當前的奇數版本是下一個穩定版本的開發版本,例如 2.9 是 3.0 版本的開發版本。因此,生產環境通常選擇偶數版本的 Redis。如果希望提前體驗新的特性,可以選擇最新的奇數版本。
二、Redis 安裝與基礎操作
下面相關的安裝與操作部分主要以Ubuntu系統為主進行介紹:
2.1 安裝 Redis
- 在 Ubuntu 系統中,直接使用 apt 安裝即可:
apt install redis -y # -y 自動確認安裝過程中的提示
- Windows 系統安裝reids:
- https://github.com/tporadowski/redis/releases
- 進入github對應的目錄下,直接下載壓縮包或安裝包msi
- 安裝后reids目錄內容如下:
2.2 支持遠程連接
- Ubuntu 系統 修改
/etc/redis/redis.conf
- 修改
bind 127.0.0.1
為bind 0.0.0.0
- 修改
protected-mode yes
改為protected-mode no
- Windows 系統修改下載目錄下的
redis.windows-service.conf
2.3 Redis 基礎控制
-
啟動 Redis 服務
service redis-server start
-
停止 Redis 服務
service redis-server stop
-
重啟 Redis 服務
service redis-server restart
三、Redis 重要文件 & 作用
3.1 工具 & 腳本
下面是一些Redis中重要的工具與腳本,用于服務器的管理、性能測試、監控、數據文件的檢查與修復等功能:
文件路徑 | 解釋 | 作用 |
---|---|---|
/usr/bin/redis-benchmark | Redis 基準測試工具 | 用于測試 Redis 服務器性能。可以模擬大量并發操作來評估 Redis 的性能表現。 |
/usr/bin/redis-check-aof | AOF 文件檢查工具 | 用于檢查和修復 Redis 的 AOF(追加文件)日志。如果 Redis 崩潰或數據不一致,可以使用它來檢查和修復 AOF 文件。 |
/usr/bin/redis-check-rdb | RDB 文件檢查工具 | 用于檢查和修復 Redis 的 RDB(數據庫快照)文件。如果 RDB 文件損壞或不完整,可以使用該工具進行修復。 |
/usr/bin/redis-cli | Redis 命令行客戶端 | 通過命令行連接到 Redis 服務器,允許用戶發送 Redis 命令進行交互、管理 Redis 實例。 |
/usr/bin/redis-sentinel | Redis Sentinel 監控工具 | 用于管理 Redis 集群的高可用性。它監控主服務器的健康狀態,并在主服務器發生故障時,自動切換到備用服務器。 |
/usr/bin/redis-server | Redis 服務器啟動程序 | 啟動 Redis 服務器實例,處理所有客戶端的請求并執行數據存儲和查詢操作。 |
/usr/libexec/redis-shutdown | Redis 關閉服務腳本 | 用于優關閉 Redis 服務器,確保數據被正確保存并釋放資源。 |
3.2 配置文件
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/redis.conf
是 Redis 服務器的配置文件。/etc/redis-sentinel.conf
是 Redis Sentinel 的配置文件。
3.3 持久化文件存儲目錄
/var/lib/redis/
Redis 持久化生產的 RDB 和 AOF ?件都默認生成于該目錄下。
3.4 日志文件目錄
/var/log/redis/
該目錄下會保存 Redis 運行期間 產生的日志文件,默認按照天數進行分割,并會將一定日期的日期文件使用gzip格式壓縮保存。
四、Redis 命令行客戶端
Redis客戶端與服務端的交互過程如下圖:
4.1 連接Redis服務器的兩種模式
1. 交互式連接(推薦用于日常操作)
連接命令格式:
redis-cli -h {host} -p {port}
典型使用場景:
- 需要連續執行多個命令
- 調試和開發環境
- 需要查看命令返回值的場景
操作示例:
$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> ping # 測試連接
PONG
127.0.0.1:6379> set user:1001 "張三" # 設置鍵值
OK
127.0.0.1:6379> get user:1001 # 獲取值
"張三"
127.0.0.1:6379> info memory # 查看內存信息
2. 命令行模式(適合腳本調用)
命令格式:
redis-cli -h {host} -p {port} {command}
適用場景:
- Shell腳本中調用Redis命令
- 需要直接獲取命令結果的場景
- 自動化任務執行
使用示例:
$ redis-cli ping # 測試連接
PONG
$ redis-cli set counter 100 # 設置值
OK
$ redis-cli incr counter # 原子遞增
(integer) 101
$ redis-cli --raw get counter # 原始格式輸出
101
4.2 連接參數簡化技巧
默認連接配置:
- 當連接本地服務器(127.0.0.1)和默認端口(6379)時,可省略參數:
redis-cli # 等同于 redis-cli -h 127.0.0.1 -p 6379
常用連接選項:
參數 | 說明 | 示例 |
---|---|---|
-a | 認證密碼 | redis-cli -a password |
-n | 選擇數據庫 | redis-cli -n 1 |
–raw | 原始格式輸出 | redis-cli --raw get key |
–stat | 實時監控 | redis-cli --stat |
4.3 高級連接技巧
1. 批量命令執行
$ redis-cli <<EOF
SET user:1002 "李四"
EXPIRE user:1002 3600
GET user:1002
EOF
2. 管道操作(提升批量操作性能)
$ echo -e "SET key1 value1\nGET key1" | redis-cli --pipe
3. TLS安全連接(Redis 6.0+)
redis-cli --tls --cert ./redis.crt --key ./redis.key
4.4 連接問題排查
常見錯誤處理:
-
連接拒絕:
$ redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused
解決方案:
- 確認Redis服務已啟動:
ps aux | grep redis
- 檢查防火墻設置
- 確認Redis服務已啟動:
-
認證失敗:
(error) NOAUTH Authentication required
解決方案:
redis-cli -a yourpassword
-
連接超時:
解決方案:redis-cli -h remote_host --timeout 5