.net core使用CSRedisCore连接哨兵集群,并用作redis使用分布式缓存。
CSRedisCore是国内大佬出品的一个Redis-Cli-SDK。
Github地址:https://github.com/2881099/csredis
使用此插件作为分布式缓存也十分简单。
一、asp.net core 3.0中使用分布式缓存。
注意:IDistributedCache是asp.net core中提供的缓存接口。提供了一些基本的方法。
使用Caching.CSRedis可以方便的实现IDistributedCache接口。
// 通过Caching.CSRedis实现IDistributedCache
services.AddSingleton<IDistributedCache>(new CSRedisCache(new CSRedisClient("127.0.0.1:6379")));
此时就可以在构造函数中注入IDistributedCache接口使用了。
public WeatherForecastController(ILogger<WeatherForecastController> logger, IDistributedCache distributedCache)
{
_logger = logger;
_distributedCache = distributedCache;
}
[HttpGet]
public IEnumerable<WeatherForecast> GetDistributeCacheData(string key)
{
var cache = _distributedCache.Get(key);
if (cache == null)
{
// 这里应该上锁,否则同时会有多个请求,单机测试无所谓。
// 模拟获取数据
Thread.Sleep();
var result = GetDataByDatabase(key); //放到缓存。
_distributedCache.Set(key, JsonSerializer.SerializeToUtf8Bytes(result)); return result;
}
else
{
return JsonSerializer.Deserialize<WeatherForecast[]>(cache);
}
}
使用起来十分简单。
二、使用Session。
asp.net core 3.0中,使用Session是需要IDistributedCache支持的,即使在单机中使用,也要使用基于内存的分布式缓存。
// 如果不实现IDistributedCache将会异常。
services.AddSession();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSession();
}
虽然我在上面注入了IDistributedCache接口的实现,已经可以使用Session了,但是我不能区分数据Redis和SessionRedis容器,Session和其他所有的缓存都将放在一个Redist容器中。
要解决这个问题,则需要注入新的接口。
还是基于CSRedisCore修改。
以下基于Caching.CSRedis的源码修改。
// 继承分布式缓存接口。
public interface IDistributedSessionCache : IDistributedCache
使用自定义类继承默认实现。
/// <summary>
/// 自定义RedisSession缓存。
/// </summary>
public class DistributedRedisSessionStore : DistributedSessionStore
{
/// <summary>
/// 构造函数。
/// </summary>
/// <param name="cache">自定义RedisSession缓存,此处使用继承默认接口的自定义接口。</param>
/// <param name="loggerFactory">日志工厂。</param>
public DistributedRedisSessionStore(IDistributedSessionCache cache, ILoggerFactory loggerFactory) : base(cache, loggerFactory)
{
}
}
扩展依赖注入方法
public static IServiceCollection AddRedisSession(this IServiceCollection services)
{
services.TryAddTransient<ISessionStore, DistributedRedisSessionStore>();
services.AddDataProtection();
return services;
}
依赖注入方法
// 连接Redis的容器,此时6380端口。
services.AddSingleton<IDistributedSessionCache>(new CSRedisSessionCache(new CSRedisClient("127.0.0.1:6380")));
services.AddRedisSession();
一个简单的测试方法
[HttpGet]
public IActionResult GetSessionData(string key)
{
var msg = HttpContext.Connection.LocalPort.ToString();
DateTime dateTime = default;
if (HttpContext.Session.TryGetValue(key, out var value))
dateTime = JsonSerializer.Deserialize<DateTime>(value);
else
{
dateTime = DateTime.Now;
HttpContext.Session.Set(key, JsonSerializer.SerializeToUtf8Bytes(dateTime));
} _logger.LogInformation($"本次连接端口{msg},通过Session获得时间值{dateTime}");
return new JsonResult(dateTime);
}
此时,我在docker停止了6379(普通数据缓存容器),Session依然没有问题。

普通数据容器已经挂了

分别启用端口5002和5003,进行分布式session是否有效。

可以看到是有效的。
区分Session容器和普通数据缓存的代码。
github: https://github.com/yeqifeng2288/Microsoft.Extensions.Caching.CSRedis.Session
.net core使用CSRedisCore连接哨兵集群,并用作redis使用分布式缓存。的更多相关文章
- 在tomcat集群环境下redis实现分布式锁
上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...
- docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接
花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...
- 走进Redis:哨兵集群
为什么需要哨兵 在 Redis 的主从库模式中,如果从库发生了故障,用户的操作是可以继续进行的,因为写操作是只在主库中进行的.那么,如果主库发生了故障,用户的操作将会收到影响.这时候可能会需要选择一个 ...
- python连接redis哨兵集群
一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...
- C#两大知名Redis客户端连接哨兵集群的姿势
前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...
- 深入浅出Redis-redis哨兵集群
1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...
- Redis进阶实践之十 Redis哨兵集群模式
一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
- redis哨兵集群+spring boot 2.×
Ubuntu集群构建篇 redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆 redis-cli -h ${host} -p ${port} -a ${password} ...
- redis系列--深入哨兵集群
一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...
随机推荐
- js中const,var,let区别与用法(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_36784628/article/d ...
- .NET Core入门程序
易百教程 https://www.yiibai.com/dotnet_core/dotnet_core_getting_started.html
- jsoup爬取某网站安全数据
jsoup爬取某网站安全数据 package com.vfsd.net; import java.io.IOException; import java.sql.SQLException; impor ...
- Swift4.0复习基本语法简介
1.五种类型: 包含五种类型——枚举(enum).结构体(struct).类(class).协议( protocol)以及函数类型(function types). 2.变量对象:var 3.常量对象 ...
- JS获当前网页元素高度offsetHeight
本文测试的是offsetHeight,获取网页中某元素的高度,单位是像素,获取的类型是整型,可以进行数字运算.如图,网页中的元素本身的高度包括,自身的内容+padding+border,而margin ...
- 创建Dockerfile
https://mp.weixin.qq.com/s?__biz=MzU0Mzk1OTU2Mg==&mid=2247483900&idx=1&sn=584962b8b6f24c ...
- app--Android 稳定性测试方案
标准的崩溃日志:Android 应用一般使用 Java 语言开发,在不作特殊处理的情况下,遇到未处理的异常时,会弹框提示“程序遇到异常,即将退出”(有些手机框中提示语不同, 或不弹框).同时会将异常的 ...
- Flutter中的日期插件date_format 中文 国际化 及flutter_cupertino_date_picker
今天我们来聊聊Flutter中的日期和日期选择器. Flutter中的日期和时间戳 //日期时间戳转换 var _nowTime = DateTime.now();//获取当前时间 print(_no ...
- 对象的加减乘除运算demo
1 class Square: 2 def __init__(self, wh): #因为是正方形, 只取一条边的长度 3 if isinstance(wh,(int,float)): 4 self. ...
- Django 高级视图
一.Django限制请求method 常用的请求method: GET请求:GET请求一般用来向服务器索取数据,但不会向服务器提交数据,不会对服务器的状态进行更改.比如向服务器获取某篇文章的详情. P ...