.net core使用StackExchange.Redis客户端连接Redis出现的问题

错误提示:

System.InvalidOperationException:“The assembly for System.Runtime.CompilerServices.Unsafe could not be loaded; this usually means a missing assembly binding redirect - try checking this, and adding any that are missing; note that it is not always possible to add this redirects - for example 'azure functions v1'; it looks like you may need to use 'azure functions v2' for that - sorry, but that's out of our control”

1、安装Redis

        此处不做详细介绍,网上有很多教程和安装包。

2、新建.NET CORE项目

2、通过Nuget引用StackExchange.Redis.dll、Newtonsoft.Json.dll、需要用到配置文件读取,引用System.Configuration.ConfigurationManager.dll

3、app.config配置内容

4、引入RedisHelper.cs帮助类

    /// <summary>
    /// Redis 操作类
    /// </summary>
    public class RedisHelper
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["RedisConnectionString"].ConnectionString;
        /// <summary>
        /// 锁
        /// </summary>
        private readonly object _lock = new object();
        /// <summary>
        /// 连接对象
        /// </summary>
        private volatile IConnectionMultiplexer _connection;
        /// <summary>
        /// 数据库
        /// </summary>
        private IDatabase _db;
        public RedisHelper()
        {
            _connection = ConnectionMultiplexer.Connect(ConnectionString);
            _db = GetDatabase();
        }
        /// <summary>
        /// 获取连接
        /// </summary>
        /// <returns></returns>
        protected IConnectionMultiplexer GetConnection()
        {
            if (_connection != null && _connection.IsConnected)
            {
                return _connection;
            }
            lock (_lock)
            {
                if (_connection != null && _connection.IsConnected)
                {
                    return _connection;
                }

                if (_connection != null)
                {
                    _connection.Dispose();
                }
                _connection = ConnectionMultiplexer.Connect(ConnectionString);
            }

            return _connection;
        }
        /// <summary>
        /// 获取数据库
        /// </summary>
        /// <param name="db"></param>
        /// <returns></returns>
        public IDatabase GetDatabase(int? db = null)
        {
            return GetConnection().GetDatabase(db ?? -1);
        }
        /// <summary>
        /// 设置
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="data">值</param>
        /// <param name="cacheTime">时间</param>
        public virtual void Set(string key, object data, int cacheTime)
        {
            if (data == null)
            {
                return;
            }
            var entryBytes = Serialize(data);
            var expiresIn = TimeSpan.FromMinutes(cacheTime);

            _db.StringSet(key, entryBytes, expiresIn);
        }
        /// <summary>
        /// 根据键获取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual T Get<T>(string key)
        {

            var rValue = _db.StringGet(key);
            if (!rValue.HasValue)
            {
                return default(T);
            }

            var result = Deserialize<T>(rValue);

            return result;
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="serializedObject"></param>
        /// <returns></returns>
        protected virtual T Deserialize<T>(byte[] serializedObject)
        {
            if (serializedObject == null)
            {
                return default(T);
            }
            var json = Encoding.UTF8.GetString(serializedObject);
            return JsonConvert.DeserializeObject<T>(json);
        }
        /// <summary>
        /// 判断是否已经设置
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public virtual bool IsSet(string key)
        {
            return _db.KeyExists(key);
        }
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="data"></param>
        /// <returns>byte[]</returns>
        private byte[] Serialize(object data)
        {
            var json = JsonConvert.SerializeObject(data);
            return Encoding.UTF8.GetBytes(json);
        }
    }

5、主程序设置和获取test字符串来验证是否成功

class Program
    {
        static void Main(string[] args)
        {
            RedisHelper redisHelper = new RedisHelper();

            redisHelper.Set("test", "123456",100);

            string strTest = redisHelper.Get<string>("test");
            Console.WriteLine(strTest);

            Console.ReadKey();
        }
    }

5、运行程序提示如下错误

6、解决办法

 The assembly for System.Runtime.CompilerServices.Unsafe could not be loaded; 错误提示System.Runtime.CompilerServices.Unsafe未能正确加载,利用Nuget将System.Runtime.CompilerServices.Unsafe引用到项目中,重新编译,运行成功。

成功运行界面如下:

 

 

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值