.net core中关于Redis单例模式,依赖注入配置类

安装依赖

StackExchange.Redis

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Redis": {
    "Password": "",
    "AllowAdmin": false,
    "Ssl": false,
    "ConnectTimeout": 6000,
    "ConnectRetry": 2,
    "Hosts": [
      {
        "Host": "localhost",
        "Port": "6379"
      }
    ],
    "Database": 0
  },
  "RedisConnectionString": {"Value":"127.0.0.1,DefaultDatabase=0" }
  
}

RedisConfig.cs

namespace CoreRedis.Config
{
    public class RedisConfig
    {
        public string Value { get; set; }
    }
}

builder.Services.Configure<RedisConfig>(
    builder.Configuration.GetSection("RedisConnectionString")
);

//如下,是个单例的服务,这个服务中需要注入配置项
builder.Services.AddSingleton<RedisString>();

如何在单例中注入
关键是使用 IOptionsMonitor
https://andrewlock.net/creating-singleton-named-options-with-ioptionsmonitor/

using Microsoft.AspNetCore.Mvc;
using StackExchange.Redis;
using StackExchange.Redis.Extensions.Core.Abstractions;
using System.Threading;
using System.Threading.Tasks;
using System.Configuration;
using Microsoft.Extensions.Options;
using CoreRedis.Config;
using Newtonsoft.Json;

namespace CoreRedis.RedisDataType
{
    public class RedisString
    {
        private static readonly object _lock = new object();

        private ConnectionMultiplexer redisMultiplexer;

        //private static RedisString _redisClient = null;

        private readonly RedisConfig _redisConfig;

        IDatabase db = null;

        //public static RedisString RedisClient
        //{
        //    get
        //    {
        //        if (_redisClient == null)
        //        {
        //            lock(_lock)
        //            {
        //                _redisClient = new RedisString();
        //            }
        //        }
        //        return _redisClient;
        //    }
        //}

        public RedisString(IOptionsMonitor<RedisConfig> optionsSnapshot)
        {
            _redisConfig = optionsSnapshot.CurrentValue;
            //_redisConfig = optionsSnapshot;
            var RedisConnection = _redisConfig.Value;
            redisMultiplexer = ConnectionMultiplexer.Connect(RedisConnection);
            db = redisMultiplexer.GetDatabase();
        }


        //添加一个key 或者覆盖key的值
        public async Task<Task<bool>> SetKey(string key, string value)
        {
            return db.StringSetAsync(key, value, null, false, StackExchange.Redis.When.Always);
        }


        //只有在键不存在的时候才设置
        public async Task<Task<bool>> SetKeyNx(string key, string value)
        {
            return db.StringSetAsync(key, value, null, false, When.NotExists);
        }
 
        /// <summary>
        /// 获取一个key的对象
        /// </summary>
        public async Task<T> GetStringKey<T>(string key)
        {
            if (db == null)
            {
                return default;
            }
            var value = await db.StringGetAsync(key);
            if (value.IsNullOrEmpty)
            {
                return default;
            }
            return JsonConvert.DeserializeObject<T>(value);
        }


        //getset一个key,获取旧值并设置新值
        public async Task<T> GetSetKey<T>(string key,string value)
        {
            var oldvalue = await db.StringGetSetAsync(key, value);

            return JsonConvert.DeserializeObject<T>(oldvalue);
        }


        //mset 一次设置多个数据
        public async Task<Task<bool>> MSET(KeyValuePair<RedisKey, RedisValue>[] values )
        {
            return db.StringSetAsync(values, When.NotExists);
        }

        //mget 一次获取多个数据
        public async Task<Task<RedisValue[]>> MGET(RedisKey[] keys)
        {
            return db.StringGetAsync(keys);
        }


        //获取string的length

        public async Task<Task<long>> KeyLen(string key)
        {
            return db.StringLengthAsync(key);
        }


        //append

        public async Task<Task<long>> Append(string key , string appendvalue)
        {
            return db.StringAppendAsync(key, appendvalue);
        }

        //get range

        public async Task<Task<RedisValue>> GetRange(string key , int start, int end)
        {
            return db.StringGetRangeAsync(key, start, end);
        }


        //增加
        public async Task<Task<long>> Incr(string key,int count)
        {
            return db.StringIncrementAsync(key, count);
        }

        //减少
        public async Task<Task<long>> Decr(string key,int count)
        {
            return db.StringDecrementAsync(key, count);
        }

    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在项目安装 `StackExchange.Redis` 包。可以通过NuGet包管理器或者在项目文件手动添加引用来完成安装。 以下是使用依赖注入方式连接redis并使用的示例代码: ```csharp // Startup.cs using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using StackExchange.Redis; public class Startup { private readonly IConfiguration _configuration; public Startup(IConfiguration configuration) { _configuration = configuration; } public void ConfigureServices(IServiceCollection services) { // 注册 Redis 连接对象 services.AddSingleton<IConnectionMultiplexer>(provider => { string redisConnectionString = _configuration.GetConnectionString("RedisConnection"); return ConnectionMultiplexer.Connect(redisConnectionString); }); // 注册 Redis 数据库操作对象 services.AddScoped<IDatabase>(provider => { IConnectionMultiplexer redisConnection = provider.GetService<IConnectionMultiplexer>(); return redisConnection.GetDatabase(); }); // 注册其他服务 // ... } } ``` 在上面的示例代码,我们首先注册了一个 `IConnectionMultiplexer` 型的单例对象,该对象用于连接 Redis 数据库。然后,我们注册了一个 `IDatabase` 型的对象,该对象用于操作 Redis 数据库的数据。在注册 `IDatabase` 对象时,我们使用了 `AddScoped` 方法,这意味着每次请求都会创建一个新的 `IDatabase` 对象。 在代码,我们还使用了 `IConfiguration` 对象来获取 Redis 数据库的连接字符串。我们需要在项目的 `appsettings.json` 文件添加一个名为 `RedisConnection` 的连接字符串,例如: ```json { "ConnectionStrings": { "RedisConnection": "localhost:6379" } } ``` 有了上面这些注册之后,我们就可以在需要使用 Redis 数据库的服务注入 `IDatabase` 对象了,例如: ```csharp // MyService.cs using StackExchange.Redis; public class MyService { private readonly IDatabase _redisDatabase; public MyService(IDatabase redisDatabase) { _redisDatabase = redisDatabase; } public void SetData(string key, string value) { _redisDatabase.StringSet(key, value); } public string GetData(string key) { return _redisDatabase.StringGet(key); } } ``` 在上面的示例代码,我们注入了 `IDatabase` 对象,并在 `SetData` 和 `GetData` 方法使用该对象进行 Redis 数据库的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值