官方文档地址:https://stackexchange.github.io/StackExchange.Redis/
核心对象是ConnectionMultiplexer 类,在调用者之间共享和重用。线程安全
首先确保redis服务端已开启,下载redis server请参考https://stackexchange.github.io/StackExchange.Redis/Server
当调用Connect (or ConnectAsync)传入配置模型
var conn = ConnectionMultiplexer.Connect(configuration);
提供了两种配置方式:
最简单的配置如下:
//This will connect to a single server on the local machine using the default redis port (6379)
var conn = ConnectionMultiplexer.Connect("localhost");
//添加其他选项以逗号分隔 参数配置name=value
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,allowAdmin=true,password=123456");
//如果指定serviceName将触发哨兵模式,本示例将使用默认的哨兵端口(26379)连接到本地机器上的哨兵服务器。发现myprimary服务的当前主服务器,并返回指向主服务器的托管连接,如果主服务器发生变化,该连接将自动更新:
var conn = ConnectionMultiplexer.Connect("localhost,serviceName=myprimary");
// string and ConfigurationOptions 切换
ConfigurationOptions options = ConfigurationOptions.Parse(configString);
string configString = options.ToString();
一个常见的用法是将基本的详细信息存储在字符串中,然后在运行时应用特定的详细信息:
string configString = GetRedisConfiguration();
var options = ConfigurationOptions.Parse(configString);
options.ClientName = GetAppName(); // only known at runtime
options.AllowAdmin = true;
conn = ConnectionMultiplexer.Connect(options);
//Microsoft Azure Redis example with password
var conn = ConnectionMultiplexer.Connect("contoso5.redis.cache.windows.net,ssl=true,password=...");
IDatabase db = redis.GetDatabase();
//多数据可以指定需要读取的数据库
var db2 = redis.GetDatabase(7);
//如果在api中需要使用异步,可以使用Task.AsyncState 来指定一个值
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象,json字符串。
[HttpGet(Name = "StringTest")]
public string StringTest(string key)
{
string mess = "";
var redis = ConnectionMultiplexer.Connect("192.168.100.86:6379,allowAdmin=true,password=123456");
var db = redis.GetDatabase();
bool haskey = db.KeyExists(key);
//set
if (!haskey)
db.StringSet(key, DateTime.Now.ToString(), TimeSpan.FromSeconds(60));
//get
var value = db.StringGet(key);
mess = "存储值:" + value + "剩余时间:" + db.KeyTimeToLive(key);
//db.KeyDelete(key);
return mess;
}
一个键值(key=>value)对集合。 用于存储对象。用户信息、配置信息等
如果使用string类型的json对象保存配置信息,涉及到序列化和反序列化,如果信息量大的话将降低系统性能,此时可以使用hash数据结构来存储信息:
[HttpGet(Name = "HashTest")]
public string HashTest()
{
var redis = ConnectionMultiplexer.Connect("192.168.100.86:6379,allowAdmin=true,password=123456");
var db = redis.GetDatabase();
db.KeyDelete("userHash_1001");
db.HashSet("userHash_1001", "id", "1001");
db.HashSet("userHash_1001", "userName", "zhangsan");
db.HashSet("userHash_1001", "sex", "男");
db.HashSet("userHash_1001", "age", "25");
db.HashDelete("userHash_1001", "sex");
var age = db.HashGet("userHash_1001", "age");
HashEntry[] hashEntries = db.HashGetAll("userHash_1001");
var dic = hashEntries.ToDictionary();
var username = dic["userName"].ToString();
return string.Join(",", hashEntries);
}
在列表头部或者末尾操作数据非常高效,不受队列长度的影响
列表最多可存储 232- 1 元素 (4294967295, 每个列表可存储40多亿)。
主要用于队列操作
//list操作 response: 1,10,9,8,7,6,10,999,9ss99,sdfsdf
[HttpGet(Name = "ListTest")]
public string ListTest(string key)
{
var redis = ConnectionMultiplexer.Connect("192.168.100.86:6379,allowAdmin=true,password=123456");
var db = redis.GetDatabase();
RedisValue[] arr = new RedisValue[5];
for (int i = 0; i < 5; i++)
{
arr[i] = i + 6 ;
}
db.ListLeftPush(key, arr);
db.ListRightPush(key, 10);
db.ListLeftPush(key, new RedisValue[] { 1, 2 });
db.ListRightPush(key, "999");
db.ListRightPush(key, "9ss99");
db.ListRightPush(key, "sdfsdf");
var ss = db.ListLeftPop(key);
var selectTop5 = string.Join(",", db.ListRange(key, 0, 5));
return string.Join(",", db.ListRange(key));
}
Set 是 string 类型的无序且不允许重复的集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 232- 1(4294967295, 每个集合可存储40多亿个成员)。
集合主要应用在一些需要求交集、并集、补集这样的场景,比如我们需要求共同好友、共同兴趣爱好、共同关注的微博,限制同一个账号多处登录系统等场景。
/*response :
Members:好友C,好友A,好友B,好友D
union:好友C,好友G,好友A,好友B,好友F,好友D
diff:好友B,好友A
inter:好友C,好友D
*/
[HttpGet(Name = "SetTest")]
public string SetTest()
{
var redis = ConnectionMultiplexer.Connect("192.168.100.86:6379,allowAdmin=true,password=123456");
var db = redis.GetDatabase();
db.SetAdd("QQ用户1", "好友A");
db.SetAdd("QQ用户1", "好友B");
db.SetAdd("QQ用户1", "好友C");
db.SetAdd("QQ用户1", "好友D");
db.SetAdd("QQ用户2", "好友C");
db.SetAdd("QQ用户2", "好友F");
db.SetAdd("QQ用户2", "好友G");
db.SetAdd("QQ用户2", "好友D");
var members = db.SetMembers("QQ用户1");
var union = db.SetCombine(SetOperation.Union, new RedisKey[] { "QQ用户1", "QQ用户2" });
var diff = db.SetCombine(SetOperation.Difference, "QQ用户1", "QQ用户2");
var inter = db.SetCombine(SetOperation.Intersect, "QQ用户1", "QQ用户2");
return $"Members:{string.Join(",", members)} \r\n union:{string.Join(",", union)} \r\n diff:{string.Join(",", diff)} \r\n inter:{string.Join(",", inter)}";
}
在 set 的基础上给集合中每个元素关联了一个分数,往有序集合中插入数据时会自动根据这个分数排序。不同的是每个元素都会关联一个double类型的分数。
redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
比如现在有很多主播,每个主播都有粉丝给的礼物,现在需要我们给出礼物数量最多的前三名主播,那么可以使用SortedSet来实现,
可以分别给每个主播定义个分数来存储礼物数量,
/* response:
asc:主播1: 24,主播3: 746,主播2: 864,主播4: 2357
desc:主播4: 2357,主播2: 864,主播3: 746,主播1: 24
range:主播3,主播2,主播4
top3:主播4: 2357,主播2: 864,主播3: 746
*/
[HttpGet(Name = "ZSetTest")]
public string ZSetTest()
{
string mess = "";
var redis = ConnectionMultiplexer.Connect("192.168.100.86:6379,allowAdmin=true,password=123456");
var db = redis.GetDatabase();
db.SortedSetAdd("GiftSortedSet", "主播1", 24);
db.SortedSetAdd("GiftSortedSet", "主播2", 564);
db.SortedSetAdd("GiftSortedSet", "主播3", 746);
db.SortedSetAdd("GiftSortedSet", "主播4", 2357);
db.SortedSetIncrement("GiftSortedSet", "主播2", 300);
mess += "礼物数最多的前三名主播为:";
//正序
var asc = db.SortedSetRangeByRankWithScores("GiftSortedSet", 0, -1, Order.Ascending);
//倒序
var desc = db.SortedSetRangeByRankWithScores("GiftSortedSet", 0, -1, Order.Descending);
//取前3名
var top3 = db.SortedSetRangeByRankWithScores("GiftSortedSet", 0,2, Order.Descending);
//分数范围
var range = db.SortedSetRangeByScore("GiftSortedSet", 700);
return $"asc:{string.Join(",", asc)} \r\n desc:{string.Join(",", desc)} \r\n range:{string.Join(",", range)}\r\n top3:{string.Join(",", top3)}";
}