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

Asp.Net Core基于StackExchange Redis 缓存

NuGet安装

StackExchange.Redis

Microsoft.Extensions.Options

0. appsettings.json初始化配置

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","Redis": {"ConnectionString": "localhost:6379","InstanceName": "anna_","DefaultDatabase": 5,"ConnectRetry": 3,"ConnectTimeout": 5000,"AbortOnConnectFail": false},"ConnectionStrings": {"default": "Host=10.10.11.185;Port=5432;Database=KSJGOM2DB;Username=postgres;Password=money13;"}
}

1.Redis初始化对象

/// <summary>
/// Redis初始化对象
/// </summary>
public class RedisOptions
{public const string Redis = "Redis";public string ConnectionString { get; set; }public string InstanceName { get; set; }public int DefaultDatabase { get; set; } = 0;public int ConnectRetry { get; set; } = 3;public int ConnectTimeout { get; set; } = 5000;public bool AbortOnConnectFail { get; set; } = false;
}

2.接口

public interface IRedisService
{#region String 操作Task<bool> StringSetAsync<T>(string key, T value, TimeSpan? expiry = null);Task<T> StringGetAsync<T>(string key);Task<long> StringIncrementAsync(string key, long value = 1);Task<long> StringDecrementAsync(string key, long value = 1);#endregion#region Hash 操作Task<bool> HashSetAsync<T>(string hashKey, string key, T value);Task<bool> HashDeleteAsync(string hashKey, string key);Task<T> HashGetAsync<T>(string hashKey, string key);Task<Dictionary<string, T>> HashGetAllAsync<T>(string hashKey);Task<long> HashLengthAsync(string hashKey);#endregion#region List 操作Task<long> ListLeftPushAsync<T>(string key, T value);Task<long> ListRightPushAsync<T>(string key, T value);Task<T> ListLeftPopAsync<T>(string key);Task<T> ListRightPopAsync<T>(string key);Task<long> ListLengthAsync(string key);Task<IEnumerable<T>> ListRangeAsync<T>(string key, long start = 0, long stop = -1);#endregion#region Set 操作Task<bool> SetAddAsync<T>(string key, T value);Task<bool> SetRemoveAsync<T>(string key, T value);Task<bool> SetContainsAsync<T>(string key, T value);Task<long> SetLengthAsync(string key);Task<IEnumerable<T>> SetMembersAsync<T>(string key);#endregion#region SortedSet 操作Task<bool> SortedSetAddAsync<T>(string key, T value, double score);Task<bool> SortedSetRemoveAsync<T>(string key, T value);Task<double?> SortedSetScoreAsync<T>(string key, T value);Task<long> SortedSetLengthAsync(string key);Task<IEnumerable<T>> SortedSetRangeByRankAsync<T>(string key, long start = 0, long stop = -1, Order order = Order.Ascending);Task<IEnumerable<T>> SortedSetRangeByScoreAsync<T>(string key, double start = double.NegativeInfinity, double stop = double.PositiveInfinity, Order order = Order.Ascending);#endregion#region 通用操作Task<bool> KeyDeleteAsync(string key);Task<bool> KeyExistsAsync(string key);Task<bool> KeyExpireAsync(string key, TimeSpan? expiry);Task<TimeSpan?> KeyTimeToLiveAsync(string key);#endregion
}

3. 实现

public class RedisService : IRedisService, IDisposable
{private readonly IConnectionMultiplexer _redis;private readonly RedisOptions _options;private readonly IDatabase _database;private readonly JsonSerializerOptions _jsonOptions;public RedisService(IOptions<RedisOptions> optionsAccessor){_options = optionsAccessor.Value;_jsonOptions = new JsonSerializerOptions{PropertyNamingPolicy = JsonNamingPolicy.CamelCase,WriteIndented = false};var config = ConfigurationOptions.Parse(_options.ConnectionString);config.AbortOnConnectFail = _options.AbortOnConnectFail;config.ConnectRetry = _options.ConnectRetry;config.ConnectTimeout = _options.ConnectTimeout;_redis = ConnectionMultiplexer.Connect(config);_database = _redis.GetDatabase(_options.DefaultDatabase);}private string GetPrefixedKey(string key) => $"{_options.InstanceName}{key}";#region String 操作实现public async Task<bool> StringSetAsync<T>(string key, T value, TimeSpan? expiry = null){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.StringSetAsync(GetPrefixedKey(key), json, expiry);}public async Task<T> StringGetAsync<T>(string key){var value = await _database.StringGetAsync(GetPrefixedKey(key));return value.HasValue ? JsonSerializer.Deserialize<T>(value, _jsonOptions) : default;}public async Task<long> StringIncrementAsync(string key, long value = 1){return await _database.StringIncrementAsync(GetPrefixedKey(key), value);}public async Task<long> StringDecrementAsync(string key, long value = 1){return await _database.StringDecrementAsync(GetPrefixedKey(key), value);}#endregion#region Hash 操作实现public async Task<bool> HashSetAsync<T>(string hashKey, string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.HashSetAsync(GetPrefixedKey(hashKey), key, json);}public async Task<bool> HashDeleteAsync(string hashKey, string key){return await _database.HashDeleteAsync(GetPrefixedKey(hashKey), key);}public async Task<T> HashGetAsync<T>(string hashKey, string key){var value = await _database.HashGetAsync(GetPrefixedKey(hashKey), key);return value.HasValue ? JsonSerializer.Deserialize<T>(value, _jsonOptions) : default;}public async Task<Dictionary<string, T>> HashGetAllAsync<T>(string hashKey){var entries = await _database.HashGetAllAsync(GetPrefixedKey(hashKey));return entries.ToDictionary(x => x.Name.ToString(),x => JsonSerializer.Deserialize<T>(x.Value, _jsonOptions));}public async Task<long> HashLengthAsync(string hashKey){return await _database.HashLengthAsync(GetPrefixedKey(hashKey));}#endregion#region List 操作实现public async Task<long> ListLeftPushAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.ListLeftPushAsync(GetPrefixedKey(key), json);}public async Task<long> ListRightPushAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.ListRightPushAsync(GetPrefixedKey(key), json);}public async Task<T> ListLeftPopAsync<T>(string key){var value = await _database.ListLeftPopAsync(GetPrefixedKey(key));return value.HasValue ? JsonSerializer.Deserialize<T>(value, _jsonOptions) : default;}public async Task<T> ListRightPopAsync<T>(string key){var value = await _database.ListRightPopAsync(GetPrefixedKey(key));return value.HasValue ? JsonSerializer.Deserialize<T>(value, _jsonOptions) : default;}public async Task<long> ListLengthAsync(string key){return await _database.ListLengthAsync(GetPrefixedKey(key));}public async Task<IEnumerable<T>> ListRangeAsync<T>(string key, long start = 0, long stop = -1){var values = await _database.ListRangeAsync(GetPrefixedKey(key), start, stop);return values.Select(v => JsonSerializer.Deserialize<T>(v, _jsonOptions));}#endregion#region Set 操作实现public async Task<bool> SetAddAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SetAddAsync(GetPrefixedKey(key), json);}public async Task<bool> SetRemoveAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SetRemoveAsync(GetPrefixedKey(key), json);}public async Task<bool> SetContainsAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SetContainsAsync(GetPrefixedKey(key), json);}public async Task<long> SetLengthAsync(string key){return await _database.SetLengthAsync(GetPrefixedKey(key));}public async Task<IEnumerable<T>> SetMembersAsync<T>(string key){var values = await _database.SetMembersAsync(GetPrefixedKey(key));return values.Select(v => JsonSerializer.Deserialize<T>(v, _jsonOptions));}#endregion#region SortedSet 操作实现public async Task<bool> SortedSetAddAsync<T>(string key, T value, double score){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SortedSetAddAsync(GetPrefixedKey(key), json, score);}public async Task<bool> SortedSetRemoveAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SortedSetRemoveAsync(GetPrefixedKey(key), json);}public async Task<double?> SortedSetScoreAsync<T>(string key, T value){var json = JsonSerializer.Serialize(value, _jsonOptions);return await _database.SortedSetScoreAsync(GetPrefixedKey(key), json);}public async Task<long> SortedSetLengthAsync(string key){return await _database.SortedSetLengthAsync(GetPrefixedKey(key));}public async Task<IEnumerable<T>> SortedSetRangeByRankAsync<T>(string key, long start = 0, long stop = -1, Order order = Order.Ascending){var values = await _database.SortedSetRangeByRankAsync(GetPrefixedKey(key), start, stop, order);return values.Select(v => JsonSerializer.Deserialize<T>(v, _jsonOptions));}public async Task<IEnumerable<T>> SortedSetRangeByScoreAsync<T>(string key, double start = double.NegativeInfinity, double stop = double.PositiveInfinity, Order order = Order.Ascending){var values = await _database.SortedSetRangeByScoreAsync(GetPrefixedKey(key), start, stop, order: order);return values.Select(v => JsonSerializer.Deserialize<T>(v, _jsonOptions));}#endregion#region 通用操作实现public async Task<bool> KeyDeleteAsync(string key){return await _database.KeyDeleteAsync(GetPrefixedKey(key));}public async Task<bool> KeyExistsAsync(string key){return await _database.KeyExistsAsync(GetPrefixedKey(key));}public async Task<bool> KeyExpireAsync(string key, TimeSpan? expiry){return await _database.KeyExpireAsync(GetPrefixedKey(key), expiry);}public async Task<TimeSpan?> KeyTimeToLiveAsync(string key){return await _database.KeyTimeToLiveAsync(GetPrefixedKey(key));}#endregionpublic void Dispose(){_redis?.Dispose();}
}

4.依赖注入

Program.cs中添加如下代码:

 // 配置Redis选项builder.Services.Configure<RedisOptions>(builder.Configuration.GetSection(RedisOptions.Redis));// 注册Redis服务builder.Services.AddSingleton<IRedisService, RedisService>();

5.控制器中使用

public class TestController : ControllerBase
{private readonly IRedisService _redis;private readonly IUserService _userService;public TestController(IRedisService redis, IUserService userService) {_redis = redis;_userService = userService;}[HttpGet("string")]public async Task<IActionResult> TestString(){var user = await _userService.GetCurrentUserAsync();Console.WriteLine(user.TrueName);await _redis.StringSetAsync("anna","多慢慢流");var result = await _redis.StringGetAsync<string>("anna");return Ok(result);}[HttpGet("hash")]public async Task<IActionResult> TestHash(){string hkey = "fdm";await _redis.HashSetAsync(hkey, "fd1",new {Name="annadeville",Props="运动型" });await _redis.HashSetAsync(hkey,"fd2",new { Name="RR",Props="皮"});var all= await _redis.HashGetAllAsync<dynamic>(hkey);var fd1 = await _redis.HashGetAsync<dynamic>(hkey, "fd1");return Ok(new { All = all, Field1 = fd1 });}}

http://www.lqws.cn/news/119557.html

相关文章:

  • Flutter、React Native 项目如何搞定 iOS 上架?从构建 IPA 到上传 App Store 的实战流程全解析
  • 【unity游戏开发入门到精通——通用篇】从零掌握UnityWebRequest:文件下载、表单提交、超时处理、断点续传
  • 【发布实录】云原生+AI,助力企业全球化业务创新
  • [特殊字符] 在 React Native 项目中封装 App Icon 一键设置命令(支持参数与默认路径)
  • go语言学习 第5章:函数
  • 电气架构/域控制器/中央计算平台技术论坛
  • React Native开发鸿蒙运动健康类应用的项目实践记录
  • 应用层协议:HTTP
  • 结构性设计模式之Facade(外观)设计模式
  • iOS UIActivityViewController 组头处理
  • Java设计模式:责任链模式
  • 2025年- H69-Lc177--78.子集(回溯,组合)--Java版
  • Spring Boot微服务架构(十一):独立部署是否抛弃了架构优势?
  • 【p2p、分布式,区块链笔记 MESH】 论文阅读 Thread/OpenThread Low-Power Wireless Multihop Net
  • iTunes 无法备份 iPhone:10 种解决方法
  • Rust 学习笔记:Box<T>
  • [蓝桥杯]密码脱落
  • 常见排序算法详解与C语言实现
  • qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001
  • JavaWeb:前端工程化-TS(TypeScript)
  • 经典ReLU回归!重大缺陷「死亡ReLU问题」已被解决
  • 【大模型:知识图谱】--4.neo4j数据库管理(cypher语法1)
  • day027-Shell自动化编程-基础
  • 回归任务和分类任务损失函数详解
  • Docker轻松搭建Neo4j+APOC环境
  • IOS 打包账号发布上传和IOS Xcode证书配置
  • 华为云Flexus+DeepSeek征文|基于华为云MaaS平台的DeepSeek大模型与云服务单机+CCE高可用部署实践
  • 使用 React Native 开发鸿蒙运动健康类应用的​​高频易错点总结​​
  • 【uniapp开发】picker组件的使用
  • OSCP靶机练习PG hokkaido