小解Redis 系列

时间:2022-05-07
本文章向大家介绍小解Redis 系列,主要内容包括三种典型使用场景、三种使用方式、配置、Tiebreakers和配置更改声明、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

官网: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方法通知。