欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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();
    }
}

测试效果:

StackExchange.Redis 系列 1:基础使用

服务器命令

若要使用服务器命令,需要通过 connectionmultiplexer 对象获取 server 对象,如下:

var server = _redis.getserver($"{_redissettings.address}:{_redissettings.port},allowadmin=true");
server.scriptexists("scripts here");

目前支持的方法如下

StackExchange.Redis 系列 1:基础使用