Redis 组件
目前Aegis提供的Redis组件是基于FreeRedis来实现的,RedisClient就是FreeRedis提供的客户端(参考链接)。
如何引入
Nuget
我们需要在项目中引用Aegis.Caching.Redis包
目前最新版本是2.1.0-preview1,提供了完善的脚本管理器
配置文件设置
首先需要在appsettings.json
或者其他引入的配置文件中配置Redis组件的基本配置
单实例模式配置:
"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
的实现类
代码如下:
public class HisRedisSource : RedisSourceBase
{
public HisRedisSource(RedisOptions redisOptions) : base(redisOptions) {
}
}
需要注意的是,RedisSource可以定义多个实现类,如果在项目中需要连接多个Redis时,请创建多个RedisSource的实现类
绑定配置注入到容器中
在API项目里的Startup中,ConfigureServices方法中注入刚刚创建好的RedisSource实现类到容器内,同时利用ConfigManager.Get来获取配置并传入。
这里的Redis实际上是上面定义的节点名,可以自定义任意的节点名,只需要符合上面的配置格式就行。
services.AddRedisSource<HisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));
如何使用RedisSource
在任意类中的构造函数都可以获取RedisSource实例
常见于Repository和Services
脚本管理器
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客户端来执行具体命令。
常见用法
- 用于检查给定 key 是否存在
var isExists = await _redis.RedisClient.ExistsAsync("xxx");
- 用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型
_redis.RedisClient.SetAsync("key", item, 时间);
- 用于获取指定 key 的值。如果 key 不存在,返回 nil
var item = await _redis.RedisClient.GetAsync<List<MediclBasicCodeEntity>>("xxx");
- 用于删除已存在的键。不存在的 key 会被忽略
await _redis.RedisClient.DelAsync("xxx");
- 移除集合中一个或多个成员
_redis.RedisClient.SRem("key", seqs);
- 向集合添加一个或多个成员
_redis.RedisClient.SAdd(guid, seqs);
- 返回给定所有集合的差集
_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