惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
量子位
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
B
Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
H
Help Net Security
The Cloudflare Blog
U
Unit 42

博客园 - Rick Carter

官方APP太难用了,所以我写了个 OpenNas App 死锁是怎么发生的,举个简单的例子 hangfire内部执行器是同步的,会导致死锁 缓存读写代码逻辑的正确姿势 dotnet未捕获异常导致系统崩溃问题 dotnet-dump安装、收集dump和崩溃自动收集dump EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包) 修复达梦EFCore驱动布尔类型兼容问题 巧用 using 作用域(IDisposable)的生命周期包装特性 实现前后置处理 非托管内存怎么计算? dotnet集合类型性能优化的两个小儿科的知识点 一个前端树形控件联动勾选框卡顿问题及解决 .net c# Func<Task>及变体做为多播委托异步执行会另开线程的问题 关于EFCore插件API使用中踩过的坑 利用C#9.0中的record提高性能 dotnet CultureInfo遇到欧洲如俄文小数点是逗号想转点的解决办法 hangfire.entityframeworkcore这个库因为System.Threading.Timer未停止也未释放而导致的性能问题 达梦DM.Microsoft.EntityFreameworkCore查询报错invalid cast from DateTime to DateTimeOffset 达梦DOTNET驱动DM.Provider8.3.1.30495存在空字符串插入变DBNull的问题 是否可以考虑做一个dotnet应用的性能诊断工具
dotnet使用redis时需要注意的问题
Rick Carter · 2025-11-01 · via 博客园 - Rick Carter

1.性能问题-批量多次读写、序列化和反序列化的场景

注意看到dotnet下的IDistributedCache接口内部方法声明都是针对单个key的,当需要多次大量读写同一类型kv值时,存在多次连接redis的情况,导致性能特别慢。
在abp框架中AbpRedisCache有些SetMany和GetMany的方法,它可以很好的解决这个问题。
今天再分享一个Redis的批操作的写法(db.CreateBatch()),性能会更好一些,大致写法如下。

    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"
    }

另外我们还要注意,尽量别存取复杂对象,尽量是值类型、string和byte[],因为复杂对象我们很多都是json序列化成string后再存,读的时候还要反序列化,大量数据或者特别大的对象序列化和反序列化都是很消耗性能的,特别批量存取的情况下更严重。

2.报错问题

经常报超时错误,StackExchange.Redis.TimeoutException。
很多时候与redis本身没关系,很多是我们用了一些第三方库导致,比如:
CSRedis-到目前内存实现都是同步代码
EasyCaching-极容易导致超时情况,它内存莫名其妙开锁
本人目前就发现这两个,主要是极高并发的情况下,普通使用基本没问题,调试当然是发现不了问题的。
所以干脆别再用第三方库,就用StackExchangeRedis好了,其他都只能是基本的封装,别玩花样(比如试图写个库自动适配其他缓存场景)。

3.吐槽下dotnet下的生态

dotnet开源已经很久了,本身非常好用,特别是其他重量级的库,比如EFCore就非常棒。
但是很多第三方库就很糟糕了,redis这个只是其中有一个,其他方面的库在我使用过后都存在的各种问题,而且都非常棘手,都是容易引起性能问题的情况。
所以总结就是少用各种组件和各种库,即便有些库有大量的推荐文章,真用起来,高并发的情况下就是灾难。