前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >小解Redis 系列

小解Redis 系列

作者头像
逸鹏
发布2018-04-09 11:48:09
9010
发布2018-04-09 11:48:09
举报
文章被收录于专栏:逸鹏说道

官网:http://redis.io/

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

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

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

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

代码语言:javascript
复制
ConnectionMultiplexer redis = ConnectionMultiplexer.Connection("localhost");

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

三种典型使用场景

访问 Redis Database

代码语言:javascript
复制
IDatabase db = redis.GetDatabase();

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

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

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

Using Redis Pub/Sub

代码语言:javascript
复制
ISubscriber sub = redis.GetSubscriber();

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

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

代码语言:javascript
复制
// 订阅
sub.Subscribe("message",(channel,message) => {

Console.WriteLine((String)message);

});

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

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

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

代码语言:javascript
复制
IServer server = redis.GetServer("localhost",6379);

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

代码语言:javascript
复制
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),然后操作在后台继续执行。

代码语言:javascript
复制
db.StringIncrement(pageKey,flags:CommandFlags.FireAndForget);

配置

代码语言:javascript
复制
var conn = ConnectionMultiplexer.Connect(configuration);

configuration 两种方式:

1,字符串

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

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

代码语言:javascript
复制
localhost:6380,otherhost:6380,allowAdmin=true

2,ConfigurationOptions 对象

两者相互转换:

代码语言:javascript
复制
ConfigurationOptions options = ConfigurationOptions.Parse(configString);

options.ToString();

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

代码语言:javascript
复制
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"

};

字符串形式:

代码语言:javascript
复制
redis0:6379,redis1:6380,keepAlive=180,version=2.8.8,$CLIENT=,$CLUSTER=,$CONFIG=,$ECHO=,$INFO=,$PING=

重命名命令

代码语言:javascript
复制
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),

// ...

}

或者

代码语言:javascript
复制
$INFO=,$SELECT=use

Twemproxy

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

配置

代码语言:javascript
复制
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方法通知。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 三种典型使用场景
    • 访问 Redis Database
      • Using Redis Pub/Sub
        • 访问 Redis Server (监控维护 maintenance / monitoring)
        • 三种使用方式
          • 同步 synchronous
            • 异步 asynchronous
              • Fire-and-Forget
              • 配置
                • configuration 两种方式:
                  • 1,字符串
                  • 2,ConfigurationOptions 对象
                  • 大部分的命令都有默认值,但是有些时候需要更多的信息以达到目的,如禁用一些命令:
                  • 重命名命令
                  • Twemproxy
              • Tiebreakers和配置更改声明
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档