StackExchange.Redis 系列 1:基础使用
程序员文章站
2022-04-06 10:51:41
本系列博文已经全部完成,完整系列请访问: "https://blog.zhuliang.ltd/tags/StackExchange Redis%E7%B3%BB%E5%88%97/" 本文转自: "https://blog.zhuliang.ltd/2020/01/redis/StackExcha ......
本系列博文已经全部完成,完整系列请访问:https://blog.zhuliang.ltd/tags/stackexchange-redis%e7%b3%bb%e5%88%97/
本文转自:https://blog.zhuliang.ltd/2020/01/redis/stackexchangeredis-basicusage.html
- 本系列博文是“伪”官方文档翻译,并非完全将官方文档进行翻译,而是我在查阅、测试原始文档并转换为自己东西后进行的“准”翻译。
- 原始文档见此:https://stackexchange.github.io/stackexchange.redis/
- 本系列本博文基于 redis 5.0.6,系列中部分博文跟官方文档有出入,有不同见解 / 说明不当的地方,还请大家不吝拍砖。
connectionmultiplexer 说明
命名空间位于:stackexchange.redis.connectionmultiplexer
- connectionmultiplexer 是 stackexchange.redis 的核心对象,内部继承了 idisposable,但建议不要用 using 以便可以愉快重用,你就认为它足够安全吧。
- 该对象线程安全,且应该被重用,搞成单例即可,不要每次操作都创建一个。
主从库示例:
connectionmultiplexer redis = connectionmultiplexer.connect("server1:6379,server2:6379");
项目中调用实例
说明:示例基于 .net core 2.1,通过 ioc 进行注入,生命周期为“单例”。
如果不通过 ioc 的话建议直接使用“单例模式”。
public class redisclient : icache { private readonly redissettings _redissettings; private static idatabaseasync _db; public redisclient(ioptions<redissettings> redissettings) { _redissettings = redissettings.value; var redis = connectionmultiplexer.connect($"{_redissettings.address}:{_redissettings.port}"); _db = redis.getdatabase(_redissettings.database); } #region implementation of icache public async task<bool> setstringasync(string key, string content) { return true; } public async task<string> getstringasync(string key) { var result = await _db.stringgetasync(key); return result; } #endregion }
其他一些建议和说明
-
stackexchange.redis 有 3种主要使用机制:
- 同步
- 异步:建议优先使用异步方法而不是同步方法。
- 即发即忘(fire-and-forget):当你不需要响应结果的时候,可以使用这种机制,被调用方法会立马返回,但操作会在后台进行执行。。
- “即发即忘”机制补充:stackexchange.redis 的方法中都有 commandflags 枚举,默认值是 “none”,当你需要使用“即发即忘”机制的时候,需要在方法上显示指定 commandflags.fireandforget,需要注意:
- 如果返回值是一个字符串类型,则将总是返回 null。
- 如果返回值是一个 int64 类型,则将总是返回 0。
- 需要注意的是,如果返回值是一个 boolean,则返回的是 false(但操作是成功的,此时不要用该返回值作为你后续业务的判断依据)。
db.stringincrement(cachekey, flags: commandflags.fireandforget);
- stackexchange.redis.idatabase 的一些方法,是根据 redis 的数据类型来进行命名的,如 idatabase.stringget,这里的 stringget 表示的是获取一个 string ,跟 c# 中的字符串并非表示同一个东西,可参考:关于 redis 的数据类型。
发布/订阅
- 发布/订阅不需要指定 database
例子:
客户端
private readonly redissettings _redissettings; private static idatabaseasync _db; private static connectionmultiplexer _redis; public redisclient(ioptions<redissettings> redissettings) { _redissettings = redissettings.value; _redis = connectionmultiplexer.connect($"{_redissettings.address}:{_redissettings.port}"); _db = _redis.getdatabase(_redissettings.database); } public async task subscribe(string channel, action<redischannel, redisvalue> fun) { var sub = _redis.getsubscriber(); await sub.subscribeasync(channel, fun); } public async task publish(string channel, string message) { var sub = _redis.getsubscriber(); await sub.publishasync(channel, message); }
订阅者
class program { static void main(string[] args) { var builder = new configurationbuilder().addjsonfile("appsettings.json"); var configuration = builder.build(); var subscriber = configuration["subscriber"]; var settings = configuration.getsection("redissettings").get<redissettings>(); var redisclient = new redisclient(settings); redisclient.subscribe(settings.channelname, (channel, message) => { system.console.writeline($"{subscriber}:{message}"); }).wait(); system.console.writeline("started"); system.console.readkey(); } }
测试效果:
服务器命令
若要使用服务器命令,需要通过 connectionmultiplexer 对象获取 server 对象,如下:
var server = _redis.getserver($"{_redissettings.address}:{_redissettings.port},allowadmin=true"); server.scriptexists("scripts here");
目前支持的方法如下