C# 使用 CSRedisCore指南

C# 使用 CSRedisCore指南

CSRedisCore 是一个功能强大的 .NET Redis 客户端。以下是详细的使用指南:

1. 安装

首先通过 NuGet 安装 CSRedisCore:

bash 复制代码
dotnet add package CSRedisCore

2. 基本配置

单节点 Redis 配置

csharp 复制代码
using CSRedis;

// 创建 Redis 客户端实例
var redis = new CSRedisClient("127.0.0.1:6379,password=yourpassword,defaultDatabase=0");

// 设置为全局实例(推荐)
RedisHelper.Initialization(redis);

哨兵模式配置

csharp 复制代码
var redis = new CSRedisClient(
    "mymaster,password=123456",
    new[] { "192.168.1.10:26379", "192.168.1.11:26379", "192.168.1.12:26379" });

RedisHelper.Initialization(redis);

集群模式配置

csharp 复制代码
var redis = new CSRedisClient(
    "127.0.0.1:6379,password=123456,defaultDatabase=0",
    "127.0.0.1:6380,password=123456,defaultDatabase=0",
    "127.0.0.1:6381,password=123456,defaultDatabase=0");

RedisHelper.Initialization(redis);

3. 基本使用

字符串操作

csharp 复制代码
// 设置值
RedisHelper.Set("name", "张三");
RedisHelper.Set("age", 25, TimeSpan.FromMinutes(10)); // 带过期时间

// 获取值
string name = RedisHelper.Get("name");
int age = RedisHelper.Get<int>("age");

// 批量操作
RedisHelper.MSet("key1", "value1", "key2", "value2");
var values = RedisHelper.MGet<string>("key1", "key2");

// 原子操作
long newValue = RedisHelper.IncrBy("counter", 1);

哈希操作

csharp 复制代码
// 设置哈希字段
RedisHelper.HSet("user:1", "name", "李四");
RedisHelper.HSet("user:1", "age", 30);

// 获取哈希字段
string userName = RedisHelper.HGet<string>("user:1", "name");
int userAge = RedisHelper.HGet<int>("user:1", "age");

// 获取所有字段
var allFields = RedisHelper.HGetAll<string>("user:1");

// 批量设置
RedisHelper.HMSet("user:2", new Dictionary<string, object>
{
    ["name"] = "王五",
    ["age"] = 28,
    ["email"] = "wangwu@example.com"
});

列表操作

csharp 复制代码
// 添加元素
RedisHelper.LPush("mylist", "item1");
RedisHelper.RPush("mylist", "item2", "item3");

// 获取元素
string firstItem = RedisHelper.LPop<string>("mylist");
string lastItem = RedisHelper.RPop<string>("mylist");

// 获取范围
var items = RedisHelper.LRange<string>("mylist", 0, -1);

集合操作

csharp 复制代码
// 添加成员
RedisHelper.SAdd("myset", "member1", "member2", "member3");

// 获取所有成员
var members = RedisHelper.SMembers<string>("myset");

// 判断成员是否存在
bool exists = RedisHelper.SIsMember("myset", "member1");

// 集合运算
RedisHelper.SInterStore("result_set", "set1", "set2");

有序集合操作

csharp 复制代码
// 添加成员和分数
RedisHelper.ZAdd("leaderboard", 
    (100, "player1"),
    (85, "player2"),
    (95, "player3")
);

// 获取排名
var topPlayers = RedisHelper.ZRange<string>("leaderboard", 0, 2);
var topPlayersWithScores = RedisHelper.ZRangeWithScores<string>("leaderboard", 0, 2);

// 获取成员排名
long rank = RedisHelper.ZRevRank("leaderboard", "player1");

4. 高级功能

发布订阅

csharp 复制代码
// 订阅
var sub = RedisHelper.Subscribe(("channel1", msg => 
{
    Console.WriteLine($"收到消息: {msg.Body}");
}));

// 发布
RedisHelper.Publish("channel1", "Hello, Redis!");

// 取消订阅
sub.Unsubscribe();

管道操作

csharp 复制代码
// 使用管道批量执行命令
var pipe = RedisHelper.StartPipe();
pipe.Set("key1", "value1");
pipe.Set("key2", "value2");
pipe.IncrBy("counter", 1);
object[] results = pipe.EndPipe();

事务操作

csharp 复制代码
var tran = RedisHelper.Multi();
tran.Set("key1", "value1");
tran.Set("key2", "value2");
tran.Exec();

Lua 脚本

csharp 复制代码
var script = @"
    local current = redis.call('GET', KEYS[1])
    if current then
        redis.call('SET', KEYS[1], current + ARGV[1])
    else
        redis.call('SET', KEYS[1], ARGV[1])
    end
    return redis.call('GET', KEYS[1])
";

var result = RedisHelper.Eval<string>(script, "mycounter", 1);

5. 在 ASP.NET Core 中使用

配置服务

csharp 复制代码
// Program.cs
var builder = WebApplication.CreateBuilder(args);

// 配置 CSRedis
var redisConnection = builder.Configuration.GetConnectionString("Redis");
var redis = new CSRedisClient(redisConnection);
RedisHelper.Initialization(redis);

// 注册为服务
builder.Services.AddSingleton(redis);

// 或者使用依赖注入
builder.Services.AddScoped<IRedisService, RedisService>();

创建服务类

csharp 复制代码
public interface IRedisService
{
    Task<T> GetAsync<T>(string key);
    Task SetAsync<T>(string key, T value, TimeSpan? expiry = null);
    Task<bool> RemoveAsync(string key);
}

public class RedisService : IRedisService
{
    public async Task<T> GetAsync<T>(string key)
    {
        return await RedisHelper.GetAsync<T>(key);
    }

    public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null)
    {
        if (expiry.HasValue)
            await RedisHelper.SetAsync(key, value, expiry.Value);
        else
            await RedisHelper.SetAsync(key, value);
    }

    public async Task<bool> RemoveAsync(string key)
    {
        return await RedisHelper.DelAsync(key) > 0;
    }
}

在控制器中使用

csharp 复制代码
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    private readonly IRedisService _redisService;

    public UsersController(IRedisService redisService)
    {
        _redisService = redisService;
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetUser(string id)
    {
        var cacheKey = $"user:{id}";
        var user = await _redisService.GetAsync<User>(cacheKey);
        
        if (user == null)
        {
            // 从数据库获取
            user = await _userRepository.GetByIdAsync(id);
            if (user != null)
            {
                await _redisService.SetAsync(cacheKey, user, TimeSpan.FromMinutes(30));
            }
        }
        
        return Ok(user);
    }
}

6. 配置选项

csharp 复制代码
var connectionString = 
    "127.0.0.1:6379,password=123456,defaultDatabase=0," +
    "prefix=myapp_,poolsize=50,ssl=false,writeBuffer=10240";

var redis = new CSRedisClient(connectionString);

主要配置参数:

  • password: Redis 密码
  • defaultDatabase: 默认数据库
  • prefix: 键前缀
  • poolsize: 连接池大小
  • ssl: 是否使用 SSL
  • writeBuffer: 写入缓冲区大小

这样你就掌握了 CSRedisCore 的基本和高级用法,可以在项目中灵活使用了。

相关推荐
代码哈士奇8 小时前
Nestjs+nacos+kafka搭建中后台系统-后端(持续更新中)
redis·分布式·微服务·nacos·kafka·nestjs·pgsql
.生产的驴9 小时前
React 路由权限跳转 Token判断 路由控制 登录状态控制
前端·javascript·react.js·ajax·前端框架·c#·ecmascript
IDOlaoluo15 小时前
TinyRDM 1.2.3 Windows版安装教程(附Redis客户端下载及详细步骤)
数据库·redis·缓存
SunnyDays101117 小时前
如何使用 C# 将 CSV 数据轻松转换为 PDF
c#·csv转pdf
Big_潘大师17 小时前
C# 六自由度机械臂正反解计算
数学建模·机器人·c#·六自由度机械臂
我不是程序猿儿17 小时前
【C#】XtraMessageBox(DevExpress)与MessageBox(WinForms 标准库)的区别
开发语言·c#
偶尔的鼠标人18 小时前
Avalonia/WPF 打开子窗口,并且跨页面传值
c#·wpf·mvvm·avalonia
玖笙&18 小时前
✨WPF编程进阶【6.1】:图形原则(附源码)
c++·c#·wpf·visual studio
huoshan1234518 小时前
给旧版 .NET 也开一扇“私有之门”——ILAccess.Fody 实现原理与设计
c#·.net·fody·il·mono.cecil