List
Redis的List是通過Linked List(鏈表)來實現的String集合,所以插入數據的速度很快。
但是缺點就是在數據量比較大的時候,訪問某個數據的時間可能會很長,但針對這種情況,可以使用Sorted Set,這個一會再說。
LPUSH,RPUSH,LRANGE
LPUSH
會向List的左側(頭部)添加一個新的元素,而RPUSH
會把新的元素添加到List的右側(尾部)。
LRANGE
命令可以按索引區間顯示List的一部分,它的個試試LRANGE List-Key start end
。如果想顯示整個list的話,這兩個索引就可以是0和-1,其中-1就表示最后一個元素。
注意:這里插入多個數,因為是鏈表,所以向左插入。
LPOP,RPOP
POP動作有兩個效果:一個是獲取到元素,另一個是把元素從list中刪除。
LPOP
就是從左邊(頭部)POP,RPOP
就是從右邊(尾部)POP。
LTRIM
LTRIM
命令可以對list進行剪切,其格式為LTRIM list-key start end,返回的就是剪切的部分:
BRPOP,BLPOP
BRPOP
和BLPOP
這兩個命令與RPOP和LPOP類似,但是當list里沒有元素的時候,它們可以幾秒鍾,如果這期間有新的元素添加到了list里,那么就會停止等待返回該元素,否則就會一直等到設定的時間結束,然后返回null:
此外您還應該研究一下RPOPLPUSH
和BRPOPLPUSH
這兩個命令。
.NET Core 操練LIST
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();
}
}
SET
Redis的SET是無序的String集合,它里面的元素是不會重復的。
SADD
可以看到一次性可以添加一個或多個元素。
SMEMBERS
SMEMBERS可以獲取set里所有的元素:
SISMEMBER
SISMEMBER可以判斷某個元素是否在set里:
返回1表示true,0表示false。
SINTER
SINTER可以查看多個set之間的交集:
SPOP
SPOP可以隨機從set中移除一個或多個元素並返回:
SUNION
SUNION key1 [key2]
返回所有給定集合的並集
SUNIONSTORE
並集:把多個set合並到一個set里可以使用SUNIONSTORE
,格式是sunionstore 目標set set1 set2 ...:
復制
如果只有一個set需要合並的話,那么就相當於是復制:
SCARD
SCARD可以獲取set的大小:
SRANDMEMBER
SRANDMEMBER可以隨機獲取set里面的元素,但是不會移除它們:
.NET Core 操練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
Sorted Set有點像Set和Hash的結合體。
和Set一樣,它里面的元素是唯一的,類型是String,所以它可以理解為就是一個Set。
但是Set里面的元素是無序的,而Sorted Set里面的元素都帶有一個浮點值,叫做分數(score),所以這一點和Hash有點像,因為每個元素都映射到了一個值。
Sorted Set是有序的,規則如下:
- 如果A.score > B.score,那么A > B。
- 如果A.score == B.score,那么A和B的大小就通過比較字符串來決定了,而A和B的字符串是不會相等的,因為Sorted Set里面的值都是唯一的。
ZADD
ZADD可以添加元素到Sorted Set,就和Set的SADD命令差不多:
可以看到ZADD的格式是:zadd key score element。
ZRANGE,ZREVRANGE
ZRANGE默認按分數由低到高把Sorted Set的元素顯示出來:
ZREVRANGE 從高到低:
也可以一同把分數顯示出來,使用參數WITHSCORES:
ZRANGEBYSCORE
ZRANGEBYSCORE可以按范圍顯示Sorted Set,格式是zrangebyscore key 分數下限 分數上限:
ZREMRANGEBYSCORE
ZREMRANGEBYSCORE可以按范圍移除元素:
該命令返回的是移除元素的個數。
其中-inf
和inf
分別表示負無窮和正無窮。
ZRANK
ZRANK命令可以獲得元素的排名:
排名從0開始。
ZREVRANK
ZREVRANK這個正好和ZRANK相反,就不說了。
詞典分數(分數相同)
Sorted Set里分數相同的元素是按照詞典分數(可以理解為比較字符串)進行排序的。
ZRANGEBYLEX
ZRANGEBYLEX可以按詞典范圍展示Sorted Set:
ZREVRANGEBYLEX
ZREVRANGEBYLEX 返回指定成員區間內的成員,按成員字典倒序排序, 分數必須相同。
在某些業務場景中,需要對一個字符串數組按名稱的字典順序進行倒序排列時,可以使用Redis中SortSet這種數據結構來處理。
http://www.redis.cn/commands/zrevrangebylex.html
ZREMRANGEBYLEX
ZREMRANGEBYLEX 刪除名稱按字典由低到高排序成員之間所有成員。
不要在成員分數不同的有序集合中使用此命令, 因為它是基於分數一致的有序集合設計的,如果使用,會導致刪除的結果不正確。
待刪除的有序集合中,分數最好相同,否則刪除結果會不正常。
http://www.redis.cn/commands/zremrangebylex.html
ZLEXCOUNT
ZLEXCOUNT 命令用於計算有序集合中指定成員之間的成員數量。
http://www.redis.cn/commands/zlexcount.html
.NET core操練Sorted Set
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