官网: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的,如果长时间不使用就会被回收,但是理想的使用情况是可以是复用对象,而不是简短使用然后被回收掉。
IDatabase db = redis.GetDatabase();
这个对象is a cheap object,不要保存,每次使用直接创建即可。
同样,GetDatabase的重载可以让你选择redis库,如果打算使用异步API并且需要Task.AsyncState有值时,都可在创建时指定 。
获取了Database对象之后,就可以使用Redis API.
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");
为了监控或维护目的,我们有时需要执行一些服务器级别的命令。
IServer server = redis.GetServer("localhost",6379);
同样这个对象也是容易创建,并且支持异步。
EndPoint[] endpoints = redis.GetEndPoints(); // 获取可用的redis结点
GetServer支持以EndPoint或键值对为参数去确定一个服务器。
有了IServer对象,就可以执行Redis Server Commands了,如server.LastSave()
操作在方法返回给调用者之前完成,注意的是这会阻塞当前的调用者,但是不会阻塞其它调用者,尽管你是在并行的调用者共享使用同一个connection。
操作会在未来某个时间完成,但是Task或Task会立即返回,你可以:.Wait() or .ContinueWith or awaited 。
异步API都会以Async为后缀,并且你可以使用 await。
对结果没兴趣,忽略结果继续执行。
所有方法都有一个 CommandFlags flags 的可选参数,默认none,传递 CommandFlags.FireAndForget 时,会启用此模式:方法会立即返回默认值(如返回String的会立即返回null,返回Int64的会立即返回0),然后操作在后台继续执行。
db.StringIncrement(pageKey,flags:CommandFlags.FireAndForget);
var conn = ConnectionMultiplexer.Connect(configuration);
逗号分隔,配置项=配置值,6379默认端口,SSL默认端口6380,以$开始的标识用来表示命令映射
例:localhost 使用本地,默认端口
localhost:6380,otherhost:6380,allowAdmin=true
两者相互转换:
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
可以让使用一个服务器的方式使用调用多个Redis实例工具,链接地址:https://github.com/twitter/twemproxy
配置
var options = new ConfigurationOptions
{
EndPoints = { "my-server" },
Proxy = Proxy.Twemproxy
};
StackExchange.Redis会自动解析主/从节点,但是如果你使用使用管理工具或集群,可能会出现多个主节点。为了解决这个问题,StackExchange.Redis会使用一个key是“__Booksleeve_TieBreak”去决定一个优先的主节点。
另外,如果配置项改变,为了让连接的实例接收到配置已更改,StackExchange.Redis会自动发布一个发布/订阅的通道,这个改变会被推送,默认设置为"__Booksleeve_MasterChanged"。
这两个项都可以配置,通过 .ConfigurationChannel 和 .TieBreaker 配置节;可以禁用,设为空值。
这些设置同样会被IServer.MakeMaster() 使用,用来设置 tie-breaker和广播配置更改消息。配置更改消息也可以通过ConnectionMultiplexer.PublishReconfigure方法通知。