Open fengzhbo opened 8 years ago
请教一下,Redis中设置一主一从,客户端使用 StackExchange.Redis 持续访问Redis 存取数据。 不知是否支持当Redis主down后,保持客户端的存取操作不受影响。
@rickxie 是可以的,需要额外的设置,首先服务端要能自动切换,客户端需要订阅这个切换的消息,自己处理
能否方便发我一份客户端参考代码,感激
获取 Outlook for Androidhttps://aka.ms/ghei36
On Wed, Dec 7, 2016 at 12:06 PM +0800, "fengzhbo" notifications@github.com<mailto:notifications@github.com> wrote:
@rickxiehttps://github.com/rickxie 是可以的,需要额外的设置,首先服务端要能自动切换,客户端需要订阅这个切换的消息,自己处理
― You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/fengzhbo/MySampleCode/issues/2#issuecomment-265350316, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AJME3DSRGLyn2Lc7kSb5eeXs8Q5_yA2kks5rFjDNgaJpZM4GEP3R.
主要类是 StackExchange.Redis.ConnectionMultiplexer,它隐藏了多个Redis服务器的细节,它设计用于在多个调用方共享和复用,也就是说不要在每个调用都创建新的。我们要保证绝对的线程安全,创建之后保存以供使用。
我们可以使用 ConnectionMultiplexer.Connect or ConnectionMultiplexer.ConnectAsync 来创建。
要注意的是ConnectionMultiplexer是实现了IDispose的,如果长时间不使用就会被回收,但是理想的使用情况是可以是复用对象,而不是简短使用然后被回收掉。
三种典型使用场景
访问 Redis Database
这个对象is a cheap object,不要保存,每次使用直接创建即可。
同样,GetDatabase的重载可以让你选择redis库,如果打算使用异步API并且需要Task.AsyncState有值时,都可在创建时指定 。
获取了Database对象之后,就可以使用Redis API.
Using Redis Pub/Sub
同样这个对象is a cheap object,不用保存。
pub/sub api 没有数据库选择的概念,同样也有异步模式。即所有的订阅都是全局的,并且与ISubscriber对象的生成周期无关。pub/sub 使用命名管道,并且这个管道不必事先在服务端定义。
访问 Redis Server (监控维护 maintenance / monitoring)
为了监控或维护目的,我们有时需要执行一些服务器级别的命令。
同样这个对象也是容易创建,并且支持异步。
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),然后操作在后台继续执行。
配置
configuration 两种方式:
1,字符串
逗号分隔,配置项=配置值,6379默认端口,SSL默认端口6380,以$开始的标识用来表示命令映射
例:localhost 使用本地,默认端口
2,ConfigurationOptions 对象
两者相互转换:
大部分的命令都有默认值,但是有些时候需要更多的信息以达到目的,如禁用一些命令:
字符串形式:
重命名命令
或者
Twemproxy
可以让使用一个服务器的方式使用调用多个Redis实例工具,链接地址:https://github.com/twitter/twemproxy
配置
Tiebreakers和配置更改声明
StackExchange.Redis会自动解析主/从节点,但是如果你使用使用管理工具或集群,可能会出现多个主节点。为了解决这个问题,StackExchange.Redis会使用一个key是“__Booksleeve_TieBreak”去决定一个优先的主节点。
另外,如果配置项改变,为了让连接的实例接收到配置已更改,StackExchange.Redis会自动发布一个发布/订阅的通道,这个改变会被推送,默认设置为"__Booksleeve_MasterChanged"。
这两个项都可以配置,通过 .ConfigurationChannel 和 .TieBreaker 配置节;可以禁用,设为空值。
这些设置同样会被IServer.MakeMaster() 使用,用来设置 tie-breaker和广播配置更改消息。配置更改消息也可以通过ConnectionMultiplexer.PublishReconfigure方法通知。