当前位置: 首页 > news >正文

.net web 中如何优雅地使用 redis?

在 .NET Web 应用中优雅地使用 Redis

Redis 是一个高性能的键值存储系统,在 .NET Web 应用中可以用来实现缓存、会话存储、消息队列等功能。以下是优雅使用 Redis 的几个关键方面:

1. 选择合适的客户端库

推荐使用 StackExchange.Redis,它是 .NET 中最流行的 Redis 客户端:

// 安装 NuGet 包
Install-Package StackExchange.Redis

2. 配置和连接管理

单例模式管理连接

public static class RedisConnectorHelper
{private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>{return ConnectionMultiplexer.Connect("your_redis_server:6379");});public static ConnectionMultiplexer Connection => lazyConnection.Value;
}

在 ASP.NET Core 中使用依赖注入

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{services.AddStackExchangeRedisCache(options =>{options.Configuration = "your_redis_server:6379";options.InstanceName = "SampleInstance_";});// 或者直接注册 ConnectionMultiplexerservices.AddSingleton<IConnectionMultiplexer>(_ => ConnectionMultiplexer.Connect("your_redis_server:6379"));
}

3. 缓存实现

基本缓存操作

public class RedisCacheService
{private readonly IDatabase _cache;public RedisCacheService(IConnectionMultiplexer redis){_cache = redis.GetDatabase();}public async Task SetAsync<T>(string key, T value, TimeSpan? expiry = null){var serializedValue = JsonSerializer.Serialize(value);await _cache.StringSetAsync(key, serializedValue, expiry);}public async Task<T> GetAsync<T>(string key){var value = await _cache.StringGetAsync(key);return value.HasValue ? JsonSerializer.Deserialize<T>(value) : default;}public async Task RemoveAsync(string key){await _cache.KeyDeleteAsync(key);}
}

分布式缓存接口

// 使用 IDistributedCache 接口
public class SomeService
{private readonly IDistributedCache _cache;public SomeService(IDistributedCache cache){_cache = cache;}public async Task<SomeData> GetData(){var cachedData = await _cache.GetStringAsync("cache_key");if (cachedData != null){return JsonSerializer.Deserialize<SomeData>(cachedData);}// 从数据库获取数据var data = await FetchFromDatabase();// 缓存数据await _cache.SetStringAsync("cache_key", JsonSerializer.Serialize(data),new DistributedCacheEntryOptions{AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30)});return data;}
}

4. 高级用法

发布/订阅模式

// 发布消息
var sub = redis.GetSubscriber();
await sub.PublishAsync("messages", "Hello World!");// 订阅消息
var sub = redis.GetSubscriber();
await sub.SubscribeAsync("messages", (channel, message) => 
{Console.WriteLine((string)message);
});

使用 Lua 脚本

var script = "return redis.call('GET', KEYS[1])";
var prepared = LuaScript.Prepare(script);
var result = await _cache.ScriptEvaluateAsync(prepared, new { KEYS = new RedisKey[] { "key" } });

管道和批量操作

var batch = _cache.CreateBatch();
var task1 = batch.StringSetAsync("key1", "value1");
var task2 = batch.StringSetAsync("key2", "value2");
batch.Execute();
await Task.WhenAll(task1, task2);

5. 最佳实践

  1. 连接管理:保持连接复用,不要频繁创建和销毁连接
  2. 序列化:选择高效的序列化方式(如 MessagePack 或 System.Text.Json)
  3. 键设计:使用合理的键命名规范(如 type:id:field
  4. 过期策略:为缓存设置合理的过期时间
  5. 错误处理:实现重试机制和熔断策略
  6. 性能监控:监控 Redis 的性能指标和命中率
  7. 集群支持:生产环境考虑使用 Redis 集群

6. 在 ASP.NET Core 中的集成

会话存储

services.AddSession(options =>
{options.IdleTimeout = TimeSpan.FromMinutes(30);options.Cookie.HttpOnly = true;options.Cookie.IsEssential = true;
});
services.AddDistributedRedisCache(options =>
{options.Configuration = "your_redis_server:6379";options.InstanceName = "Session_";
});

响应缓存

services.AddResponseCaching();
services.AddDistributedRedisCache(options =>
{options.Configuration = "your_redis_server:6379";options.InstanceName = "ResponseCache_";
});// 在控制器中使用
[ResponseCache(Duration = 60)]
public IActionResult Index()
{return View();
}

通过以上方式,你可以在 .NET Web 应用中优雅、高效地使用 Redis,提升应用性能并实现丰富的功能。

http://www.dtcms.com/a/291785.html

相关文章:

  • MFC类Qt的自动布局框架
  • 景区负氧离子监测设备:守护清新,赋能旅游
  • 【kubernetes】-2 K8S的资源管理
  • 学习笔记-关于中华心法问答系统的环境配置和源代码理解
  • 基于Vue+ElementUI的借还款利息计算器
  • Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践
  • SpringBoot集成PDFBox实现PDF导出(表格导出、分页页码、电子签章与数字签名)
  • RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验
  • Rust实战:决策树与随机森林实现
  • 【vscode】vscode中python虚拟环境的创建
  • 激光雷达-自动驾驶的“三维感知中枢“
  • IntelliJ IDEA (2024.3.1)优雅导入 Maven 项目的两种方式详解
  • 【Java企业级开发】(六)Java框架技术-Maven和MyBatis
  • Docker容器 介绍
  • Maven 环境配置全攻略:从入门到实战
  • Kafka灰度方案
  • 两个android,一个客户端一个服务器端
  • 【菜狗学聚类】时间序列聚类主要方法—20250722
  • zmaiFy来说软字幕和硬字幕有什么优缺点?
  • 【LINUX】CentOS Stream 9 手动配置网络
  • [hot 100]两数之和-Python3-Hash Table
  • 归一化 vs 标准化:数据预处理终极指南
  • Matplotlib绘制各种图参考
  • 力扣刷题 -- 101.对称二叉树
  • JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
  • 【网工】学而思:生成树协议STP原理与应用
  • 美团视觉算法面试30问全景精解
  • Java内部类与Object类深度解析
  • 高层功能架构详解 - openExo
  • GitHub新手生存指南:AI项目版本控制与协作实战