一、環境準備
1. 安裝 Redis 服務器
- Windows/macOS/Linux:使用 Docker 快速部署
bash
docker run -d --name redis -p 6379:6379 redis
- Linux:直接安裝
bash
sudo apt-get install redis-server sudo systemctl start redis-server
2. 創建 .NET 項目
bash
dotnet new console -n RedisTutorial
cd RedisTutorial
3. 安裝 NuGet 包
bash
dotnet add package StackExchange.Redis
二、基礎操作:連接與數據讀寫
1. 連接 Redis
csharp
using StackExchange.Redis;class Program
{static void Main(){// 連接到本地 Redisusing var redis = ConnectionMultiplexer.Connect("localhost:6379");IDatabase db = redis.GetDatabase();Console.WriteLine("Redis 連接成功!");}
}
2. 基本數據類型操作
字符串(String)
csharp
// 寫入
db.StringSet("name", "John Doe");// 讀取
string name = db.StringGet("name");
Console.WriteLine($"Name: {name}");// 自增計數
db.StringIncrement("counter");
哈希(Hash)
csharp
// 寫入
db.HashSet("user:1", new HashEntry[] {new HashEntry("age", 30),new HashEntry("email", "john@example.com")
});// 讀取
string email = db.HashGet("user:1", "email");
列表(List)
csharp
// 左側插入
db.ListLeftPush("tasks", "task1");
db.ListLeftPush("tasks", "task2");// 獲取列表
RedisValue[] tasks = db.ListRange("tasks");
集合(Set)
csharp
// 添加元素
db.SetAdd("tags", new RedisValue[] { "C#", ".NET", "Redis" });// 判斷元素是否存在
bool hasDotNet = db.SetContains("tags", ".NET");
三、進階操作:過期時間與事務
1. 設置 Key 過期時間
csharp
// 寫入時設置 10 分鐘過期
db.StringSet("cache:data", "value", TimeSpan.FromMinutes(10));// 為已存在的 key 設置過期
db.KeyExpire("counter", TimeSpan.FromHours(1));// 檢查剩余過期時間
TimeSpan? ttl = db.KeyTimeToLive("cache:data");
2. 事務操作
csharp
var transaction = db.CreateTransaction();// 批量操作
transaction.StringSetAsync("key1", "value1");
transaction.StringSetAsync("key2", "value2");// 執行事務
bool committed = await transaction.ExecuteAsync();
四、高級特性:發布訂閱與分布式鎖
1. 發布訂閱(Pub/Sub)
發布者:
csharp
var subscriber = redis.GetSubscriber();
subscriber.Publish("news", "Hello, Redis!");
訂閱者:
csharp
var subscriber = redis.GetSubscriber();
subscriber.Subscribe("news", (channel, message) => {Console.WriteLine($"收到消息: {message}");
});
2. 分布式鎖
csharp
// 獲取鎖(嘗試 10 秒,持有 30 秒)
bool locked = db.LockTake("resource:lock", Environment.MachineName, TimeSpan.FromSeconds(30));if (locked)
{try{// 執行臨界區代碼}finally{// 釋放鎖db.LockRelease("resource:lock", Environment.MachineName);}
}
五、連接配置最佳實踐
1. 配置連接選項
csharp
var options = ConfigurationOptions.Parse("localhost:6379");
options.AbortOnConnectFail = false;
options.ConnectRetry = 3;
options.SyncTimeout = 5000; // 5 秒超時using var redis = ConnectionMultiplexer.Connect(options);
2. 連接池管理
csharp
// 使用連接池(根據并發量調整大小)
options.PoolSize = 50;
六、實戰案例:緩存實現
1. 緩存優先模式
csharp
string GetDataFromCache(string key)
{// 1. 先從緩存獲取string cacheData = db.StringGet(key);if (!string.IsNullOrEmpty(cacheData)){return cacheData;}// 2. 緩存未命中,從數據庫獲取string dbData = FetchFromDatabase(key);// 3. 寫入緩存(設置 5 分鐘過期)db.StringSet(key, dbData, TimeSpan.FromMinutes(5));return dbData;
}
2. 緩存失效策略
csharp
// 主動更新緩存
async Task RefreshCache(string key)
{string newData = FetchFromDatabase(key);await db.StringSetAsync(key, newData, TimeSpan.FromMinutes(5));
}
七、性能優化與監控
1. 性能優化技巧
- 使用異步方法(如?
StringSetAsync
) - 批量操作(Batch/Transaction)
- 合理設置超時參數
- 使用連接池
2. 監控 Redis
csharp
// 獲取服務器信息
var server = redis.GetServer("localhost", 6379);
var info = server.Info();// 打印內存使用情況
Console.WriteLine($"內存使用: {info["memory"]["used_memory_human"]}");
八、常見問題處理
1. 連接超時
- 增加?
ConnectTimeout
?和?SyncTimeout
- 檢查 Redis 服務器負載
2. 緩存穿透
- 緩存空值:
csharp
if (dbData == null) {db.StringSet(key, "", TimeSpan.FromMinutes(1)); // 短暫緩存空值 }
3. 緩存雪崩
- 為不同 key 設置隨機過期時間:
csharp
var randomExpiry = TimeSpan.FromMinutes(5 + new Random().Next(10)); db.StringSet(key, value, randomExpiry);