小解Redis 系列

官网:http://redis.io/

推荐一个开源组件:StackExchange.Redis

https://github.com/StackExchange/StackExchange.Redis

主要类是 StackExchange.Redis.ConnectionMultiplexer,它隐藏了多个Redis服务器的细节,它设计用于在多个调用方共享和复用,也就是说不要在每个调用都创建新的。我们要保证绝对的线程安全,创建之后保存以供使用。

我们可以使用 ConnectionMultiplexer.Connect or ConnectionMultiplexer.ConnectAsync 来创建。

ConnectionMultiplexer redis = ConnectionMultiplexer.Connection("localhost");

要注意的是ConnectionMultiplexer是实现了IDispose的,如果长时间不使用就会被回收,但是理想的使用情况是可以是复用对象,而不是简短使用然后被回收掉。

三种典型使用场景

访问 Redis Database

IDatabase db = redis.GetDatabase();

这个对象is a cheap object,不要保存,每次使用直接创建即可。

同样,GetDatabase的重载可以让你选择redis库,如果打算使用异步API并且需要Task.AsyncState有值时,都可在创建时指定 。

获取了Database对象之后,就可以使用Redis API.

Using Redis Pub/Sub

ISubscriber sub = redis.GetSubscriber();

同样这个对象is a cheap object,不用保存。

pub/sub api 没有数据库选择的概念,同样也有异步模式。即所有的订阅都是全局的,并且与ISubscriber对象的生成周期无关。pub/sub 使用命名管道,并且这个管道不必事先在服务端定义。

// 订阅
sub.Subscribe("message",(channel,message) => {

Console.WriteLine((String)message);

});

// 发布
sub.Publish("message","hello");

访问 Redis Server (监控维护 maintenance / monitoring)

为了监控或维护目的,我们有时需要执行一些服务器级别的命令。

IServer server = redis.GetServer("localhost",6379);

同样这个对象也是容易创建,并且支持异步。

EndPoint[] endpoints = redis.GetEndPoints(); // 获取可用的redis结点

GetServer支持以EndPoint或键值对为参数去确定一个服务器。

有了IServer对象,就可以执行Redis Server Commands了,如server.LastSave()

三种使用方式

同步 synchronous

操作在方法返回给调用者之前完成,注意的是这会阻塞当前的调用者,但是不会阻塞其它调用者,尽管你是在并行的调用者共享使用同一个connection。

异步 asynchronous

操作会在未来某个时间完成,但是Task或Task会立即返回,你可以:.Wait() or .ContinueWith or awaited 。

异步API都会以Async为后缀,并且你可以使用 await。

Fire-and-Forget

对结果没兴趣,忽略结果继续执行。

所有方法都有一个 CommandFlags flags 的可选参数,默认none,传递 CommandFlags.FireAndForget 时,会启用此模式:方法会立即返回默认值(如返回String的会立即返回null,返回Int64的会立即返回0),然后操作在后台继续执行。

db.StringIncrement(pageKey,flags:CommandFlags.FireAndForget);

配置

var conn = ConnectionMultiplexer.Connect(configuration);

configuration 两种方式:

1,字符串

逗号分隔,配置项=配置值,6379默认端口,SSL默认端口6380,以$开始的标识用来表示命令映射

例:localhost 使用本地,默认端口

localhost:6380,otherhost:6380,allowAdmin=true

2,ConfigurationOptions 对象

两者相互转换:

ConfigurationOptions options = ConfigurationOptions.Parse(configString);

options.ToString();

大部分的命令都有默认值,但是有些时候需要更多的信息以达到目的,如禁用一些命令:

ConfigurationOptions config = new ConfigurationOptions

{

EndPoints =

{

{ "redis0", 6379 },

{ "redis1", 6380 }

},

CommandMap = CommandMap.Create(new HashSet<string>

{ // EXCLUDE a few commands

"INFO", "CONFIG", "CLUSTER",

"PING", "ECHO", "CLIENT"

}, available: false),

KeepAlive = 180,

DefaultVersion = new Version(2, 8, 8),

Password = "changeme"

};

字符串形式:

redis0:6379,redis1:6380,keepAlive=180,version=2.8.8,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=

重命名命令

var commands = new Dictionary<string,string> {

{ "info", null }, // disabled

{ "select", "use" }, // renamed to SQL equivalent for some reason

};

var options = new ConfigurationOptions {

// ...

CommandMap = CommandMap.Create(commands),

// ...

}

或者

$INFO=,$SELECT=use

Twemproxy

可以让使用一个服务器的方式使用调用多个Redis实例工具,链接地址:https://github.com/twitter/twemproxy

配置

var options = new ConfigurationOptions

{

EndPoints = { "my-server" },

Proxy = Proxy.Twemproxy

};

Tiebreakers和配置更改声明

StackExchange.Redis会自动解析主/从节点,但是如果你使用使用管理工具或集群,可能会出现多个主节点。为了解决这个问题,StackExchange.Redis会使用一个key是“__Booksleeve_TieBreak”去决定一个优先的主节点。

另外,如果配置项改变,为了让连接的实例接收到配置已更改,StackExchange.Redis会自动发布一个发布/订阅的通道,这个改变会被推送,默认设置为"__Booksleeve_MasterChanged"。

这两个项都可以配置,通过 .ConfigurationChannel 和 .TieBreaker 配置节;可以禁用,设为空值。

这些设置同样会被IServer.MakeMaster() 使用,用来设置 tie-breaker和广播配置更改消息。配置更改消息也可以通过ConnectionMultiplexer.PublishReconfigure方法通知。

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2015-10-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

ls 命令还能这么玩?看一下这 20 个实用范例

20840
来自专栏Java帮帮-微信公众号-技术文章全总结

RabbitMQ详解解答【面试+工作】

如果安装rabbitMQ首先安装基于erlang语言支持的OTP软件,然后在下载rabbitMQ软件进行安装(安装过程都是下一步,在此不在说了)

37110
来自专栏小程序解决方案的专栏

Wafer2 Node.js QuickStart 架构分析

Wafer2 的 Node.js QuickStart 采用了 Koa.js 框架编写,Koa 将整个请求过程看做全异步的操作,使用 Node.js 7.6 开...

6.3K60
来自专栏求索之路

Android数据层架构的实现 上篇

最近我们app的服务器吃不消了,所以我在为服务器增加缓存层之后,又想到在app端进行二级缓存以减少app对服务器的访问。我想很多app应该在项目的初期架构的时...

32780
来自专栏草根专栏

用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 + 项目准备

REST 是 Representational State Transfer 的缩写. 它是一种架构的风格, 这种风格基于一套预定义的规则, 这些规则描述了网络...

1.2K60
来自专栏抠抠空间

logging模块

函数式简单配置 import logging logging.debug('debug message') logging.info('info mes...

297120
来自专栏犀利豆的技术空间

Redis 命令的执行过程

之前写了一系列文章,已经很深入的探讨了 Redis 的数据结构,数据库的实现,key的过期策略以及 Redis 是怎么处理事件的。所以距离 Redis 的单机实...

28810
来自专栏bboysoul

使用colloide扫描网站后台

在渗透测试的时候我们通常要找一个网站的后台,但是有时候网站的后台并不是特别好找,比如我们学校的那个垃圾网站,今天用到的工具叫colloide,它是一款利用字典扫...

56640
来自专栏程序员互动联盟

【答疑释惑第三十六讲】Windows下如何调试?

疑惑一 Windows窗口程序到底能不能用printf? 很多小伙伴在控制台下写程序时,要打印或者调试很方便,用printf就可以直接打印输出,方便看结果,但是...

27640
来自专栏闵开慧

tomcat6.0下找不到jasper-runtime.jar

今天有点需求,需要用jasper-runtime.jar包。但是我在我的\apache-tomcat-6.0.16\lib目录下,怎么也找不到这个jar包。结果...

34950

扫码关注云+社区

领取腾讯云代金券