【愚公系列】2022年05月 .NET架构班 044-分布式中间件 .Net Core下使用Redis

举报
愚公搬代码 发表于 2022/05/01 15:26:20 2022/05/01
【摘要】 一、.Net Core下使用Redis 1.本地缓存的使用 1.1 下载对应的包Microsoft.Extensions.Caching.Memory 1.2 配置在ConfigureServices中注册services.AddMemoryCache(); 1.3 注入到控制器private readonly IMemoryCache memoryCache; 2.Redis的使用 2....

一、.Net Core下使用Redis

1.本地缓存的使用

1.1 下载对应的包

Microsoft.Extensions.Caching.Memory

1.2 配置

在ConfigureServices中注册

services.AddMemoryCache();

1.3 注入到控制器

private readonly IMemoryCache memoryCache;

2.Redis的使用

2.1 下载对应的包

StackExchange.Redis

2.2 封装

public static class RedisServiceCollectionExtensions
{
    /// <summary>
    ///  注册分布式Redis缓存
    /// </summary>
    /// <typeparam name="connectionString"></typeparam>
    /// <returns></returns>
    public static IServiceCollection AddDistributedRedisCache(this IServiceCollection services,string connectionString)
    {
        ConnectionMultiplexer connectionMultiplexer = ConnectionMultiplexer.Connect(connectionString);
        services.AddSingleton(connectionMultiplexer);
        return services;
    }
}    

2.3 配置

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        ......
        // 1、redis连接
        //services.AddDistributedRedisCache("192.168.44.4:6379");
        services.AddDistributedRedisCache("localhost:6379");
    }   

2.4 注入到控制器

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("[controller]")]
public class ProductController : ControllerBase
{
    private readonly ConnectionMultiplexer _connectionMultiplexer;
    public ProductController(ConnectionMultiplexer connectionMultiplexer)
    {
        _connectionMultiplexer = connectionMultiplexer;
    }
    /// <summary>
    /// 查询商品
    /// </summary>
    /// <param name="productCreateDto"></param>
    /// <returns></returns>
    [HttpPost]
    public Product GetProduct()
    {
        #region 1、存储商品对象
        {
            // 1、从redis中取对象
            string productjson = _connectionMultiplexer.GetDatabase(0).StringGet("product");
            if (string.IsNullOrEmpty(productjson))
            {
                // 2、从数据库中查询
                product = _productDbContext.Products.FirstOrDefault(s => s.Id == 1);

                // 3、存储到redis中
                string demojson = JsonConvert.SerializeObject(product);//序列化
                _connectionMultiplexer.GetDatabase(0).StringSet("product", demojson);
                
                 return product;
            }
            product = JsonConvert.DeserializeObject<Product>(productjson);//反序列化

            return product;
        }
        #endregion
    }
}     

3.Redis测试

3.1 启动两个实例

启动两个微服务实例:5003、5004
在这里插入图片描述
在这里插入图片描述

3.2 Redis准备

3.2.1 先进入到Redis中

在这里插入图片描述

3.2.2 打开redis.conf配置,在里面添加

bind 0.0.0.0 -::1

3.2.3 启动Redis

在这里插入图片描述

3.3 客户端访问

3.3.1 启动Redis

进入到浏览器对两个端口进行访问:5003、5004
在这里插入图片描述

在这里插入图片描述

二、.Net Core下使用Redis包含密码

1.下载对应的包

StackExchange.Redis

2.封装

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();
                }
            }
        }
    }
}

3.配置

在appsettings.json文件里面添加Redis相关配置信息:

"Redis": {
	"Default": {
	  "Connection": "127.0.0.1:6379,password=888", //redis连接地址,端口号,密码
	  "InstanceName": "local", //实例名
	  "DefaultDB": "8", //Db8数据库
	}
}

在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));

4.Redis测试

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;
        }
    }
}

总结

StackExchange.Redis是由Stack Overflow开发的c#语言Redis客户端,目前使用非常广泛,本文对它的使用进行简单介绍。

ConnectionMultiplexer是StackExchange.Redis的核心,它被整个应用程序共享和重用,应该设置为单例,它的初始化如下:

// redis config
private static ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("127.0.0.1:6379,password=xxx,connectTimeout=2000");
 
 //the lock for singleton
private static readonly object Locker = new object();
 
 //singleton
private static ConnectionMultiplexer redisConn;
 
//singleton
public static ConnectionMultiplexer getRedisConn()
{
  
    if (redisConn == null)
    {
        lock (Locker)
        {
            if (redisConn == null || !redisConn.IsConnected)
            {
                redisConn = ConnectionMultiplexer.Connect(configurationOptions);
            }
        }
    }
    return redisConn;
}

ConfigurationOptions包含很多选项,例如keepAlive、connectRetry、name具体可以参考StackExchange.Redis.ConfigurationOptions。

以上就是Redis在.Net Core下的基本使用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。