.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系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...
随机推荐
- PHP中Cookie与 Session
在非常多时候,我们需要跟踪浏览者在整个网站的活动,对他们身份进行自动或半自动的识别(也就是平时常说的网站登陆之类的功能),这时候,我们常采用 Cookie与 Session 来跟踪和判断. Sess ...
- Beacon Designer 8.14 下载及破解
先安装 Beacon Designer 8.14 下载地址 http://1.download.minixiazai.com/pc/Beacon.Designer.8_po.ziphttp://www ...
- Android studio 运行打包 Ionic 项目
1.创建项目 ionic start myapp tabs 2.cd 到项目文件夹中 3.ionic cordova platfrom add android 执行这个命令后建议修改一下应用包名称,参 ...
- ISO/IEC 9899:2011 条款6.7.10——静态断言
6.7.10 静态断言 语法 1.static-assert_declaration: _Static_assert ( constant-expression , strin ...
- Python3入门(十三)——常用内置模块之时间日期模块datatime
1.日期时间模块——datatime //其他模块例如time.calender等模块暂不展开 (1)获取当前时间:datatime.now(): from datetime import datet ...
- Spring cloud微服务安全实战-5-9实现基于session的SSO(Token有效期)
token的有效期 会出现一种情况session有效期还没到.但是token过期了. 用户登陆着,但是token失效了 没法访问服务了. 刷新令牌要和clientId和ClientSecret一起用, ...
- 【Redis】Redis Sentinel 哨兵模式搭建
Redis Sentinel介绍 Redis Sentinel是Redis的官方高可用性解决方案 Redis Sentinel为Redis提供高可用性.实际上,这意味着使用Sentinel可以创建一个 ...
- CGI = MCC + MNC + LAC + CI
CGI = MCC + MNC + LAC + CI 摘自:http://www.360doc.com/content/19/0801/10/65611272_852334484.shtml CGI是 ...
- 报错:java.lang.AbstractMethodError: nl.techop.kafka.KafkaHttpMetricsReporter.logger()Lcom/typesafe/scalalogging/Logger;
报错背景: CDH启动kafka的时候出现报错情况,并且报错的节点挂掉. 报错现象: Exiting Kafka due to fatal exception java.lang.AbstractMe ...
- Spring MVC 数据转换和格式化
HttpMessageConverter和JSON消息转换器 HttpMessageConverter是定义从HTTP接受请求信息和应答给用户的 HttpMessageConverter是一个比较广的 ...