.net 6 简单使用redis

25 篇文章 7 订阅
2 篇文章 0 订阅
本文介绍了如何在.NET Core应用程序中使用StackExchange.Redis包来集成Redis作为缓存,并提供了配置、创建Redis帮助类、添加服务依赖以及测试使用的方法。同时,建议使用RedisDesktopManager进行可视化管理。
摘要由CSDN通过智能技术生成

前言:要使用redis,首先电脑要先下载安装redis,下载安装可以看我上一篇文章 https://blog.csdn.net/weixin_44442366/article/details/124205310
我们用StackExchange.Redis包在.NET Core中使用Redis实现缓存,如果想可视化查看redis缓存里面的数据可以安装RedisDesktopManager。

一、在NuGet搜索安装StackExchange.Redis包

在这里插入图片描述

二、在appsettings.json文件里面添加Redis相关配置信息:
 "Redis": {
    "Default": {
      "Connection": "127.0.0.1:6379,password=888", //redis连接地址,端口号,密码
      "InstanceName": "local", //实例名
      "DefaultDB": "8", //Db8数据库
    }

在这里插入图片描述

三、创建Redis帮助类

创建RedisHelper类,代码如下:

using StackExchange.Redis;
using System.Collections.Concurrent;

namespace RedisDemo.redis
{
    public class RedisHelper : IDisposable
    {
        //连接字符串
        private string _connectionString;
        //实例名称
        private string _instanceName;
        //默认数据库
        private int _defaultDB;

        private ConcurrentDictionary<string, ConnectionMultiplexer> _connections;
        public RedisHelper(string connectionString, string instanceName,  int defaultDB = 0)
        {
            _connectionString = connectionString;
            _instanceName = instanceName;
            _defaultDB = defaultDB;
            _connections = new ConcurrentDictionary<string, ConnectionMultiplexer>();
        }

        /// <summary>
        /// 获取ConnectionMultiplexer
        /// </summary>
        /// <returns></returns>
        private ConnectionMultiplexer GetConnect()
        {
            return _connections.GetOrAdd(_instanceName, p => ConnectionMultiplexer.Connect(_connectionString));
        }

        /// <summary>
        /// 获取数据库
        /// </summary>
        /// <param name="configName"></param>
        /// <param name="db">默认为0:优先代码的db配置,其次config中的配置</param>
        /// <returns></returns>
        public IDatabase GetDatabase()
        {
            return GetConnect().GetDatabase(_defaultDB);
        }

        public IServer GetServer(string configName = null, int endPointsIndex = 0)
        {
            var confOption = ConfigurationOptions.Parse(_connectionString);
            return GetConnect().GetServer(confOption.EndPoints[endPointsIndex]);
        }

        public ISubscriber GetSubscriber(string configName = null)
        {
            return GetConnect().GetSubscriber();
        }
        public void Dispose()
        {
            if (_connections != null && _connections.Count > 0)
            {
                foreach (var item in _connections.Values)
                {
                    item.Close();
                }
            }
        }
    }
}


四、添加服务依赖项

在Program.cs类添加服务依赖

//redis缓存
var section =builder.Configuration.GetSection("Redis:Default");
//连接字符串
string _connectionString = section.GetSection("Connection").Value;
//实例名称
string _instanceName = section.GetSection("InstanceName").Value;
//默认数据库 
int _defaultDB = int.Parse(section.GetSection("DefaultDB").Value ?? "0");
builder.Services.AddSingleton(new RedisHelper(_connectionString, _instanceName, _defaultDB));

在这里插入图片描述

五、测试使用, 在控制器接口中使用
using Microsoft.AspNetCore.Mvc;
using RedisDemo.redis;
using StackExchange.Redis;

namespace RedisDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class RedisTestController : ControllerBase
    {
        private readonly IDatabase _redis;
        public RedisTestController(RedisHelper client)
        {
            _redis = client.GetDatabase();
        }
        [HttpGet("test")]
        public string Get()
        {
            // 往Redis里面存入数据
            _redis.StringSet("Name", "hehe");
            // 从Redis里面取数据
            string name = _redis.StringGet("Name");
            return name;
        }
    }
}

在这里插入图片描述
api测试返回成功

用命令查看redis数据库正常存入,select 8 进入第8个库,keys *: 列出所有key,get Name:查看Name键的值
在这里插入图片描述
用可视化工具RedisDesktopManager查看
在这里插入图片描述

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Redis 实现分布式锁的代码示例可以如下所示```csharp using StackExchange.Redis; using System; public class RedisDistributedLock { private readonly ConnectionMultiplexer _redis; private readonly IDatabase _database; public RedisDistributedLock(string connectionString) { _redis = ConnectionMultiplexer.Connect(connectionString); _database = _redis.GetDatabase(); } public bool AcquireLock(string lockKey, TimeSpan expiryTime, out string lockValue) { lockValue = Guid.NewGuid().ToString(); return _database.StringSet(lockKey, lockValue, expiryTime, When.NotExists); } public bool ReleaseLock(string lockKey, string lockValue) { return _database.ScriptEvaluate( LuaScript.Prepare( "if redis.call('get', KEYS[1]) == ARGV[1] then " + " return redis.call('del', KEYS[1]) " + "else " + " return 0 " + "end"), new RedisKey[] { lockKey }, new RedisValue[] { lockValue } ).Equals(1L); } } ``` 在上面的代码中,我们使用 StackExchange.Redis 库来连接 Redis 数据库。`AcquireLock` 方法用于获取分布式锁,`ReleaseLock` 方法用于释放分布式锁。 使用示例: ```csharp using System; public class Program { public static void Main() { var connectionString = "your_redis_connection_string"; var lockKey = "my_lock_key"; var expiryTime = TimeSpan.FromSeconds(30); using (var redisDistributedLock = new RedisDistributedLock(connectionString)) { string lockValue; if (redisDistributedLock.AcquireLock(lockKey, expiryTime, out lockValue)) { try { // 执行需要加锁的逻辑 Console.WriteLine("Lock acquired. Performing critical section..."); // 在这里执行需要加锁的操作 // 模拟操作耗时 System.Threading.Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine("Critical section completed."); } finally { redisDistributedLock.ReleaseLock(lockKey, lockValue); } } else { Console.WriteLine("Failed to acquire lock."); } } } } ``` 上述代码中,我们使用一个唯一的 `lockValue` 来标识锁的持有者。在 `AcquireLock` 方法中,我们使用 Redis 的 `StringSet` 方法来尝试将锁的键值对写入 Redis,并设置过期时间和条件 `When.NotExists`(只有当键不存在时才设置成功)。在 `ReleaseLock` 方法中,我们使用 Lua 脚本来判断当前锁是否属于当前持有者,并通过 `ScriptEvaluate` 方法执行脚本。 请注意,这只是一个简单的示例代码,实际应用中可能需要处理更多的情况,比如锁的续期、异常处理等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值