面试官经常问的Redis几种数据类型的用法和应用场景整理好了( 三 )

5、Sorted Set(zset)5.1 介绍
Sorted Set 和set很像 , 同样是字符串集合 , 同一个集合中都不允许元素重复 。 区别在于有序集合中每一个元素都会有一个分数(score)与之关联 , Redis正是通过分数来为集合中的元素进行从小到大的排序 。 虽然在有序集合中的元素必须是唯一的 , 但是分数(score)却可以重复 。
5.2 使用场景
可以用在在线游戏积分排行榜中 , 每当用户的积分发生变化时 , 可以执行zadd来update用户分数(score) , 然后用zrange获取top的用户信息 。
5.3 更多特性
面试官经常问的Redis几种数据类型的用法和应用场景整理好了文章插图
/** * 有序集合 * 1. 相比于集合类型多了一个排序属性 score(权重) , 单个存储元素有两个值【元素值、排序值】 * !2. 场景 *1. 游戏排名 *2. 微博热点话题 *3. 学生成绩:汇总、排名、百分制、 */async function zsetFun() {const key = "z:student:math";const key1 = "z:student:english";const key2 = 'z:student:sum';const Ykey = "y:student:math";// const Ykey1 = "y:student:english";// const Ykey2 = 'y:student:sum';// score field score field ...const value = http://kandian.youth.cn/index/[90,"zhangsan", 20, "lisi", 99, "xiaoming", 60, "xiaohong"];const value1 = [30, "zhangsan", 59, "lisi", 80, "xiaoming", 90, "xiaohong"];const YmathValue = http://kandian.youth.cn/index/[30,"lucy", 59, "nick", 80, "davi"];// 1. 添加await redis.zadd(key, value);await redis.zadd(key1, value1);// 默认按score生序排列, 0 -1 获取全部的const zrange = await redis.zrange(key, 0, -1);// !分数由高到低 , 排 优秀的学生, 得逆序写 【100 , 80】 反之 , 顺序排 , 顺序写数字const zrevrange = await redis.zrevrangebyscore(key, 100, 80);console.log("zrange", zrange);console.log("zrevrange", zrevrange);// 2. 删除, 按score区间、起止、await redis.zrem(key1, 'xiaming');await redis.zrem(key2, 'xiaming');// await redis.zremrangebyscore(key, 10, 60);// 3. 总个数const count = await redis.zcard(key);// 4. 区间内个数const youxiu = await redis.zcount(key, 80, 100);// 5. 获取单个fieldconst zhansan = await redis.zscore(key, "zhangsan");// 6. 单个fiele 加减await redis.zincrby(key, 1, "zhangsan")// 7. 多个集合操作// ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]// destination 给定的一个新的集合// numkeys 计算的几个集合// WEIGHTS 乘法: 默认算法因子 1// AGGREGATE 默认 sum// !总成绩 , 单科相加await redis.zinterstore(key2, 2, key, key1);// 全都打印const total = await redis.zrange(key2, 0, -1, 'WITHSCORES');console.log(total);// 8. 某个field排名 从大到小const xiaoming = await redis.zrevrank(key, "xiaoming");console.log('xiaoming班级排名', xiaoming);// !9. 汇总整个年级成绩, 【Y Z 班级数学汇总表】// !并集await redis.zadd(Ykey, YmathValue);// 百分制const keyClassMath100 = "clas:math:100";const keyClassMath150 = "clas:math:150";// 总分const keyClassMathTotal = "clas:math:total";// 100 分制 返回元素集合的个数await redis.zunionstore(keyClassMath100, 2, key1, Ykey);// 150 分制度await redis.zunionstore(keyClassMath150, 2, key1, Ykey, 'weights', 1.5, 1.5);const classMath100 = await redis.zrange(keyClassMath100, 0, -1, 'WITHSCORES');const classMath150 = await redis.zrange(keyClassMath150, 0, -1, 'WITHSCORES');console.log("年级数学成绩--100分制", classMath100);console.log("年级数学成绩--150分制", classMath150);// 不知道 AGGREGATE 的用处 。。。// await redis.zunionstore(keyClassMathTotal, 2, key1, Ykey, 'AGGREGATE', 'max');// const classMathTotal = await redis.zrange(keyClassMathTotal, 0, -1, 'WITHSCORES');// console.log("年级数学成绩", classMathTotal);// 10. }94 20 87 8 36 43 88 91 95 92 44 56 22 71 57 52 28 17 99 2 35 97 63 84 70 82 73 38 45 64 24 47 60 50 11 27 80 25 65 10 41 98 55 85 89 15 79 26 42 32 33 1 83 78 66 39 77 7 46 74 67 59 81 51 34 40 30 53 19 90 48 58 9 37 61 69 18 72 14 13 23 93 49 21 12 5 31 86 29 6 4 62 96 54 75 3 16 76 0 68