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使用分布式缓存。的更多相关文章

  1. 在tomcat集群环境下redis实现分布式锁

    上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...

  2. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  3. 走进Redis:哨兵集群

    为什么需要哨兵 在 Redis 的主从库模式中,如果从库发生了故障,用户的操作是可以继续进行的,因为写操作是只在主库中进行的.那么,如果主库发生了故障,用户的操作将会收到影响.这时候可能会需要选择一个 ...

  4. python连接redis哨兵集群

    一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...

  5. C#两大知名Redis客户端连接哨兵集群的姿势

    前言 前面利用<Docker-Compose搭建Redis高可用哨兵集群>, 我们的思路是将Redis.Sentinel.Redis Client App链接到同一个网桥网络,这个网桥内的 ...

  6. 深入浅出Redis-redis哨兵集群

    1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...

  7. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  8. redis哨兵集群+spring boot 2.×

    Ubuntu集群构建篇 redis-cli:不跟参数,默认访问localhost:6379端口,无密码登陆 redis-cli -h ${host} -p ${port} -a ${password} ...

  9. redis系列--深入哨兵集群

    一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...

随机推荐

  1. Postman使用方法示例

  2. 关于微信手机端IOS系统中input输入框无法输入的问题

    如果网站不需要阻止用户的选择内容的行为就可以使用如下样式: * { -webkit-user-select: text; -user-select: text;}另一种方式: *: not(input ...

  3. tomcat中设置Java 客户端程序的http(https)访问代理

    1.假定http/https代理服务器为 127.0.0.1 端口为8118 2.在tomcat/bin/catalina.sh脚本文件中设置JAVA_OPTS,如下图: 保存后重启tomcat就能生 ...

  4. mkimage工具的用法

    1. mkimage都支持哪些压缩格式 none, gzip, bzip2等 2. 参考资料 这里

  5. 编写第一个dart程序hello dart

    /* 入口方法的两种定义方式 main(){ print('hello dart'); } */ ///这也是一个注释 //表示main方法没有返回值 void main(){ print('hell ...

  6. shell编程系列23--shell操作数据库实战之mysql命令参数详解

    shell编程系列23--shell操作数据库实战之mysql命令参数详解 mysql命令参数详解 -u 用户名 -p 用户密码 -h 服务器ip地址 -D 连接的数据库 -N 不输出列信息 -B 使 ...

  7. ISO/IEC 9899:2011 条款6.5.5——乘法操作符

    6.5.5 乘法操作符 语法 1.multiplicative-expression: cast-expression multiplicative-expression    *    cast-e ...

  8. 代理类和AOP

    客户端不用调用目标对象了,直接调用代理类.最终目标方法还是去实行了. 代理类的每个方法调用目标类的相同方法,并且在调用方法时候加上系统功能的代码 代理和目标实现了相同的接口,有相同的方法.通过接口进行 ...

  9. ES6深入浅出-12 ES6新增的API(下)-1.录屏

    String.includes es5里面判断字符串是否存在的方法 search searcg的厉害之处是可以使用正则 match正则的方式 repeat -1遍,就不合法 startsWith 判断 ...

  10. OpenGL程序无法启动此应用程序,因为计算机中丢失glut32.dll(转))

    今天打开一个OpenGL源码,各种修改之后想要运行看一下效果,结果在我的开发环境下出现缺少相应的dll库: Windows7 64位+VS2010 提示:程序无法启动此应用程序,因为计算机中丢失glu ...