Redis的List是經過Linked List(鏈表)來實現的String集合,因此插入數據的速度很快。html
可是缺點就是在數據量比較大的時候,訪問某個數據的時間可能會很長,但針對這種狀況,可使用Sorted Set,這個一會再說。redis
LPUSH
會向List的左側(頭部)添加一個新的元素,而RPUSH
會把新的元素添加到List的右側(尾部)。數組
LRANGE
命令能夠按索引區間顯示List的一部分,它的個試試LRANGE List-Key start end
。若是想顯示整個list的話,這兩個索引就能夠是0和-1,其中-1就表示最後一個元素。 數據結構
注意:這裏插入多個數,由於是鏈表,因此向左插入。dom
POP動做有兩個效果:一個是獲取到元素,另外一個是把元素從list中刪除。ide
LPOP
就是從左邊(頭部)POP,RPOP
就是從右邊(尾部)POP。 spa
LTRIM
命令能夠對list進行剪切,其格式爲LTRIM list-key start end,返回的就是剪切的部分: 設計
BRPOP
和BLPOP
這兩個命令與RPOP和LPOP相似,可是當list裏沒有元素的時候,它們能夠幾秒鐘,若是這期間有新的元素添加到了list裏,那麼就會中止等待返回該元素,不然就會一直等到設定的時間結束,而後返回null: 3d
此外您還應該研究一下RPOPLPUSH
和BRPOPLPUSH
這兩個命令。code
static void List() { using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379")) { IDatabase db = redis.GetDatabase(); db.KeyDelete("mylist"); //刪除 //LPUSH db.ListLeftPush("mylist","a"); //RPUSH db.ListRightPush("mylist", new RedisValue[] {"a", "b", 5}); //LRANGE var toDisplay = db.ListRange("mylist", 0, -1); foreach (RedisValue redisValue in toDisplay) { Console.Write(redisValue+","); } //結果:a,a,b,5 Console.WriteLine(); //2.LPOP,RPOP 獲取並刪除 Console.WriteLine("2.LPOP,RPOP 獲取並刪除"); db.KeyDelete("mylist"); //刪除 db.ListLeftPush("mylist", new RedisValue[] {"a", "b", "c","d"}); //d,c,b,a RedisValue lpop = db.ListLeftPop("mylist"); Console.WriteLine(lpop); //結果:d RedisValue rpop = db.ListRightPop("mylist"); Console.WriteLine(rpop); //結果:a //3.LTRIM 剪切 Console.WriteLine("3.LTRIM 剪切"); db.KeyDelete("mylist"); //刪除 db.ListLeftPush("mylist", new RedisValue[] { "a", "b", "c", "d" }); //d,c,b,a db.ListTrim("mylist",0,1); var listtrim = db.ListRange("mylist", 0, -1); foreach (RedisValue redisValue in listtrim) { Console.Write(redisValue + ","); } //結果:d,c Console.WriteLine(); } }
Redis的SET是無序的String集合,它裏面的元素是不會重複的。
能夠看到一次性能夠添加一個或多個元素。
SMEMBERS能夠獲取set裏全部的元素:
SISMEMBER能夠判斷某個元素是否在set裏: 返回1表示true,0表示false。
SINTER能夠查看多個set之間的交集:
SPOP能夠隨機從set中移除一個或多個元素並返回:
SUNION key1 [key2]
返回全部給定集合的並集
並集:把多個set合併到一個set裏可使用SUNIONSTORE
,格式是sunionstore 目標set set1 set2 ...:
若是隻有一個set須要合併的話,那麼就至關因而複製:
SCARD能夠獲取set的大小:
SRANDMEMBER能夠隨機獲取set裏面的元素,可是不會移除它們:
static void SET() { using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379")) { //1.SADD 添加 IDatabase db = redis.GetDatabase(); db.KeyDelete("set0"); db.SetAdd("set0", new RedisValue[]{0,1,1,2,2,3,4,5,6,"1"}); //2.SMEMBERS 查詢全部 var set0 = db.SetMembers("set0"); string value = string.Empty; foreach (RedisValue redisValue in set0) { value += redisValue + ","; } string remove = value.TrimEnd(','); Console.WriteLine(remove); //結果:0,1,2,3,4,5,6 不會添加劇復,這裏添加了2個1,2個2,結果只添加上1個,緣由? //3.SISMEMBER 能夠判斷某個元素是否在set裏 var result = db.SetContains("set0", "3"); var result1 = db.SetContains("set0", "111"); Console.WriteLine(result); //true Console.WriteLine(result1); //false //4.SINTER 查看多個set之間的交集 db.KeyDelete(new RedisKey[] {"set1", "set2", "set3"}); db.SetAdd("set1", new RedisValue[] {0, 1, 1, 2, 2, 3, 4, 5, 6}); db.SetAdd("set2", new RedisValue[] { 1, 3, 5, 7,9}); db.SetAdd("set3", new RedisValue[] {1, 5, 9,11}); var intersection = db.SetCombine(SetOperation.Intersect, new RedisKey[] {"set1", "set2", "set3"}); string valueCombine = string.Empty; foreach (RedisValue redisValue in intersection) { valueCombine += redisValue + ","; } string removeCombine = valueCombine.TrimEnd(','); Console.WriteLine(removeCombine); //結果:1,5 //5.SPOP 隨機從set中移除一個或多個元素並返回 // var pop1 = db.SetPop("set0"); // var pop2 = db.SetPop("set0"); // var pop3 = db.SetPop("set0"); // Console.WriteLine(pop1); // Console.WriteLine(pop2); // Console.WriteLine(pop3); //結果:6,4,5 //6.SUNIONSTORE 並集:把多個set合併到一個set裏可使用SUNIONSTORE,格式是sunionstore 目標set set1 set2 ...: //這裏第2個參數的「targetset」,是目標集的key(新合成的key) var size = db.SetCombineAndStore(SetOperation.Union,"targetset", new RedisKey[] {"set1", "set2", "set3"}); Console.WriteLine(size); //10 //7.SCARD 能夠獲取set的大小: var scardSize = db.SetLength("set0"); Console.WriteLine(scardSize); // 7 = (0,1,2,3,4,5,6).length //8.SRANDMEMBER 能夠隨機獲取set裏面的元素,可是不會移除它們 var random = db.SetRandomMember("set0"); Console.WriteLine(random); //4 } }
Sorted Set有點像Set和Hash的結合體。
和Set同樣,它裏面的元素是惟一的,類型是String,因此它能夠理解爲就是一個Set。
可是Set裏面的元素是無序的,而Sorted Set裏面的元素都帶有一個浮點值,叫作分數(score),因此這一點和Hash有點像,由於每一個元素都映射到了一個值。
Sorted Set是有序的,規則以下:
ZADD能夠添加元素到Sorted Set,就和Set的SADD命令差很少: 能夠看到ZADD的格式是:zadd key score element。
ZRANGE默認按分數由低到高把Sorted Set的元素顯示出來: ZREVRANGE 從高到低: 也能夠一同把分數顯示出來,使用參數WITHSCORES:
ZRANGEBYSCORE能夠按範圍顯示Sorted Set,格式是zrangebyscore key 分數下限 分數上限:
ZREMRANGEBYSCORE能夠按範圍移除元素: 該命令返回的是移除元素的個數。
其中-inf
和inf
分別表示負無窮和正無窮。
ZRANK命令能夠得到元素的排名: 排名從0開始。
ZREVRANK這個正好和ZRANK相反,就不說了。
Sorted Set裏分數相同的元素是按照詞典分數(能夠理解爲比較字符串)進行排序的。
ZRANGEBYLEX能夠按詞典範圍展現Sorted Set:
ZREVRANGEBYLEX 返回指定成員區間內的成員,按成員字典倒序排序, 分數必須相同。 在某些業務場景中,須要對一個字符串數組按名稱的字典順序進行倒序排列時,可使用Redis中SortSet這種數據結構來處理。 http://www.redis.cn/commands/zrevrangebylex.html
ZREMRANGEBYLEX 刪除名稱按字典由低到高排序成員之間全部成員。 不要在成員分數不一樣的有序集合中使用此命令, 由於它是基於分數一致的有序集合設計的,若是使用,會致使刪除的結果不正確。 待刪除的有序集合中,分數最好相同,不然刪除結果會不正常。 http://www.redis.cn/commands/zremrangebylex.html
ZLEXCOUNT 命令用於計算有序集合中指定成員之間的成員數量。 http://www.redis.cn/commands/zlexcount.html
static void SortSet() { using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379")) { IDatabase db = redis.GetDatabase(); //1.ZADD,ZRANGE 添加,ZRANGE排序:默認按分數由低到高把Sorted Set的元素顯示出來: db.SortedSetAdd("players", "張三", 89d); db.SortedSetAdd("players", new SortedSetEntry[] { new SortedSetEntry("李四",75d), new SortedSetEntry("王五",78d), new SortedSetEntry("趙六",91d), new SortedSetEntry("錢七",100d), new SortedSetEntry("孫八",50d), new SortedSetEntry("李九",65d), new SortedSetEntry("唐三三",88), }); //ZRANGE var sortedSet = db.SortedSetRangeByRank("players", start: 0, stop: -1); foreach (RedisValue value in sortedSet) { Console.WriteLine(value); } // 孫八 // 李九 // 李四 // 王五 // 唐三三 // .... //2.ZREVRANGE,WITHSCORES //ZREVRANGE 從高到低:也能夠一同把分數顯示出來,使用參數WITHSCORES: var sortedSetWITHSCORES = db.SortedSetRangeByRankWithScores("players", start: 0, stop: -1,order:Order.Descending); foreach (SortedSetEntry value in sortedSetWITHSCORES) { Console.WriteLine(value); } //錢七:100 //趙六:91 //張三:89 //唐三三:88 //王五:78 // .... Console.WriteLine(); //3.ZRANGEBYSCORE 能夠按範圍顯示Sorted Set,格式是zrangebyscore key 分數下限 分數上限: var sortedSetZRANGEBYSCORE = db.SortedSetRangeByScoreWithScores("players", start: 60, stop: 90); foreach (SortedSetEntry value in sortedSetZRANGEBYSCORE) { Console.WriteLine(value); } // 李九:65 // 李四:75 // 王五:78 // 唐三三:88 // 張三:89 Console.WriteLine(); //4.ZREMRANGEBYSCORE 能夠按範圍移除元素 //double.NegativeInfinity:負無窮 (redis命令:-inf) var ZREMRANGEBYSCORE = db.SortedSetRemoveRangeByScore("players", start: double.NegativeInfinity, stop: 60); var sortedSetfor = db.SortedSetRangeByScoreWithScores("players", start: Double.MinValue, stop: Double.MaxValue); foreach (SortedSetEntry value in sortedSetfor) { Console.WriteLine(value); } // 李九:65 // 李四:75 // 王五:78 // 唐三三:88 // 張三:89 // 趙六:91 // 錢七:100 Console.WriteLine(); //5.ZRANK 能夠得到元素的排名 var rank = db.SortedSetRank("players", "唐三三"); Console.WriteLine(rank); //3 //6.ZRANGEBYLEX 能夠得到元素的排名,高到低 db.KeyDelete("players"); db.SortedSetAdd("players", new SortedSetEntry[] { new SortedSetEntry("Alan smith",0), new SortedSetEntry("Chuck Van Halen",0), new SortedSetEntry("Filippo Inzaghi",0), new SortedSetEntry("Michael Jackson",0), new SortedSetEntry("Di Matteo",0), new SortedSetEntry("Charlie Sheen",0), new SortedSetEntry("Eric Evans",0), }); var ZRANGEBYLEX = db.SortedSetRangeByValue("players", "C", "F"); foreach (var value in ZRANGEBYLEX) { Console.WriteLine(value); } // Charlie Sheen // Chuck Uan Halen // Di Matteo // Eric Evans db.KeyDelete("players"); db.SortedSetAdd("players", new SortedSetEntry[] { new SortedSetEntry("李四",75d), new SortedSetEntry("王五",78d), new SortedSetEntry("趙六",91d), new SortedSetEntry("錢七",100d), new SortedSetEntry("孫八",50d), new SortedSetEntry("李九",65d), new SortedSetEntry("唐三三",88), }); var ZRANGEBYLEX1 = db.SortedSetRangeByValue("players", "C", "F"); foreach (var value in ZRANGEBYLEX1) { Console.WriteLine(value); } //中文爲null } }
草根專欄,Redis in .NET Core 入門:(4) LIST和SET 草根專欄,Redis in .NET Core 入門:(5) Sorted SET 楊旭(Video),Redis in ASP.NET Core 3. List, Set, Sorted Set