当前位置:

首页 > 编程开发 > C#缓存机制详解与使用方法

C#缓存机制详解与使用方法

C#缓存机制核心是提升性能、降低延迟、减轻后端压力,主要分为应用内缓存(IMemoryCache)、分布式缓存(如Redis)和HTTP缓存;常用策略包括绝对过期、滑动过期、LRU淘汰等,结合Cache-Aside模式管理更新,通过设置合理过期时间、使用布隆过滤器防穿透、加锁防击穿、错峰过期防雪崩,并配合监控命中率与延迟,确保缓存高效稳定。

本文目录

    C#缓存机制核心是提升性能、降低延迟、减轻后端压力,主要分为应用内缓存(IMemoryCache)、分布式缓存(如Redis)和HTTP缓存;常用策略包括绝对过期、滑动过期、LRU淘汰等,结合Cache-Aside模式管理更新,通过设置合理过期时间、使用布隆过滤器防穿透、加锁防击穿、错峰过期防雪崩,并配合监控命中率与延迟,确保缓存高效稳定。

    C#的缓存机制是什么?如何使用?

    C#的缓存机制,说白了,就是把那些计算成本高、或者需要频繁访问的数据,暂时存起来,下次再要的时候,就不用重新计算或查询了,直接拿来用。这就像你经常去的那家咖啡店,知道你喜欢什么,提前给你准备好,省去了你每次点单的麻烦。至于怎么用,那就得看你具体的需求和场景了,从简单的内存缓存到分布式缓存,选择可不少,核心目的都是为了提升性能、降低延迟、减轻后端服务(比如数据库)的压力。

    解决方案

    在我看来,C# 里谈缓存,我们通常会想到两种主要类型:应用内缓存(In-Memory Cache)和分布式缓存(Distributed Cache)。当然,对于Web应用来说,HTTP缓存也是不可忽视的一环,虽然它更多是协议层面的事儿,但和C#应用紧密相关。

    1. 应用内缓存 (In-Memory Cache)

    这是最直接、最容易上手的缓存方式。在.NET Core/.NET 5+ 中,Microsoft.Extensions.Caching.Memory 这个库提供了 IMemoryCache 接口和其默认实现 MemoryCache。它就运行在你的应用程序进程里,所以访问速度极快,几乎没有网络延迟。

    怎么用呢?通常你会通过依赖注入(DI)的方式获取 IMemoryCache 实例:

    public class MyService
    {
        private readonly IMemoryCache _cache;
    
        public MyService(IMemoryCache cache)
        {
            _cache = cache;
        }
    
        public async Task> GetProductsAsync()
        {
            // 尝试从缓存获取
            if (!_cache.TryGetValue("ProductList", out List products))
            {
                // 缓存中没有,从数据库或其他数据源加载
                products = await LoadProductsFromDatabaseAsync();
    
                // 设置缓存选项:比如1分钟绝对过期,或者30秒滑动过期
                var cacheEntryOptions = new MemoryCacheEntryOptions()
                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(1)) // 1分钟后绝对过期
                    .SetSlidingExpiration(TimeSpan.FromSeconds(30)); // 30秒未访问则过期
    
                // 将数据存入缓存
                _cache.Set("ProductList", products, cacheEntryOptions);
            }
            return products;
        }
    
        private Task> LoadProductsFromDatabaseAsync()
        {
            // 模拟从数据库加载数据
            return Task.FromResult(new List
            {
                new Product { Id = 1, Name = "Laptop" },
                new Product { Id = 2, Name = "Mouse" }
            });
        }
    }

    别忘了在 Startup.cs 或 Program.cs 里注册 IMemoryCache:

    // .NET 6+ Minimal API
    builder.Services.AddMemoryCache();
    
    // 或者在 Startup.cs 的 ConfigureServices 方法中
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMemoryCache();
        // ... 其他服务
    }

    它的优点很明显:简单、快速。但缺点也同样突出:缓存数据只存在于当前应用实例中,如果你的应用是多实例部署的,每个实例都会有自己独立的缓存,数据不共享。而且,一旦应用重启,所有缓存数据都会丢失。所以,它更适合那些对实时性要求没那么高,或者数据量不大、单机就能搞定的场景。

    2. 分布式缓存 (Distributed Cache)

    当你的应用需要横向扩展,或者缓存数据需要在多个服务间共享时,内存缓存就力不从心了。这时候,分布式缓存就成了标配。Redis 是目前最流行、最常用的分布式缓存解决方案之一,在 C# 中通常会使用 StackExchange.Redis 这个库来操作。

    使用分布式缓存,你需要一个独立的缓存服务器(比如 Redis 服务器)。在 C# 代码中,你不再直接操作内存,而是通过网络请求去 Redis 服务器存取数据。

    // .NET 6+ Minimal API
    builder.Services.AddStackExchangeRedisCache(options =>
    {
        options.Configuration = "localhost:6379"; // Redis 连接字符串
        options.InstanceName = "MyApp_"; // 缓存键前缀
    });
    
    // 或者在 Startup.cs 的 ConfigureServices 方法中
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddStackExchangeRedisCache(options =>
        {
            options.Configuration = "localhost:6379,password=yourpassword"; // 带密码的连接
            options.InstanceName = "MyApp_";
        });
        // ... 其他服务
    }

    然后,在你的服务中注入 IDistributedCache 接口:

    public class AnotherService
    {
        private readonly IDistributedCache _distributedCache;
    
        public AnotherService(IDistributedCache distributedCache)
        {
            _distributedCache = distributedCache;
        }
    
        public async Task> GetProductsDistributedAsync()
        {
            string cacheKey = "DistributedProductList";
            string cachedProductsJson = await _distributedCache.GetStringAsync(cacheKey);
    
            if (string.IsNullOrEmpty(cachedProductsJson))
            {
                // 缓存中没有,从数据库加载
                var products = await LoadProductsFromDatabaseAsync();
                var jsonToCache = System.Text.Json.JsonSerializer.Serialize(products);
    
                // 设置分布式缓存选项
                var options = new DistributedCacheEntryOptions()
                    .SetAbsoluteExpiration(TimeSpan.FromMinutes(5)); // 5分钟绝对过期
    
                await _distributedCache.SetStringAsync(cacheKey, jsonToCache, options);
                return products;
            }
            else
            {
                return System.Text.Json.JsonSerializer.Deserialize>(cachedProductsJson);
            }
        }
    
        private Task> LoadProductsFromDatabaseAsync()
        {
            // 模拟从数据库加载数据
            return Task.FromResult(new List
            {
                new Product { Id = 3, Name = "Keyboard" },
                new Product { Id = 4, Name = "Monitor" }
            });
        }
    }

    分布式缓存的优势在于可伸缩性、数据共享和高可用性。即使你的应用实例挂了,缓存数据依然存在于 Redis 中。但它也引入了额外的复杂性:你需要部署和维护 Redis 服务器,网络延迟也比内存缓存高。不过,对于现代微服务架构,这几乎是必选项。

    3. HTTP 缓存

    虽然不是 C# 语言层面的缓存,但对于 Web API 或 MVC 应用来说,HTTP 缓存至关重要。它通过 HTTP 响应头来指示客户端(浏览器、代理服务器)如何缓存响应。常见的头部有 Cache-Control、Expires、ETag 和 Last-Modified。

    在 C# Web 应用中,你可以通过 Response.Headers 来设置这些头部,或者使用 ASP.NET Core 提供的 ResponseCaching 中间件。

    // 在 Startup.cs 的 ConfigureServices 中
    services.AddResponseCaching();
    
    // 在 Configure 方法中
    app.UseResponseCaching();
    
    // 在 Controller 或 Action 上使用特性
    [ResponseCache(Duration = 60, Location = ResponseCacheLocation.Any)]
    public IActionResult GetExpensiveData()
    {
        // ... 返回数据
    }

    这能有效减少服务器负载和网络流量,尤其对于那些不经常变化的静态资源或公共数据。

    C#应用中,何时应该考虑引入缓存机制?

    在我看来,决定是否以及何时引入缓存,主要取决于几个关键因素,这就像你决定要不要在家里囤积物资一样,得看需求和成本。

    • 数据访问频率高且变化不频繁: 这是最经典的缓存场景。比如一个电商网站的商品分类列表,或者一个博客的置顶文章,这些数据被大量用户反复请求,但更新频率很低。每次都去数据库查,数据库压力会很大。
    • 数据计算或获取成本高昂: 有些数据可能需要复杂的计算(比如报表统计),或者需要调用外部API(网络延迟和调用次数限制),这些操作都非常耗时耗资源。把计算结果或API响应缓存起来,能显著提升响应速度。
    • 数据库或后端服务负载过重: 如果你的数据库服务器经常CPU飙高,或者出现连接池耗尽的情况,那么缓存就是你的救命稻草。通过缓存,可以把大部分读请求挡在数据库前面,大大减轻其压力。
    • 响应时间有严格要求: 用户对应用响应速度的期望越来越高。如果你的某个接口响应时间过长,导致用户体验不佳,缓存通常是最有效的优化手段之一。
    • 数据一致性要求不那么极致: 缓存总是会引入数据一致性的问题。如果你的业务允许在短时间内看到“稍微旧一点”的数据(比如几秒到几分钟的延迟),那么缓存就是个好选择。如果要求数据绝对实时一致,那缓存就得非常谨慎地设计,或者干脆不适合。

    说实话,很多时候我们不是一开始就想着要用缓存,而是当性能瓶颈出现时,才开始考虑它。但这其实有点被动。在设计系统的时候,对那些“热点数据”和“慢查询”有个预判,提前规划缓存策略,往往能事半功倍。

    C#中常见的缓存策略与淘汰机制有哪些?

    缓存策略和淘汰机制,就像是管理你冰箱里的食物,得有章法,不然就乱套了。在 C# 的缓存世界里,这些机制决定了缓存项何时失效、何时被清理,以及在缓存容量不足时,哪些数据应该被“扔掉”。

    • 绝对过期 (Absolute Expiration): 这是最直接的策略。你给一个缓存项设定一个固定的生命周期,比如“10分钟后过期”。不管这10分钟内有没有人访问它,到点就失效。

      • 适用场景: 适用于那些你知道它在一段时间内不会变化,或者变化了也无所谓的配置数据、短时令牌等。
      • 示例: SetAbsoluteExpiration(TimeSpan.FromMinutes(10))
    • 滑动过期 (Sliding Expiration): 这个策略就“智能”多了。你设定一个时间间隔,比如“30秒”。如果一个缓存项在30秒内没有被访问,它就失效。但只要有人访问了它,它的生命周期就会被重置,重新开始计算30秒。

      • 适用场景: 适用于那些“热点”数据。只要有人用,它就一直活着;没人用,它就慢慢“凉”掉,腾出空间。这能有效避免不常用数据长期占据缓存。
      • 示例: SetSlidingExpiration(TimeSpan.FromSeconds(30))
    • 组合过期策略: 在 IMemoryCache 中,你可以同时设置绝对过期和滑动过期。比如,你可以设置一个缓存项在1小时内绝对过期,但如果它在10分钟内没有被访问,就滑动过期。这意味着它最多存活1小时,但如果一直没人访问,10分钟后就没了。

    • 基于大小/数量的淘汰 (Size/Count Based Eviction): 当缓存的总容量(比如内存缓存的总字节数,或者缓存项的总数量)达到预设上限时,缓存管理器就需要选择一些缓存项进行清理。

      • 示例: MemoryCacheEntryOptions.SetSize(1),然后在 AddMemoryCache 时配置 SizeLimit。
      • 淘汰算法: 这就涉及到一些经典的算法了:
        • LRU (Least Recently Used - 最近最少使用): 优先淘汰最近最少被访问的缓存项。这是最常见的淘汰策略之一,因为它假设过去不常用的数据,将来也不太常用。
        • LFU (Least Frequently Used - 最不经常使用): 优先淘汰在一段时间内被访问次数最少的缓存项。它更关注访问频率而非时间。
        • FIFO (First In, First Out - 先进先出): 优先淘汰最早进入缓存的项。这个比较简单粗暴,不考虑访问频率或时间。
    • 优先级淘汰 (Priority Eviction): 在某些缓存实现中,你可以给缓存项设置一个优先级(比如 CacheItemPriority.High 或 CacheItemPriority.Low)。当需要淘汰时,低优先级的项会被优先清理。

      • 适用场景: 确保关键数据即使在缓存紧张时也能尽可能保留。
    • 依赖项缓存 (Cache Dependencies): 这是一种非常强大的机制。你可以让一个缓存项依赖于其他资源,比如一个文件、一个数据库表中的某条记录,甚至是另一个缓存项。当这些依赖的资源发生变化时,依赖于它们的所有缓存项都会自动失效。

      • 示例: ChangeToken.OnChange 可以用来监听文件变化,然后使缓存失效。分布式缓存如 Redis 也可以通过发布/订阅模式实现类似效果。
      • 适用场景: 确保缓存数据与原始数据源的一致性,避免手动刷新缓存的麻烦。

    选择哪种策略,真的要根据你的业务场景和数据特性来。没有银弹,只有最适合的。

    如何有效地管理C#缓存的更新与失效?

    缓存的生命周期管理,也就是如何让缓存数据保持“新鲜”,同时又不过度消耗资源,这绝对是缓存技术里最考验功力的地方。就像你家冰箱里的食物,你得知道哪些要尽快吃掉,哪些可以放久一点,过期了就得扔。

    1. 缓存更新策略

    • Cache-Aside (旁路缓存/按需加载): 这是最常见、也最推荐的模式。它的逻辑是这样的:

      1. 应用程序首先尝试从缓存中读取数据。
      2. 如果缓存命中,直接返回数据。
      3. 如果缓存未命中,应用程序就从数据源(比如数据库)加载数据。
      4. 加载成功后,将数据存入缓存,然后返回给用户。
      • 优点: 简单直观,按需加载,避免缓存大量不被访问的数据。
      • 缺点: 第一次访问时会有缓存未命中延迟;更新数据时需要手动使缓存失效,可能导致短暂的数据不一致。
    • Read-Through (读穿/直读缓存): 应用程序从缓存中读取数据,如果缓存中没有,缓存系统会“自动”从数据源加载数据,并将其存入缓存,然后返回给应用程序。

      • 优点: 对应用程序透明,简化了应用代码。
      • 缺点: 需要缓存系统支持这种“自动加载”能力,实现起来相对复杂。
    • Write-Through (写穿/直写缓存): 应用程序向缓存写入数据,缓存系统同时将数据写入数据源。只有当数据源和缓存都写入成功后,才返回成功。

      • 优点: 保证了数据源和缓存的一致性。
      • 缺点: 写入操作的延迟会增加,因为要等待两个地方都写入成功。
    • Write-Behind (写回/回写缓存): 应用程序向缓存写入数据,缓存系统立即返回成功。然后,缓存系统会异步地将数据写入数据源。

      • 优点: 写入速度快,应用程序响应迅速。
      • 缺点: 如果缓存系统在数据写入数据源之前崩溃,可能会导致数据丢失。数据一致性是最终一致性。
    • 主动刷新/预热 (Proactive Refresh/Warm-up): 通过定时任务或其他机制,在数据失效前或在系统启动时,提前加载或刷新缓存中的关键数据。

      • 优点: 保证热点数据始终在缓存中,减少用户首次访问的延迟。
      • 缺点: 需要额外的逻辑来管理刷新任务,可能造成不必要的资源消耗(如果刷新了不被访问的数据)。

    2. 缓存失效管理

    这是确保数据“新鲜度”的关键。

    • 基于时间的过期: 前面提到的绝对过期和滑动过期就是这种。这是最简单也最常用的方式。

    • 基于事件的失效: 当底层数据源发生变化时,主动通知缓存使其失效。

      • 数据库变更通知: 比如使用 SQL Server 的 SqlDependency,或者通过消息队列(如 Kafka、RabbitMQ)订阅数据库的 CDC (Change Data Capture) 事件,当数据更新时,发布消息通知相关服务清理缓存。
      • 文件变更通知: 使用 FileSystemWatcher 监听文件变化,一旦文件更新,就让依赖该文件的缓存失效。
      • 手动清除: 提供一个管理界面或API,允许管理员手动清除特定缓存或所有缓存。这在紧急情况下非常有用。
    • 缓存穿透、击穿与雪崩的应对

      这三个是缓存领域常见的问题,处理不好会直接拖垮你的后端服务。

      • 缓存穿透 (Cache Penetration): 当用户请求一个既不在缓存中,也不在数据库中的数据时,每次请求都会穿透缓存,直接打到数据库,导致数据库压力剧增。

        • 应对:
          • 缓存空值: 如果查询结果为空,也把这个空结果缓存起来,并设置一个较短的过期时间。下次再有相同请求时,直接返回空,不再查询数据库。
          • 布隆过滤器 (Bloom Filter): 在缓存层前加一个布隆过滤器,快速判断请求的数据是否存在。如果布隆过滤器说不存在,那就直接拒绝请求,连缓存都不用查。
      • 缓存击穿 (Cache Breakdown): 某个热点数据(访问量非常高的数据)在缓存中过期了,此时大量请求同时涌入,都发现缓存未命中,然后都去查询数据库,导致数据库瞬间被打垮。

        • 应对:
          • 加锁: 在从数据库加载数据并回填缓存时,对该缓存项加锁。只允许一个请求去查询数据库并回填缓存,其他请求等待或返回旧数据。
          • 永不过期: 对于特别核心的热点数据,可以考虑将其设置为永不过期,或者设置一个非常长的过期时间,然后通过异步任务定期刷新。
          • 二级缓存: 在分布式缓存之上再加一层内存缓存,即使分布式缓存过期,内存缓存还能顶一会儿。
      • 缓存雪崩 (Cache Avalanche): 缓存中的大量数据在同一时间集中过期,导致所有请求都涌向数据库,数据库瞬间崩溃。

        • 应对:
          • 错开过期时间: 给不同的缓存项设置随机的过期时间,避免大量缓存同时失效。
          • 多级缓存: 引入多级缓存,比如内存缓存 + Redis 缓存,即使一级缓存失效,还有二级缓存顶着。
          • 熔断与降级: 当数据库压力过大时,启动熔断机制,拒绝部分请求或返回默认值,保护数据库。
          • 限流: 控制对数据库的并发请求数量。

    3. 监控与指标

    无论你用哪种缓存,监控都是不可或缺的。你需要关注:

    • 缓存命中率 (Cache Hit Ratio): 缓存命中次数 / 总请求次数。这是衡量缓存效果最重要的指标。
    • 缓存失效率 (Cache Miss Ratio): 缓存未命中次数 / 总请求次数。
    • 缓存占用内存/磁盘空间: 避免缓存过度消耗资源。
    • 缓存操作延迟: 存取缓存的平均耗时。
    • **淘汰率:
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 C#
    相关文章 更多
    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    谈编程与编程语言
    谈编程与编程语言

    编程的本质是创造性的严谨翻译,通过for、if和函数调用实现重复计算任务。语言发展让集成度提高,门槛降低但竞争加剧。程序员需培养整体架构能力,抓住思想精髓而非追逐新技术,方能长远发展。

    什么是面向接口编程、面向过程编程、面向对象编程?
    什么是面向接口编程、面向过程编程、面向对象编程?

    面向接口编程通过接口解耦,降低耦合度并提升可扩展性和维护性,是面向对象思想的精髓。面向过程编程将问题拆解为步骤,用函数依次执行。面向对象编程将事物抽象为对象,封装属性和方法,通过对象协作解决问题。

    我对编程的一些感悟
    我对编程的一些感悟

    编程这件事,说到底是门手艺活,但又不全是手艺。把代码写出来容易,把代码写好、写出境界,那就得看功夫了。今天聊几个核心判断,算是多年敲键盘的一点沉淀。 一、语言是功夫,思路是内功 编程语言五花八门,就像武林高手会的功夫一样,但想成为顶尖高手,内功必须深厚。内功到了,学新功夫就是分分钟的事。看过《倚天屠

    c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程
    c#如何使用abstract类_c#abstract类看这一篇就够了_保姆级教程

    abstract类不能被直接实例化,子类必须用override实现其所有抽象方法。抽象类可实现接口,并以抽象方法转发接口成员。抽象类不能与sealed共用,其抽象方法默认隐式virtual且无方法体。可包含字段、属性等非抽象成员。

    c#如何删除文件_c#删除文件的正确用法与注意事项
    c#如何删除文件_c#删除文件的正确用法与注意事项

    C#删除文件前应先判断存在性以防异常,注意权限不足和文件被占用。File.Delete与FileInfo.Delete功能相同,后者适合多次操作。无异步删除方法,推荐后台执行或限流以避免阻塞。

    c#如何使用EmguCV_c#EmguCV的最佳实践与常见坑点
    c#如何使用EmguCV_c#EmguCV的最佳实践与常见坑点

    在EmguCV中,进行Bitmap转Image时,需先转为24位无Alpha格式,以避免颜色错乱问题;Image转Bitmap时,建议使用Mat或ImageBox控件,以有效减少内存拷贝;跨线程处理时,应使用Mat.Clone()进行深拷贝,以确保数据安全;DLL加载失败时,需设置x64平台目标,并确保native库在输出目录中。

    C#怎么实现图表生成 C#如何用LiveCharts和OxyPlot绘制柱状图折线图饼图【图表】
    C#怎么实现图表生成 C#如何用LiveCharts和OxyPlot绘制柱状图折线图饼图【图表】

    C#图表生成中,LiveCharts需用ChartValues数据集合,并在更新后触发重绘;OxyPlot饼图需启用交互与标签;包引用务必注意版本适配;导出图片需在布局完成后操作,并校正DPI缩放以确保清晰度。

    C#怎么实现过滤器Filter_C# ASP.NET Core过滤器详解教程【进阶】
    C#怎么实现过滤器Filter_C# ASP.NET Core过滤器详解教程【进阶】

    ASP.NETCore过滤器需关注执行顺序、作用域与DI生命周期。接口实现需手动注册,特性继承更常用但需满足构造函数要求。全局注册时注意scoped服务注入问题,Order值须显式设置以控制同类型过滤器执行顺序。异常过滤器仅捕获操作方法内异常,模型绑定与授权失败须分别处理。

    c#如何实现鼠标钩子_c#鼠标钩子完整教程与实战案例
    c#如何实现鼠标钩子_c#鼠标钩子完整教程与实战案例

    实现全局鼠标钩子需使用SetWindowsHookEx配合WH_MOUSE_LL,窗体级事件仅捕获本进程消息。回调函数必须为静态且标记特定签名,禁止阻塞操作。通过Marshal.PtrToStructure解析lParam获取坐标与按键状态。钩子生命周期绑定线程,需注意注册线程持续运行并双重卸载,避免句柄泄漏。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。