.NET 8.0 Redis 教程

一、环境准备

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()
    {
        // 连接到本地 Redis
        using 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);
相关推荐
瑶总迷弟7 小时前
银河麒麟 V10 ARM64 安装 Oracle 19c 静默部署操作手册
数据库·oracle
IsITGirl7 小时前
VMware Fusion(Mac)Windows ARM 虚拟机 NAT (vmnet8) 报错解决记录
windows·macos·.net·桥接模式
飞浪纪元[FWC–FE]7 小时前
Qt 工程创建与 CMake / qmake 构建规范
开发语言·数据库·qt
Ivanqhz7 小时前
MoE + LLM 应用
数据库·人工智能·pytorch·python·深度学习·算法·1024程序员节
我不会起名字3227 小时前
Redis pipeline 用了反而更慢:3 类误用与正确的批量姿势
redis·pipeline·lua·rtt·批量
Tsuki_tl7 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
Gauss松鼠会7 小时前
GaussDB 整体架构解析
运维·服务器·网络·数据库·sql·架构·gaussdb
系统集成-鹰翔8 小时前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
西瓜拿铁好喝8 小时前
开源和闭源 AI 办公工具,分别适合谁
java·前端·数据库
代码派8 小时前
业务不停机迁移 MySQL 到 TiDB,NineData 数据增量同步实操演示
数据库·mysql·tidb·ninedata·无停机迁移·增量迁移·全量迁移