dotnet使用redis时需要注意的问题
<h2 id="1性能问题-批量多次读写序列化和反序列化的场景">1.性能问题-批量多次读写、序列化和反序列化的场景</h2><p>注意看到dotnet下的IDistributedCache接口内部方法声明都是针对单个key的,当需要多次大量读写同一类型kv值时,存在多次连接redis的情况,导致性能特别慢。<br>
在abp框架中AbpRedisCache有些SetMany和GetMany的方法,它可以很好的解决这个问题。<br>
今天再分享一个Redis的批操作的写法(db.CreateBatch()),性能会更好一些,大致写法如下。</p>
<pre><code class="language-csharp"> static async Task Main(string[] args)
{
// 连接到 Redis 服务器
var connection = ConnectionMultiplexer.Connect("localhost:6379");
var db = connection.GetDatabase();
// 使用管道进行批量操作
var batch = db.CreateBatch();
// 执行多个命令
var task1 = batch.StringSetAsync("key1", "value1");
var task2 = batch.StringSetAsync("key2", "value2");
var task3 = batch.StringSetAsync("key3", "value3");
// 提交批量操作
batch.Execute();
// 等待所有异步操作完成
await Task.WhenAll(task1, task2, task3);
// 验证结果
Console.WriteLine(await db.StringGetAsync("key1"));// 输出 "value1"
Console.WriteLine(await db.StringGetAsync("key2"));// 输出 "value2"
Console.WriteLine(await db.StringGetAsync("key3"));// 输出 "value3"
}
</code></pre>
<p>另外我们还要注意,尽量别存取复杂对象,尽量是值类型、string和byte[],因为复杂对象我们很多都是json序列化成string后再存,读的时候还要反序列化,大量数据或者特别大的对象序列化和反序列化都是很消耗性能的,特别批量存取的情况下更严重。</p>
<h2 id="2报错问题">2.报错问题</h2>
<p>经常报超时错误,StackExchange.Redis.TimeoutException。<br>
很多时候与redis本身没关系,很多是我们用了一些第三方库导致,比如:<br>
CSRedis-到目前内存实现都是同步代码<br>
EasyCaching-极容易导致超时情况,它内存莫名其妙开锁<br>
本人目前就发现这两个,主要是极高并发的情况下,普通使用基本没问题,调试当然是发现不了问题的。<br>
所以干脆别再用第三方库,就用StackExchangeRedis好了,其他都只能是基本的封装,别玩花样(比如试图写个库自动适配其他缓存场景)。</p>
<h2 id="3吐槽下dotnet下的生态">3.吐槽下dotnet下的生态</h2>
<p>dotnet开源已经很久了,本身非常好用,特别是其他重量级的库,比如EFCore就非常棒。<br>
但是很多第三方库就很糟糕了,redis这个只是其中有一个,其他方面的库在我使用过后都存在的各种问题,而且都非常棘手,都是容易引起性能问题的情况。<br>
所以总结就是少用各种组件和各种库,即便有些库有大量的推荐文章,真用起来,高并发的情况下就是灾难。</p>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature">
<p id="PSignature" style="border-top-color: #e0e0e0; border-top-width: 1px; border-top-style: dashed; border-right-color: #e0e0e0; border-right-width: 1px; border-right-style: dashed; border-bottom-color: #e0e0e0; border-bottom-width: 1px; border-bottom-style: dashed; border-left-color: #e0e0e0; border-left-width: 1px; border-left-style: dashed; padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 80px; background-image: url(https://images.cnblogs.com/cnblogs_com/pains/109838/r_copyright.png); background-attachment: initial; background-origin: initial; background-clip: initial; font-family: 微软雅黑; font-size: 11px; background-color: #e5f1f4; background-position: 1% 50%; background-repeat: no-repeat no-repeat; ">
作者:Rick Carter
<br />
出处:http://pains.cnblogs.com/
<br />
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
</p>
</div><br><br>
来源:https://www.cnblogs.com/pains/p/19183883
頁:
[1]