一、简介
ZSet可以说是Redis中最有趣的数据结构了,因为他兼具了Hash集合和Set的双重特性,也是用的最多的,保证了value值的唯一性的同时,,同时又保证了高性能,最主要的是还可以给每个Value设置Source(权重),那么我们就可以通过权重进行排序,这在业务上是非常常见的,比如很多地方需要,比如我们需要对所有用户的数学成绩进行排序.对英语等等地例子比比皆是,那么通过ZSet,你将会得到一个响应速度非常快的过程.下面会介绍.
ZSet的内部原理是通过跳跃列表来实现的,这里还是不想说太多关于算法的东西.
二、ZSet(有序列表)实战
下面就通过一个列子来讲解,主要是给所有用户的数学成绩进行排序的例子.代码开始在前面的随笔上进行扩展.
C#控制台:
给RedisClient.cs扩展如下几个方法:
/// <summary> /// 异步不带权重的向有序列表批量插入数据 /// </summary> /// <param name="key"></param> /// <returns></returns> public static async Task<long> SortedSetAddAsync(RedisKey key, SortedSetEntry[] entries) { var db = GetDatabase(); return await db.SortedSetAddAsync(key, entries); } /// <summary> /// 异步带权重的向有序列表插入单个元素,不管是否存在已有元素,都执行插入操作 /// </summary> /// <param name="key"></param> /// <returns></returns> public static async Task<RedisValue> SortedSetAddAsync(RedisKey key, RedisValue value,double source) { var db = GetDatabase(); return await db.SortedSetAddAsync(key, value, source); } /// <summary> /// 异步按权重(范围为负无穷大到正无穷大排序)得到所有的元素,返回的元素(不包含权重)集合默认的排序时按权重从低到高,可指定权重 /// </summary> /// <param name="key"></param> /// <param name="start">权重下限</param> /// <param name="stop">权重上限</param> /// <returns></returns> public static async Task<RedisValue[]> SortedSetRangeByScoreAsync(RedisKey key, double start = double.NegativeInfinity, double stop = double.PositiveInfinity) { var db = GetDatabase(); return await db.SortedSetRangeByScoreAsync(key, start, stop); } /// <summary> /// 异步按权重(范围为负无穷大到正无穷大排序)得到所有的元素,返回的元素(包含权重)集合默认的排序时按权重从低到高,可指定权重 /// </summary> ///