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. 《浅谈F5健康检查常用的几种方式》—那些你应该知道的知识(二)

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/sinat_17736151/articl ...

  2. 新概念英语第二册Lesson5:No wrong numbers

    Lesson 5 No wrong numbers 无错号之虞 First listen and then answer the question. 听录音,然后回答以下问题. What does ' ...

  3. centos下如何开放某个端口?

    命令如下: firewall-cmd --permanent --add-port=/tcp (开放22端口) firewall-cmd --reload

  4. iOS textFiledView,label自适应高度

    CGSize constraintSize; constraintSize.width = 320; constraintSize.height = MAXFLOAT; CGSize sizeFram ...

  5. (转载)文献可视化--vosviewer入门

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/weixin_42613298/artic ...

  6. bladex调用网关使用oauth2统一获取授权

    一:启动网关服务(需要启动其它服务,如:AuthApplication .UserApplication.BladeLogApplication,及自己添加的代码服务) 二:http://localh ...

  7. php程序无法记录log情况下可尝试下面方法记录log

    error_reporting(E_ERROR | E_PARSE); function shutdownCallback(){    $arrError = error_get_last(); // ...

  8. 《MySQL必知必会》学习笔记——附录B 样例表

    附录B 样例表 本附录简要描述本书中所用的表及它们的用途. 编写SQL语句需要对基础数据库的设计有良好的理解.不知道什么信息存储在什么表中,表之间如何关联以及行内数据如何分解,是不可能编写出高效的SQ ...

  9. html如何修改hr水平直线的粗细

    hr是常见的超文本标签,是一条水平直线,要设置该直线变粗一些.可以先把hr本身的border隐藏掉,然后设置border-top-width,也就是只留上边框,如图:hr的默认高度height是0,所 ...

  10. phpstudy 8.0 安装redis并使用,解决phpstudy 8.0直接启用redis使用不了

    目前phpstudy 8.0直接安装redis启用,是用不了的 在phpstudy 8.0环境面板中找到redis安装后: 打开redis安装目录配置文件redis.windows.conf配置red ...