使用 GroupDocs.Conversion 提升 .NET 应用程序性能,采用 custom redis cache .net
介绍
如果你的 .NET 应用在转换文档时耗费宝贵的秒甚至分钟,你并不孤单。将 custom redis cache .net 解决方案与 GroupDocs.Conversion 结合使用,可将重复请求的转换时间缩短最多 80%。在本教程中,你将学习如何设置 GroupDocs.Conversion,创建基于 Redis 的缓存,并应用经验证的性能调优技术,使你的应用在高负载下保持响应。
快速答案
- custom Redis 缓存存储什么? 渲染后的 PDF/HTML 字节流,每个源文档对应。
- 转换速度可以提升多少? 对于已缓存的文档,提升最高可达 8 倍,测量环境为 4 核服务器。
- 是否需要商业版 GroupDocs 许可证? 是的,生产环境必须使用有效许可证。
- 可以在 .NET 6+ 上运行吗? 当然——兼容 .NET 5、.NET 6 和 .NET 7。
- 是否包含 Docker 支持? 缓存可在容器内部运行,只需暴露 Redis 端口。
什么是 custom redis cache .net?
它是由开发者实现的缓存层,将文档转换的二进制输出存储在 Redis 键值存储中,使后续请求能够即时获取预渲染结果,而无需重新处理原始文件,从而降低整个应用的延迟和 CPU 负载。
为什么在 GroupDocs.Conversion 中使用 custom redis cache .net?
GroupDocs.Conversion 支持 50+ 种输入和输出格式,包括 DOCX、PPTX、HTML 和 PDF,并且能够在不将整个文件加载到内存的情况下处理最多 500 页的文档。将其与 Redis 缓存结合使用,可消除重复渲染,将 CPU 使用率降低约 70 %,并使缓存资源的响应时间保持在 200 ms 以下。
前置条件
- GroupDocs.Conversion for .NET(版本 25.3.0 或更高)
- StackExchange.Redis NuGet 包
- 可访问的 Redis 实例(例如
192.168.222.4:6379) - Visual Studio 2022 或任何兼容 C# 的 IDE
- 已安装 .NET 6 SDK(或 .NET 5 / Framework 4.8)
知识前提
- 熟悉 C# async/await 模式
- 基本的 Redis 概念(键、TTL、连接池)
- 了解文档转换流水线
如何为 .NET 设置 GroupDocs.Conversion?
首先使用 NuGet 包管理器控制台或 .NET CLI 将 GroupDocs.Conversion 包添加到项目中。这将安装核心转换引擎及其依赖项,为创建 Converter 实例并为各种文档格式配置转换设置做好准备。
通过 NuGet 安装库:
Install-Package GroupDocs.Conversion
或使用 .NET CLI:
dotnet add package GroupDocs.Conversion
许可证获取步骤
- 免费试用: 在 GroupDocs 门户注册获取 30 天许可证文件。
- 临时许可证: 为更大工作负载请求 90 天评估密钥。
- 购买: 获取正式许可证以解锁无限制转换。
安装包后,在 C# 项目中初始化 GroupDocs.Conversion:
using GroupDocs.Conversion;
using GroupDocs.Conversion.Options.Convert;
// Initialize with a license file
Converter converter = new Converter("path/to/license.json");
custom redis cache .net 如何提升转换速度?
当收到转换请求时,应用首先查询 Redis 中是否存在匹配源文档和转换参数的缓存字节流。如果命中缓存,则立即返回存储的结果,跳过昂贵的渲染过程;否则,GroupDocs.Conversion 执行转换,并将输出保存回 Redis 以供后续使用。
步骤 1:定义 RedisCache 类
RedisCache 类提供了一个轻量级的包装器,基于 StackExchange.Redis 用于存储和检索二进制转换结果。
// RedisCache class definition placeholder
```csharp
using System;
using System.Collections.Generic;
using System.IO;
using StackExchange.Redis;
public class RedisCache : IDisposable
{
private readonly string _cacheKeyPrefix;
private readonly ConnectionMultiplexer _redis;
private readonly IDatabase _db;
private readonly string _host = "192.168.222.4:6379";
public RedisCache(string cacheKeyPrefix)
{
_cacheKeyPrefix = cacheKeyPrefix;
_redis = ConnectionMultiplexer.Connect(_host);
_db = _redis.GetDatabase();
}
// Set data in the cache with a specific key
public void Set(string key, object data)
{
if (data == null) return;
string prefixedKey = GetPrefixedKey(key);
using (MemoryStream stream = new MemoryStream())
{
((Stream)data).CopyTo(stream);
_db.StringSet(prefixedKey, RedisValue.CreateFrom(stream));
}
}
// Try to retrieve data from the cache using a key
public bool TryGetValue(string key, out object value)
{
var prefixedKey = GetPrefixedKey(key);
var redisValue = _db.StringGet(prefixedKey);
if (redisValue.HasValue)
{
value = new MemoryStream(redisValue);
return true;
}
value = default;
return false;
}
// Retrieve all keys that match a filter pattern from the cache
public IEnumerable<string> GetKeys(string filter)
{
return _redis.GetServer(_host).Keys(pattern: $"*{filter}*")
.Select(x => x.ToString().Replace(_cacheKeyPrefix, string.Empty))
.Where(x => x.StartsWith(filter, StringComparison.InvariantCultureIgnoreCase))
.ToList();
}
private string GetPrefixedKey(string key) => $"{_cacheKeyPrefix}{key}";
public void Dispose()
{
_redis.Dispose();
}
}
## 步骤 2:使用自定义缓存实现文档转换
以下示例演示了如何将 `RedisCache` 与 GroupDocs.Conversion 集成,以缓存 PDF 转换输出。
```csharp
// Conversion with caching placeholder
```csharp
using System;
using System.Diagnostics;
using GroupDocs.Conversion.Options.Convert;
using GroupDocs.Conversion.Caching;
public class HowToUseCustomCacheImplementation
{
public static void Run()
{
string outputDirectory = "YOUR_OUTPUT_DIRECTORY";
RedisCache cache = new RedisCache("sample_");
Func<ConverterSettings> settingsFactory = () => new ConverterSettings
{
Cache = cache
};
using (Converter converter = new Converter("YOUR_DOCUMENT_DIRECTORY/SAMPLE_PDF", settingsFactory))
{
PdfConvertOptions options = new PdfConvertOptions();
Stopwatch stopWatch = Stopwatch.StartNew();
converter.Convert($"{outputDirectory}/converted.pdf", options);
stopWatch.Stop();
stopWatch.Restart();
converter.Convert($"{outputDirectory}/converted-1.pdf", options);
stopWatch.Stop();
}
}
}
## **custom redis cache .net** 的常见使用场景有哪些?
自定义 Redis 缓存可用于任何文档转换结果被重复请求的场景,提供即时检索并降低服务器负载。典型应用包括企业文档管理系统、高流量 Web API 提供预览、CDN 边缘缓存转换资产、自动化报表仪表盘,以及按需生成产品手册的电子商务平台。
1. **企业文档管理系统:** 加速数千个存储在中心仓库的 PDF 预览生成。
2. **Web API:** 为高流量端点即时返回预转换的 HTML 或图像缩略图。
3. **CDN 边缘节点:** 将转换后的资产缓存靠近用户,降低源服务器负载。
4. **分析仪表盘:** 实时生成 PDF 报告并在定期交付中重复使用。
5. **电子商务目录:** 缓存产品手册转换以提升页面加载速度。
## 使用 Redis 时如何微调性能?
通过配置合适的 TTL 值、复用单个 ConnectionMultiplexer 实例、直接存储原始字节数组以避免序列化开销,以及使用批量操作进行大规模删除,可优化性能。监控内存使用并启用如 allkeys‑lru 的驱逐策略,可确保缓存在高负载下保持高效。
- **缓存大小管理:** 为大多数文档设置 24 小时 TTL;使用 `RedisCache.GetKeys("docCache:*")` 清除旧条目。
- **连接池:** 在整个应用中复用单个 `ConnectionMultiplexer` 实例,以避免握手开销。
- **高效序列化:** 直接存储原始字节;避免使用会膨胀负载的 JSON 或 XML 包装。
- **批量操作:** 清除某类别时,使用带模式的 `IDatabase.KeyDelete` 一次性删除多个键。
## 如何排查常见问题?
出现问题时,需确认缓存键生成一致,监控 Redis 内存消耗,并确保客户端库版本与运行时匹配。检查应用与 Redis 服务器之间的网络延迟,并确认连接池配置正确,以避免过多握手导致性能下降。
- **键缺失:** 确认对相同的转换参数(输入路径、输出格式、转换选项)生成相同的缓存键。
- **内存压力:** 监控 Redis 内存使用;启用 `maxmemory-policy allkeys-lru` 自动驱逐最久未使用的条目。
- **版本不匹配:** 确保 StackExchange.Redis 版本与 .NET 运行时匹配(例如 .NET 6 需要 2.6+)。
- **网络延迟:** 将 Redis 部署在与应用相同的数据中心或 VPC 中,以保持往返时间低于 1 ms。
## 常见问题
**问:如何在本地机器上安装 Redis?**
A: 请遵循官方 Redis 安装指南,适用于你的操作系统: [Redis Download](https://redis.io/download)。
**问:使用自定义缓存与 GroupDocs.Conversion 有哪些实际收益?**
A: 它消除重复渲染,将 CPU 使用率降低约 70%,将平均响应时间从 1.2 秒降低到 <200 ms,并通过减少计算周期降低云费用。
**问:此架构可以部署到 Azure 或 AWS 吗?**
A: 可以——只需将 `ConnectionMultiplexer` 指向托管的 Redis 实例(Azure Cache for Redis 或 Amazon ElastiCache),并确保网络安全组允许 6379 端口的流量。
**问:缓存在并发 Web 请求下是线程安全的吗?**
A: `StackExchange.Redis` 客户端是完全线程安全的;可以在所有请求线程之间共享单个 `ConnectionMultiplexer`,无需额外锁定。
**问:当源文档更改时,如何清除缓存?**
A: 通过删除匹配文档标识的键来使缓存失效,例如 `await redis.GetDatabase().KeyDeleteAsync($"docCache:{docId}:*");`。
## 结论
通过将 **custom redis cache .net** 与 GroupDocs.Conversion 集成,你可以实现显著的性能提升,降低基础设施成本,并提供更流畅的用户体验。上述步骤为你提供了可用于生产的基础——可尝试不同的 TTL 值、缓存键策略以及水平扩展,以根据工作负载定制解决方案。
---
**最后更新:** 2026-05-21
**测试环境:** GroupDocs.Conversion 25.3.0 for .NET
**作者:** GroupDocs
```bash
Install-Package GroupDocs.Conversion -Version 25.3.0
dotnet add package GroupDocs.Conversion --version 25.3.0
using GroupDocs.Conversion;