c#使用csredis操作redis的示例
現(xiàn)在流行的redis連接客戶端有StackExchange.Redis和ServiceStack.Redis,為什么選擇csredis而不是這兩個?
- .net 最有名望的 ServiceStack.Redis 早已淪為商業(yè)用途,在 .NETCore 中使用只能充值;
- 后來居上的 StackExchange.Redis 雖然能用,但線上各種 Timeout 錯誤把人坑到?jīng)]脾氣,兩年多兩年多兩年多都不解決,最近發(fā)布的 2.0 版本不知道是否徹底解決了底層。
- csredis支持.net40/.net45/.netstandard2.0,基本上滿足了常見運行平臺,而上面兩個基本已經(jīng)放棄.net40了。
- csredis所有方法名與redis-cli保持一持,很容易上手?。。?/li>
環(huán)境:
- redis6.0.6
- window 10
- vs2019
- csredis3.6.5(https://github.com/2881099/csredis)
- .net4/.net 4.5/.netcore 3.1
csredis 源碼地址: https://github.com/2881099/csredis
1.在.net項目中引入CSRedisCore

包安裝命令:
Install-Package CSRedisCore -Version 3.6.5
2.使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//根據(jù)連接信息構(gòu)造客戶端對象
var redis = new CSRedis.CSRedisClient("192.168.3.42:6500,password=123456,defaultDatabase=0,poolsize=500,ssl=false,writeBuffer=10240,prefix=test_");
//redis中的string存取
redis.Set("name", "小明");
var name= redis.Get("name");
Console.WriteLine($"name={name}");
redis.Set("birth", DateTime.Now);
var birth = redis.Get<DateTime>("birth");
Console.WriteLine($"birth={birth}");
redis.Set("info", new {sex="female",age="20" });
var info = redis.Get<object>("info");
Console.WriteLine($"info={info}");
Console.WriteLine("ok");
Console.ReadLine();
}
}
}
3.高級玩法:發(fā)布訂閱
//普通訂閱
rds.Subscribe(
("chan1", msg => Console.WriteLine(msg.Body)),
("chan2", msg => Console.WriteLine(msg.Body)));
//模式訂閱(通配符)
rds.PSubscribe(new[] { "test*", "*test001", "test*002" }, msg => {
Console.WriteLine($"PSUB {msg.MessageId}:{msg.Body} {msg.Pattern}: chan:{msg.Channel}");
});
//模式訂閱已經(jīng)解決的難題:
//1、分區(qū)的節(jié)點匹配規(guī)則,導(dǎo)致通配符最大可能匹配全部節(jié)點,所以全部節(jié)點都要訂閱
//2、本組 "test*", "*test001", "test*002" 訂閱全部節(jié)點時,需要解決同一條消息不可執(zhí)行多次
//發(fā)布
rds.Publish("chan1", "123123123");
//無論是分區(qū)或普通模式,rds.Publish 都可以正常通信
4.高級玩法:緩存殼
//不加緩存的時候,要從數(shù)據(jù)庫查詢
var t1 = Test.Select.WhereId(1).ToOne();
//一般的緩存代碼,如不封裝還挺繁瑣的
var cacheValue = rds.Get("test1");
if (!string.IsNullOrEmpty(cacheValue)) {
try {
return JsonConvert.DeserializeObject(cacheValue);
} catch {
//出錯時刪除key
rds.Remove("test1");
throw;
}
}
var t1 = Test.Select.WhereId(1).ToOne();
rds.Set("test1", JsonConvert.SerializeObject(t1), 10); //緩存10秒
//使用緩存殼效果同上,以下示例使用 string 和 hash 緩存數(shù)據(jù)
var t1 = rds.CacheShell("test1", 10, () => Test.Select.WhereId(1).ToOne());
var t2 = rds.CacheShell("test", "1", 10, () => Test.Select.WhereId(1).ToOne());
var t3 = rds.CacheShell("test", new [] { "1", "2" }, 10, notCacheFields => new [] {
("1", Test.Select.WhereId(1).ToOne()),
("2", Test.Select.WhereId(2).ToOne())
});
5.高級玩法:管道
使用管道模式,打包多條命令一起執(zhí)行,從而提高性能。
var ret1 = rds.StartPipe().Set("a", "1").Get("a").EndPipe();
var ret2 = rds.StartPipe(p => p.Set("a", "1").Get("a"));
var ret3 = rds.StartPipe().Get("b").Get("a").Get("a").EndPipe();
//與 rds.MGet("b", "a", "a") 性能相比,經(jīng)測試差之毫厘
6.高級玩法:多數(shù)據(jù)庫
var connectionString = "127.0.0.1:6379,password=123,poolsize=10,ssl=false,writeBuffer=10240,prefix=key前輟";
var redis = new CSRedisClient[14]; //定義成單例
for (var a = 0; a< redis.Length; a++) redis[a] = new CSRedisClient(connectionString + "; defualtDatabase=" + a);
//訪問數(shù)據(jù)庫1的數(shù)據(jù)
redis[1].Get("test1");
7.性能比拼

以上就是c#使用csredis操作redis的示例的詳細(xì)內(nèi)容,更多關(guān)于c# csredis操作redis的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#通過rabbitmq實現(xiàn)定時任務(wù)(延時隊列)
工作中經(jīng)常會有定時任務(wù)的需求,常見的做法可以使用Timer、Quartz、Hangfire等組件,本文使用C#通過rabbitmq實現(xiàn)定時任務(wù)(延時隊列),感興趣的可以了解一下2021-05-05
C#使用Spire.PDF for .NET實現(xiàn)PDF轉(zhuǎn)SVG
在現(xiàn)代Web開發(fā)和圖形處理中,對于文檔和圖像格式的靈活轉(zhuǎn)換需求日益增長,本文將深入探討如何利用強(qiáng)大的 Spire.PDF for .NET 庫,準(zhǔn)確地將PDF文件轉(zhuǎn)換為SVG文件,感興趣的小伙伴可以了解下2025-09-09
C#中的并發(fā)編程與.NET任務(wù)并行庫的使用示例和常見問題
在現(xiàn)代軟件開發(fā)中,.NET Framework通過引入任務(wù)并行庫(TPL)和并發(fā)集合類型,簡化了并發(fā)復(fù)雜性,提高程序的性能、可維護(hù)性和可擴(kuò)展性,并發(fā)集合設(shè)計上允許多線程安全訪問,此外,TPL通過Task類簡化異步操作,正確使用這些工具可避免死鎖和競爭條件等常見問題2024-09-09

