当前位置: 移动技术网 > IT编程>开发语言>.net > StackExchange.Redis 系列 1:基础使用

StackExchange.Redis 系列 1:基础使用

2020年01月09日  | 移动技术网IT编程  | 我要评论

旧口高中,装修除味,与施从事书阅读答案

本系列博文已经全部完成,完整系列请访问: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();
    }
}

测试效果:

image

服务器命令

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

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

目前支持的方法如下

image

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网