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

网友投稿 1136 2022-05-30

一、.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 { ///

/// 注册分布式Redis缓存 /// /// /// 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 注入到控制器

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

///

/// 商品控制器 /// [ApiController] [Route("[controller]")] public class ProductController : ControllerBase { private readonly ConnectionMultiplexer _connectionMultiplexer; public ProductController(ConnectionMultiplexer connectionMultiplexer) { _connectionMultiplexer = connectionMultiplexer; } /// /// 查询商品 /// /// /// [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(productjson);//反序列化 return product; } #endregion } }

3.Redis测试

3.1 启动两个实例

启动两个微服务实例:5003、5004

3.2 Redis准备

bind 0.0.0.0 -::1

3.3 客户端访问

进入到浏览器对两个端口进行访问: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 _connections; public RedisHelper(string connectionString, string instanceName, int defaultDB = 0) { _connectionString = connectionString; _instanceName = instanceName; _defaultDB = defaultDB; _connections = new ConcurrentDictionary(); } ///

/// 获取ConnectionMultiplexer /// /// private ConnectionMultiplexer GetConnect() { return _connections.GetOrAdd(_instanceName, p => ConnectionMultiplexer.Connect(_connectionString)); } /// /// 获取数据库 /// /// /// 默认为0:优先代码的db配置,其次config中的配置 /// 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下的基本使用。

Redis 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Terraform配置缓存
下一篇:云部署模型
相关文章