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. 使用Dapper.Contrib

    public T Query(string sql, object param) { using (IDbConnection dbConnection = Connection) { if (dbC ...

  2. Python3基础 global 在函数内部对全局变量进行修改

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  3. 有些lambda表达式就可以体现出编程中「Context(上下文)」环境

    编程中什么是「Context(上下文)」?   每一段程序都有很多外部变量.只有像Add这种简单的函数才是没有外部变量的.一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行.你为了使他们运行 ...

  4. C++接口的概念

    满足下面条件: 1.类中没有定义任何的成员变量 2.所有的成员函数都是公有的 3.所有的成员函数都是纯虚函数 4.接口是一种特殊的抽象类

  5. UCloud云盘系统安装

  6. 使用sql语句创建和删除约束示例代码

    使用sql语句创建和删除约束  约束类型 主键约束(Primary Key constraint) --:要求主键列数据唯一,并且不允许为空.  唯一约束(Unique constraint) --: ...

  7. 【Leetcode_easy】860. Lemonade Change

    problem 860. Lemonade Change solution class Solution { public: bool lemonadeChange(vector<int> ...

  8. C++标准模板库STL算法与自适应容器(栈和队列)

    参考<21天学通C++>第23与第24章节,对STL算法与自适应容器进行介绍. 实际上在前面的STL顺序容器.关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数.而自适应容器是在 ...

  9. mousedown、mouseup、click事件之间的关系及执行顺序

      三个事件的触发时机 mousedown 当鼠标指针移动到元素上方,并按下鼠标按键(左.右键均可)时,会发生 mousedown 事件.与 click 事件不同,mousedown 事件仅需要按键被 ...

  10. TypeScript(二)使用Webpack搭建环境

    今天继续来更新,本篇文章我们讲环境搭建,主要分享一些环境搭建的学习资源及安装步骤,解决一些安装时可能会出现的问题.下面就让我们一起进入学习第一步,搭建TypeScript环境:一. 环境搭建1.1. ...