2.Asp.net Core使用Redis-StackExchange.Redis操作
创始人
2024-02-13 18:53:22

官方文档地址:https://stackexchange.github.io/StackExchange.Redis/
核心对象是ConnectionMultiplexer 类,在调用者之间共享和重用。线程安全

一、运行Redis Server

首先确保redis服务端已开启,下载redis server请参考https://stackexchange.github.io/StackExchange.Redis/Server

二、配置参数

当调用Connect (or ConnectAsync)传入配置模型

var conn = ConnectionMultiplexer.Connect(configuration);

提供了两种配置方式:

  • ConfigurationOptions 实例
  • 配置字符串

1.字符串参数配置方式

最简单的配置如下:

//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=...");

三、使用redis database

IDatabase db = redis.GetDatabase();//多数据可以指定需要读取的数据库
var db2 = redis.GetDatabase(7);//如果在api中需要使用异步,可以使用Task.AsyncState 来指定一个值

四、Redis中的数据类型及操作

1.string 存储简单的键值对,最大能存储 512MB

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);//setif (!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;}

2.Hash(哈希)

一个键值(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);}

3.List(列表)

在列表头部或者末尾操作数据非常高效,不受队列长度的影响
列表最多可存储 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));}

4.Set(集合)

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)}";}

5.ZSet(有序集合)

在 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,主播4top3:主播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)}";}

相关内容

热门资讯

苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...