• 2.Asp.net Core使用Redis-StackExchange.Redis操作


    官方文档地址: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);
    
    • 1

    提供了两种配置方式:

    • 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();
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    一个常见的用法是将基本的详细信息存储在字符串中,然后在运行时应用特定的详细信息:

    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=...");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    三、使用redis database

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

    四、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);
                //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;
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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);
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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));
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    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)}";
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    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,主播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)}";
    
            }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
  • 相关阅读:
    Python控制结构之for循环I
    【高级语言程序设计】python函数式编程(一)
    5步快速了解电商渠道数字化管理||电商API数据采集|数据分析
    分布式之计算高性能
    命令行中引导用户指定选择文档
    张正友标定法过程推导笔记
    Python—序列型数据操作实训
    JSP+MySQL基于ssm的主题酒店管理系统
    4 Kruskal算法的设计---来源王英S同学
    使用Django框架快速搭建个人网站
  • 原文地址:https://blog.csdn.net/chiyueqi/article/details/127954107