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",
}
}
}
}
}