NET Coreのシンプルで高度なライブラリcsredis

NET Coreのシンプルで高度なライブラリcsredis

オープンソースのRedisパッケージ

最后更新 2021/04/11 9:50
FreeSql & CSRedis
预计阅读 5 分钟
分类
.NET
标签
.NET C# オープンソースソース Redis csredis

1はじめに

1.0リリースから. NET Coreは、最初は様々なライブラリが現在の部分的な改善に欠けており、今日に行くことは容易ではありません。

例えば、redis-cli SDKは非常に悪いです。

过去 .net 最有名望的 ServiceStack.Redis 早已沦为商业用途,在 .NETCore 中使用只能充值;后来居上的 StackExchange.Redis 虽然能用,但线上各种 Timeout 错误把人坑到没脾气,两年多都不解决,最近发布的 2.0 版本不知道是否彻底解决了底层。

2 CSRedis v3.0.0アップデート

  1. すべてのメソッド名はredis-cliに保持されます。

Java/python/go/nodejs/php SDKのメソッド名はredis-cliとほぼ一致しており、二次名前のライブラリには反対しています。

  1. Get <byte []>やHGet <byte []>のような逆シーケンスオブジェクトフェッチを追加すると、すべてのフェッチメソッドがオーバーロードされ、デフォルトのフェッチは文字列のままになります。

  2. SafeObjectPoolの導入。

3つの用途

nuget Install-Package CSRedisCore
var rds = new CSRedis.CSRedisClient("127.0.0.1:6379,password=123,defaultDatabase=13,poolsize=50,ssl=false,writeBuffer=10240,prefix=key前辍");
rds.Set("test1", "123123", 60);
rds.Get("test1");
//函数名与 redis-cli 的命令相同,rds 一定是单例单例单例

4つの主要なゲーム:パーティション

現実的には、複数のサービスノードがストレージを共有し、公式のパーティション、クラスタ、高可用性スキームとは異なります。

例えば、キャッシュデータは500 Gに達し、リディスサーバサーバを使用するとメモリストレージだけでは非常に困難になり、ハードディスクを使用するとパフォーマンスに影響します。

この機能を使用すると、N台のredis-serverサーバが共有ストレージを自動的に管理できます。各サーバは約500/Nのメモリしか使用できません。また、各サーバは公式の高可用性アーキテクチャで構成できます。

var rds = new CSRedis.CSRedisClient(null,
  "127.0.0.1:6371,password=123,defaultDatabase=11,poolsize=10,ssl=false,writeBuffer=10240,prefix=key前辍",
  "127.0.0.1:6372,password=123,defaultDatabase=12,poolsize=11,ssl=false,writeBuffer=10240,prefix=key前辍",
  "127.0.0.1:6373,password=123,defaultDatabase=13,poolsize=12,ssl=false,writeBuffer=10240,prefix=key前辍",
  "127.0.0.1:6374,password=123,defaultDatabase=14,poolsize=13,ssl=false,writeBuffer=10240,prefix=key前辍");
//实现思路:根据key.GetHashCode() % 节点总数量,确定连向的节点
//也可以自定义规则(第一个参数设置)

rds.MSet("key1", 1, "key2", 2, "key3", 3, "key4", 4);
rds.MGet("key1", "key2", "key3", "key4");

トップ5:サブスクリプションの発行

//普通订阅
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}");
});
//模式订阅已经解决的难题:
//1、分区的节点匹配规则,导致通配符最大可能匹配全部节点,所以全部节点都要订阅
//2、本组 "test*", "*test001", "test*002" 订阅全部节点时,需要解决同一条消息不可执行多次

//发布
rds.Publish("chan1", "123123123");
//无论是分区或普通模式,rds.Publish 都可以正常通信

6つのゲーム:キャッシュシェル。

//不加缓存的时候,要从数据库查询
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 缓存数据
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())
});

7つのゲーム:パイプ

パイプモードを使用すると、複数のコマンドをまとめて実行することで、パフォーマンスが向上します。

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") 性能相比,经测试差之毫厘

8つのゲーム:複数のデータベース

データベースを切り替える必要があると確信している場合は、次のコードを参照してください。

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);

//访问数据库1的数据
redis[1].Get("test1");

9性能比較。

10終わり。

まだオープンソースをサポートしています。

CSRedisソースコード:w w w.example.com

  • *_author:Free SqlとCSRedis

  • この記事へのリンク* https//www.example.com

  • *________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________または個人的に直接。

  • *著作権表示**:このブログのすべての投稿は、特に明記されていない限り、BY-NC-SAライセンス契約の対象となります。出典を教えてください!

  • *連帯ブロガー**:この記事があなたに役立ったと思う場合は、記事の右下にある[推奨]をクリックしてください。あなたの励ましは、ブロガーの最大の動機です!

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2024/03/21

マイクロソフトは年間数億ドルのRedisジョブを獲得したか?オープンソースのパフォーマンスをリードするGarnet:変更なし、Redisクライアントに直接アクセス

最近、マイクロソフトは公式にオープンソースキャッシュストレージシステムGarnetをオープンソース化した。マイクロソフトリサーチのデータベースグループのシニアプリンシパルリサーチャーであるBadrish Chandramouli氏によると、Garnetプロジェクトはゼロから構築され、パフォーマンス(特にスループットにおけるスレッドスケーラビリティと低レイテンシの割合の増加)を中心に構築された。

继续阅读
同分类 / 同标签 2026/04/22

バージョン別の. NETサポート状況(250 7 0 7更新)

仮想マシンとテストマシンを使用して、各バージョンのオペレーティングシステムの. NETサポートをテストします。オペレーティングシステムのインストール後、対応するランタイムを測定し、スターダストエージェントをパスとして実行できます。

继续阅读