一、Redis 安裝
Linux 系統安裝
-
通過包管理器安裝 (以 Ubuntu 為例):
sudo apt update sudo apt install redis-server
-
從源碼編譯安裝:
wget https://download.redis.io/redis-stable.tar.gz tar -xzvf redis-stable.tar.gz cd redis-stable make sudo make install
Windows 安裝
Windows 官方不支持 Redis,但可以使用:
- Microsoft 維護的 Windows 版本: https://github.com/microsoftarchive/redis
- 使用 WSL (Windows Subsystem for Linux)
- 使用 Docker 容器
二、Redis 配置
主要配置文件
Redis 配置文件通常位于 /etc/redis/redis.conf
(Linux) 或安裝目錄中。
常用配置項
# 綁定IP地址,默認只允許本地訪問
bind 127.0.0.1# 端口號
port 6379# 是否以守護進程運行
daemonize yes# 數據持久化設置
save 900 1 # 900秒內有1次修改就保存
save 300 10 # 300秒內有10次修改就保存
save 60 10000 # 60秒內有10000次修改就保存# 數據文件存儲位置
dir /var/lib/redis# 日志文件位置
logfile /var/log/redis/redis-server.log# 設置密碼
requirepass yourpassword# 最大內存限制
maxmemory 100mb# 內存滿時的策略
maxmemory-policy allkeys-lru
配置生效
修改配置后需要重啟 Redis 服務:
sudo systemctl restart redis-server # 系統服務方式
或
redis-server /path/to/redis.conf # 直接指定配置文件啟動
三、Redis 基本使用
啟動 Redis
redis-server # 使用默認配置啟動
redis-server /path/to/redis.conf # 指定配置文件啟動
連接 Redis
redis-cli # 本地連接
redis-cli -h host -p port -a password # 遠程連接
基本命令示例
# 字符串操作
SET key value
GET key# 哈希操作
HSET user:1000 name "John Doe" age 30
HGETALL user:1000# 列表操作
LPUSH mylist a
RPUSH mylist b
LRANGE mylist 0 -1# 集合操作
SADD myset a b c
SMEMBERS myset# 有序集合操作
ZADD leaderboard 100 "player1" 200 "player2"
ZRANGE leaderboard 0 -1 WITHSCORES# 鍵操作
KEYS *
DEL key
EXPIRE key 60 # 設置60秒過期
TTL key # 查看剩余生存時間
持久化操作
SAVE # 同步保存數據到磁盤
BGSAVE # 異步保存數據到磁盤
四、Redis 高級特性
事務
MULTI
SET key1 value1
SET key2 value2
EXEC
發布/訂閱
# 終端1: 訂閱頻道
SUBSCRIBE news# 終端2: 發布消息
PUBLISH news "Hello World"
Lua 腳本
EVAL "return redis.call('GET', KEYS[1])" 1 mykey
五、Redis 管理
查看服務器信息
INFO # 查看所有信息
INFO memory # 查看內存相關信息
INFO stats # 查看統計信息
性能測試
redis-benchmark -n 100000 -c 100
安全建議
- 設置密碼 (requirepass)
- 重命名或禁用危險命令 (如 FLUSHALL, CONFIG)
rename-command FLUSHALL "" rename-command CONFIG "CONFIG-9b7d4e5f"
- 綁定特定IP,不要使用 0.0.0.0
- 使用防火墻限制訪問
六、Redis 集群
主從復制
# 從服務器配置
replicaof 192.168.1.100 6379
masterauth yourpassword
Redis Cluster
- 創建集群:
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \ --cluster-replicas 1
- 連接集群:
redis-cli -c -p 7000
七、常見問題解決
-
內存不足:
- 設置 maxmemory 和 maxmemory-policy
- 使用適當的數據類型減少內存占用
-
性能問題:
- 避免使用 KEYS 命令,用 SCAN 代替
- 使用管道(pipeline)減少網絡往返
-
持久化問題:
- 確保有足夠的磁盤空間
- 根據業務需求調整 save 配置
八、Redis 的主要特點
Redis 是一個高性能的內存鍵值數據庫,支持多種數據結構,廣泛應用于緩存、消息隊列、實時分析等場景。以下是 Redis 的主要特點、使用場景以及性能指標數據:
-
高性能:
- 單實例 QPS(每秒查詢數)可達 18萬(騰訊云 Redis 8.0),讀寫延遲低于 100μs。
- 相比傳統數據庫,Redis 能處理 110,000 次讀取/秒 和 81,000 次寫入/秒。
-
支持多種數據結構:
- 字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)。
- 高級數據結構:位圖(Bitmap)、HyperLogLog(基數統計)、地理空間索引(Geo)、流(Stream)。
-
持久化機制:
- RDB(快照):定時保存數據到磁盤。
- AOF(日志):記錄所有寫操作,保證數據安全。
-
高可用與分布式:
- 主從復制(Replication)實現數據備份。
- Redis Sentinel 提供自動故障轉移。
- Redis Cluster 支持數據分片,適用于大規模數據存儲。
-
原子性操作:
- 所有 Redis 操作都是原子性的,適合計數器、排行榜等場景。
九、Redis 的使用場景
-
緩存:
- 減輕數據庫壓力,提高響應速度(如電商商品詳情緩存)。
- 騰訊云 Redis 8.0 在電商熱詞統計場景下,延遲 <5ms,QPS >18萬。
-
會話存儲(Session Storage):
- 存儲用戶登錄狀態,支持分布式 Web 應用。
-
排行榜/計數器:
- 使用 Sorted Set 實現游戲排行榜、商品銷量排行等。
-
消息隊列:
- 利用 List 或 Stream 實現異步任務處理(如訂單隊列)。
-
實時數據分析:
- 使用 HyperLogLog 統計 UV(獨立訪客),或 BitMap 記錄用戶簽到。
-
分布式鎖:
- 通過
SETNX
實現分布式環境下的資源互斥訪問。
- 通過
-
地理位置服務:
- 使用 Geo 數據結構存儲經緯度,支持附近的人查詢。
-
AI 與向量搜索:
- Redis 8.2 支持 SVS-VAMANA 向量索引,適用于 AI 推理和高維數據檢索。
十、Redis 性能指標對比
指標 | 騰訊云 Redis 8.0 | 阿里云 Redis 7.0 | 華為云 GaussDB Cache |
---|---|---|---|
隨機讀延遲 | <100μs | 150μs | 180μs |
單實例 QPS | 18萬 | 12萬 | 10萬 |
主從故障恢復(RTO) | <10秒 | 30秒 | <30秒 |
冷數據存儲成本 | 0.024元/GB/月 | 0.034元/GB/月 | - |
十一、編程開發(1):使用 hiredis(官方 C 客戶端)
安裝 hiredis
sudo apt-get install libhiredis-dev # Ubuntu
brew install hiredis # macOS
示例代碼
#include <hiredis/hiredis.h>
#include <iostream>int main() {// 1. 連接 RedisredisContext *c = redisConnect("127.0.0.1", 6379);if (c == nullptr || c->err) {if (c) {std::cerr << "Connection error: " << c->errstr << std::endl;redisFree(c);} else {std::cerr << "Can't allocate redis context" << std::endl;}return 1;}// 2. 執行 SET 命令redisReply *reply = (redisReply *)redisCommand(c, "SET foo bar");freeReplyObject(reply);// 3. 執行 GET 命令reply = (redisReply *)redisCommand(c, "GET foo");if (reply->type == REDIS_REPLY_STRING) {std::cout << "GET foo: " << reply->str << std::endl;}freeReplyObject(reply);// 4. 執行 HSET/HGET (哈希操作)redisCommand(c, "HSET user:1000 name John age 30");reply = (redisReply *)redisCommand(c, "HGET user:1000 name");std::cout << "HGET name: " << reply->str << std::endl;freeReplyObject(reply);// 5. 關閉連接redisFree(c);return 0;
}
編譯運行
g++ -std=c++11 redis_demo.cpp -lhiredis -o redis_demo
./redis_demo
十二、編程開發(2):使用 redis-plus-plus(推薦,現代 C++ 封裝)
安裝 redis-plus-plus
git clone https://github.com/sewenew/redis-plus-plus.git
cd redis-plus-plus
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
sudo make install
示例代碼
#include <sw/redis++/redis++.h>
#include <iostream>int main() {try {// 1. 創建 Redis 連接sw::redis::Redis redis("tcp://127.0.0.1:6379");// 2. 字符串操作redis.set("foo", "bar");auto val = redis.get("foo");if (val) {std::cout << "GET foo: " << *val << std::endl;}// 3. 哈希操作redis.hset("user:1000", { {"name", "John"}, {"age", "30"} });auto name = redis.hget("user:1000", "name");if (name) {std::cout << "HGET name: " << *name << std::endl;}// 4. 列表操作redis.rpush("mylist", {"a", "b", "c"});auto list = redis.lrange("mylist", 0, -1);for (const auto &item : list) {std::cout << "List item: " << item << std::endl;}// 5. 發布/訂閱auto sub = redis.subscriber();sub.on_message([](std::string channel, std::string msg) {std::cout << "Received message: " << msg << " from channel: " << channel << std::endl;});sub.subscribe("news");sub.consume(); // 需要在另一個線程運行} catch (const sw::redis::Error &e) {std::cerr << "Redis error: " << e.what() << std::endl;}return 0;
}
編譯運行
g++ -std=c++11 redis_plus_plus_demo.cpp -lredis++ -lhiredis -pthread -o redis_plus_plus_demo
./redis_plus_plus_demo
2個SDK功能對比
功能 | hiredis | redis-plus-plus |
---|---|---|
易用性 | 低(C 風格) | 高(C++ 封裝) |
線程安全 | 否 | 是 |
支持數據結構 | 基礎 | 全量(STL 風格) |
性能 | 最高 | 接近 hiredis |
推薦場景 | 極致性能需求 | 一般 C++ 項目 |
常見問題
- 連接超時:檢查 Redis 服務器是否運行 (
redis-cli ping
)。 - 內存泄漏:
hiredis
需手動釋放redisReply
。 - 線程安全:
hiredis
非線程安全,redis-plus-plus
是線程安全的。
推薦優先使用 redis-plus-plus,除非你需要極致的性能控制。