Redis 组件

目前Aegis提供的Redis组件是基于FreeRedis来实现的,RedisClient就是FreeRedis提供的客户端(参考链接)。

如何引入

Nuget

我们需要在项目中引用Aegis.Caching.Redis包
目前最新版本是2.1.0-preview1,提供了完善的脚本管理器

image.png

配置文件设置

首先需要在appsettings.json或者其他引入的配置文件中配置Redis组件的基本配置 image.png

单实例模式配置:

"Redis": {
    "RedisMode": "Standalone",
    "ConnectionString": "192.168.10.49:6392",
    "SentinelString": "",
    "IsRWSplitting": true,
    "ScriptPath": "{CurrentDirectory}/Scripts/"
}
属性名称 属性详解
RedisMode 填写下列四个之一Standalone、MasterSlave、Sentinel、Cluster,分别是单实例、主从、哨兵和群集
ConnectionString 连接字符串,如果是集群模式“192.168.10.49:6392;192.168.10.49:6393”使用;进行分割
SentinelString 哨兵连接字符串
IsRWSplitting 是否开启读写分离,常用与主从模式
ScriptPath 脚本路径:可以用于配置lua脚本的地址,没有脚本可设置为空

哨兵模式配置:

"Redis": {
    "RedisMode": "Sentinel",
    "ConnectionString": "192.168.10.49:16391;192.168.10.50:16392;192.168.10.51:16393", //注意哨兵模式下这里的配置应该是哨兵的端口
    "SentinelString": "mymaster,defaultDatabase=1", 
    "IsRWSplitting": true,
    "ScriptPath": "{CurrentDirectory}/Scripts/"
}

定义RedisSource

创建RedisSourceBase的实现类 image.png

代码如下:

public class HisRedisSource : RedisSourceBase
{
  public HisRedisSource(RedisOptions redisOptions) : base(redisOptions) { 

  }
}

需要注意的是,RedisSource可以定义多个实现类,如果在项目中需要连接多个Redis时,请创建多个RedisSource的实现类

绑定配置注入到容器中

在API项目里的Startup中,ConfigureServices方法中注入刚刚创建好的RedisSource实现类到容器内,同时利用ConfigManager.Get来获取配置并传入。

image.png

这里的Redis实际上是上面定义的节点名,可以自定义任意的节点名,只需要符合上面的配置格式就行。

 services.AddRedisSource<HisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));


如何使用RedisSource

在任意类中的构造函数都可以获取RedisSource实例 常见于Repository和Services image.png


脚本管理器

RedisSource.Scripts提供了脚本管理器的功能,可以用于管理脚本和快速调用脚本,目前不提供移除脚本功能。

配置中的ScriptPath处可以填入定义好的脚本位置,初始化时,会将对应目录下的脚本(*.lua)统一加载到Redis中,同时会将脚本名作为Key,使用Key来调用指定脚本。比如GetBiLocker.lua的脚本,在加载后就会以GetBiLocker的Key存在Scripts中。

在配置里,{CurrentDirectory}被视为占位符,在运行时会自动替换为当前程序运行目录。

注意,这里如果有值,就需要确保对应文件夹存在,否则设置为空字符串就行。

脚本管理

追加指定脚本文件 ,需要注意的是,脚本文件只认lua后缀,文件名会作为最终的Key。

_redis.Scripts.AddScriptByPath("C:\\XXX.lua");

追加脚本

_redis.Scripts.AddScript("script key","lua content");

调用脚本

_redis.Scripts.ExecuteScript("script key", "redis key", object[] args);

RedisClient

可以通过RedisSource.RedisClient来获取Redis客户端来执行具体命令。

常见用法

  1. 用于检查给定 key 是否存在
    var isExists = await _redis.RedisClient.ExistsAsync("xxx");
    
  2. 用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型
    _redis.RedisClient.SetAsync("key", item, 时间);
    
  3. 用于获取指定 key 的值。如果 key 不存在,返回 nil
    var item = await _redis.RedisClient.GetAsync<List<MediclBasicCodeEntity>>("xxx");
    
  4. 用于删除已存在的键。不存在的 key 会被忽略
    await _redis.RedisClient.DelAsync("xxx");
    
  5. 移除集合中一个或多个成员
    _redis.RedisClient.SRem("key", seqs);
    
  6. 向集合添加一个或多个成员
    _redis.RedisClient.SAdd(guid, seqs);
    
  7. 返回给定所有集合的差集
    _redis.RedisClient.SDiff(guid, RedisKeyConsts.AutomaticInvoicingSet);
    

更多命令和资料参考链接

Redis中文文档:https://www.tkcnn.com/redis/commands/Srem.html FreeRedis:https://freesql.net/guide/freeredis.html 菜鸟教程Redis:https://www.runoob.com/redis/redis-tutorial.html

results matching ""

    No results matching ""