Redis


  Redis 是现在最受欢迎的 NoSQL 数据库之一,它是一个使用 ANSI C 编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,一般用来存储 key-value 结构的数据。

  Fireasy 提供了对 Redis 的适配,使用 Redis 实现了 分布式缓存订阅管理器分布式锁 三种组件。


1、分布式缓存

  修改配置文件如下:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="cachings" type="Fireasy.Common.Caching.Configuration.CachingConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <cachings default="redis">
      <caching name="redis" type="Fireasy.Redis.CacheManager, Fireasy.Redis" connectionString="127.0.0.1:6379,defaultDb=2,password=">
        <config
          defaultDb="2"
          password="test123"
          connectTimeout="5s"
          syncTimeout="10s"
          ssl="true"
          dbRange="1,2,6-9"
          keyRule="left(5)"
          slidingTime="10s"
          writeBuffer="10240"
          ignoreException="true"
          serializerType="demo.Serializer, demo">
          <host server="192.168.1.1" port="6379"></host>
          <!--可简写 <host>192.168.1.1:6379</host>-->
          <!--可简写 <hosts>192.168.1.1:6379;192.168.1.2:6379</hosts>-->
          <host server="192.168.1.2" readonly="true" port="6379"></host>
        </config>
      </caching>
    </cachings>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "cachings": {
      "default": "redis",
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.CacheManager, Fireasy.Redis",
          "connectionString": "127.0.0.1:6379,defaultDb=2,password=",
          "config": {
            "defaultDb": 2,
            "password": "test123",
            "connectTimeout": "5s",
            "syncTimeout": "10s",
            "ssl": true,
            "dbRange": "1,2,6-9",
            "keyRule": "left(5)",
            "slidingTime": "10s",
            "writeBuffer": 10240,
            "ignoreException": true,
            "serializerType": "demo.Serializer, demo",
            // 可简写 hosts: [ "192.168.1.1:6379", "192.168.1.2:6379" ]
            "hosts": [
              {
                "server": "192.168.1.1",
                "port": 6379
              },
              {
                "server": "192.168.1.2",
                "readonly": true,
                "port": 6379
              }
            ]
          }
        }
      }
    }
  }
}

  参数的说明如下:

  • connectionString 完整的连接串,如果不分别设置以下参数的话,可以由 connectionString 指定。
  • defaultDb 默认使用的数据库。
  • password 登录密码。
  • connectTimeout 连接超时时间。
  • syncTimeout 同步超时时间(发送和接收超时时间)。
  • ssl 是否使用 SSL 连接。
  • dbRange 设置使用的数据库,可以使用 1,2,3,5-9 这样的格式。设置了 dbRange 后,不要再设置 defaultDb。
  • keyRule 设置了 dbRange 后,通过 key 计算出 Hash 值然后分散到不同的库里,如果 key 有一定的规律,则可以使用此参数设定 key 的规则,以便后继方便查询,比如 left(5)、right(8)。
  • slidingTime 设定滑行时间。设置此参数后,每次读取缓存时,如果过期时间小于 60 秒,则会自动在此值的基础上延长。
  • writeBuffer 设置写入的缓冲区大小。
  • ignoreException 是否在 TryGet 方法发生异常时忽略异常,然后直接使用 creator 委托返回对象。默认为 true。
  • serializerType 指定 ITextSerializer 类型(非必要)。
  • prefix 指定 Key 前缀。
  • hosts 指定主机群。
  • sentinels 指定哨兵群。

💡 哨兵模式配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="cachings" type="Fireasy.Common.Caching.Configuration.CachingConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <cachings default="redis">
      <caching name="redis" type="Fireasy.Redis.CacheManager, Fireasy.Redis" connectionString="127.0.0.1:6379,defaultDb=2,password=">
        <config
          defaultDb="2"
          password="test123"
          connectTimeout="5s"
          syncTimeout="10s"
          ssl="true"
          dbRange="1,2,6-9"
          keyRule="left(5)"
          slidingTime="10s"
          writeBuffer="10240"
          ignoreException="true"
          serializerType="demo.Serializer, demo">
          <hosts>mymaster</hosts> <!--简写-->
          <sentinels>192.168.1.1:26379;192.168.1.2:26379</sentinels> <!--简写-->
        </config>
      </caching>
    </cachings>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "cachings": {
      "default": "redis",
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.CacheManager, Fireasy.Redis",
          "connectionString": "127.0.0.1:6379,defaultDb=2,password=",
          "config": {
            "defaultDb": 2,
            "password": "test123",
            "connectTimeout": "5s",
            "syncTimeout": "10s",
            "ssl": true,
            "dbRange": "1,2,6-9",
            "keyRule": "left(5)",
            "slidingTime": "10s",
            "writeBuffer": 10240,
            "ignoreException": true,
            "serializerType": "demo.Serializer, demo",
            "hosts": [ "mymaster" ], //简写
            "sentinels": [ "192.168.1.1:26379", "192.168.1.2:26379" ] //简写
          }
        }
      }
    }
  }
}

  在 .Net Core 应用中可以使用扩展方法 AddRedisCaching 切换到 Redis 缓存,如下所示:

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy().AddRedisCaching(s => 
            {
                s.DefaultDb = 2;
                s.Password = "test123";
                s.WriteBuffer = 10240
            });
        }
    }
}

  使用 AddRedisCaching 方法,可以不再使用外部配置文件,而通过 RedisCachingOptions 参数来设置以上的各种参数。当然,如果你要继续使用配置文件的话,也可以通过 ConfigName 属性指定配置文件中的配置项。如下所示:

namespace demo
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddFireasy().AddRedisCaching(s => 
            {
                s.ConfigName = "redis"; //对应配置文件中的配置项
            });
        }
    }
}

2、订阅管理器

  修改配置文件如下:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="subscribers" type="Fireasy.Common.Subscribes.Configuration.SubscribeConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <subscribers default="redis">
      <subscriber name="redis" type="Fireasy.Redis.SubscribeManager, Fireasy.Redis" connectionString="127.0.0.1:6379,defaultDb=2,password=">
        <config
          password="test123"
          connectTimeout="5s"
          syncTimeout="10s"
          ssl="true"
          retryDelayTime="10s"
          retryTimes="5"
          serializerType="demo.Serializer, demo">
          <host server="192.168.1.1" port="6379"></host>
        </config>
      </subscriber>
    </subscribers>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "subscribers": {
      "default": "redis",
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.SubscribeManager, Fireasy.Redis",
          "connectionString": "127.0.0.1:6379,defaultDb=2,password=",
          "config": {
            "password": "test123",
            "connectTimeout": "5s",
            "syncTimeout": "10s",
            "ssl": true,
            "retryDelayTime": "10s",
            "retryTimes": 5,
            "serializerType": "demo.Serializer, demo",
            "hosts": [
              {
                "server": "192.168.1.1",
                "port": 6379
              }
            ]
          }
        }
      }
    }
  }
}

  参数的说明如下:

  • connectionString 完整的连接串,如果不分别设置以下参数的话,可以由 connectionString 指定。
  • password 登录密码。
  • connectTimeout 连接超时时间。
  • syncTimeout 同步超时时间(发送和接收超时时间)。
  • ssl 是否使用 SSL 连接。
  • retryDelayTime 发布或订阅时重试的延迟时间。
  • retryTimes 发布或订阅失败后可以重试的次数。
  • serializerType 指定 ITextSerializer 类型(非必要)。
  • prefix 指定 Key 前缀。
  • hosts 指定主机群。
  • sentinels 指定哨兵群。

  在 .Net Core 应用中可以使用扩展方法 AddRedisSubscriber 切换到 Redis 发布订阅,使用方法与 AddRedisCaching 相似。


3、分布式锁

  修改配置文件如下:

  • .Net Framework 下的 app.config 或 web.config 文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="fireasy">
      <section name="lockers" type="Fireasy.Common.Threading.Configuration.LockerConfigurationSectionHandler, Fireasy.Common" />
    </sectionGroup>
  </configSections>
  <fireasy>
    <lockers default="redis">
      <locker name="redis" type="Fireasy.Redis.RedisLocker, Fireasy.Redis" connectionString="127.0.0.1:6379,defaultDb=2,password=">
        <config
          defaultDb="2"
          password="test123"
          connectTimeout="5s"
          syncTimeout="10s"
          ssl="true"
          dbRange="1,2,6-9"
          keyRule="left(5)"
          lockTimeout="10s">
          <host server="192.168.1.1" port="6379"></host>
        </config>
      </locker>
    </lockers>
  </fireasy>
</configuration>
  • .Net Core 下的 appsettings.json 文件
{
  "fireasy": {
    "lockers": {
      "default": "redis",
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.RedisLocker, Fireasy.Redis",
          "connectionString": "127.0.0.1:6379,defaultDb=2,password=",
          "config": {
            "defaultDb": 2,
            "password": "test123",
            "connectTimeout": "5s",
            "syncTimeout": "10s",
            "ssl": true,
            "dbRange": "1,2,6-9",
            "keyRule": "left(5)",
            "lockTimeout": "10s"
            "hosts": [
              {
                "server": "192.168.1.1",
                "port": 6379
              }
            ]
          }
        }
      }
    }
  }
}

  参数的说明如下:

  • connectionString 完整的连接串,如果不分别设置以下参数的话,可以由 connectionString 指定。
  • defaultDb 默认使用的数据库。
  • password 登录密码。
  • connectTimeout 连接超时时间。
  • syncTimeout 同步超时时间(发送和接收超时时间)。
  • ssl 是否使用 SSL 连接。
  • dbRange 设置使用的数据库,可以使用 1,2,3,5-9 这样的格式。设置了 dbRange 后,不要再设置 defaultDb。
  • keyRule 设置了 dbRange 后,通过 token 计算出 Hash 值然后将锁分散到不同的库里,如果 token 有一定的规律,则可以使用此参数设定 token 的规则,以便后继方便查询,比如 left(5)、right(8)。
  • lockTimeout 加锁的超时时间。
  • prefix 指定 Key 前缀。
  • hosts 指定主机群。
  • sentinels 指定哨兵群。

  在 .Net Core 应用中可以使用扩展方法 AddRedisDistributedLocker 切换到 Redis 分布式锁,使用方法与 AddRedisCaching 相似。


4、统一配置

  如果一个应用程序中同时使用缓存、分布式锁 或 消息订阅,可以使用统一的一组配置,如下所示:

{
  "fireasy": {
    "redis": {
      "defaultDb": 2,
      "password": "test123",
      "connectTimeout": "5s",
      "syncTimeout": "10s",
      "ssl": true,
      "dbRange": "1,2,6-9",
      "keyRule": "left(5)",
      "lockTimeout": "10s"
      "hosts": [
        {
          "server": "192.168.1.1",
          "port": 6379
        }
      ]
    },
    "cachings": {
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.CacheManager, Fireasy.Redis",
        }
      }
    },
    "subscribers": {
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.SubscribeManager, Fireasy.Redis",
        }
      }
    },
    "lockers": {
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.RedisLocker, Fireasy.Redis",
        }
      }
    }
  }
}

4、使用 StackExchange.Redis

  现在也支持 StackExchange.Redis 的适配,只需将 Fireasy.Redis 换成 Fireasy.StackExchange.Redis,并将配置文件里的 type 程序集部分改成 Fireasy.StackExchange.Redis 即可。

  特别说明的一点,使用 StackExchange.Redis 需要注意最小线程数的设置。在配置里提供了 minIoThreads 的设置,如下所示:

{
  "fireasy": {
    "redis": {
      "defaultDb": 2,
      "password": "test123",
      "minIoThreads": 100,
      "hosts": [
        {
          "server": "192.168.1.1",
          "port": 6379
        }
      ]
    },
    "cachings": {
      "settings": {
        "redis": {
          "type": "Fireasy.Redis.CacheManager, Fireasy.StackExchange.Redis",
        }
      }
    }
  }
}