【愚公系列】2022年05月 .NET架构班 044-分布式中间件 .Net Core下使用Redis
【摘要】 一、.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)