开发者学堂课程【Redis 入门实战演练:Redis 数据类型之集合、有序集合与 hash(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/653/detail/10837
Redis 数据类型之集合、有序集合与 hash(二)
四、追加数据
追加的时候不能追加已经存在的数据
127.0.0.1:6379>SADD set1 v3 v4(追加数据)
(integer) 3
127.0.0.1:6379>SADD set1 v2 #没有追加成功
(integer) 0
127.0.0.1:6379> TYPE set1
Set
127.0.0.1:6379> TYPE set12
Set
五、查看集合的所有数据
127.0.0.1:6379 > SMEMBERS set1
1)“v1”
2)“v2”
3)“v3”
4)“v4”
127.0.0.1:6379 > SMEMBERS set2
1)“v4”
2)”v2”
(那么这个集合会用于哪个场景呢?)
六、获取集合的差集
差集:已属于 A 而不属于B的元素称为 A 与 B 的差集(已属于 set1 不属于 set2)先确定以哪个为主。
127.0.0.1:6379 > SDIFF set1 set2(做对比)
1)“v1”
2)“v3”
七、获取集合的交集
交集:已属于 A 且属于 B 的元素称为 A 与 B 的交集(求共同用户)
127.0.0.1:6379 > SINTER set1 set2
1)“v4”
2)“v2”
(好的方法性能会快好多倍,无论有多少信息,直接将信息放入 Redis 中,然后求并集即可)
八、获取集合的并集
并集:已属于 A 或属于 B 的元素为称为 A 与 B 的并集(比较特殊)
127.0.0.1:6379 > SUNION set1 set2
1)“v2”
2)“v4”
1)“v1”
2)“v3”
(使用 SUNION 计算 set1 和 set2)将用户1和用户2的列表加起来去重相加。
无论是什么,开发操作比较多。
(假如用户一有99个好友,包括张三。其他的好友都和用户二不一样。用户二有120个好友,其中也包括张三,其他的和用户一都不相同。那么并集是:218.相加去重)
无论是集合列表还是字符号主要是开发考虑和开发操作比较多,主要是为了熟悉数据类型。
九、有序集合(sorted set)
Redis 有序集合和集合一样也是 string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个 double (双精度浮点型)类型的分数。(根据访问的热度不同会产生一个评分,根据评分对其进行排序)redis 正是通过该分数来为集合中的成员进行以小到大的排序,有序集合的成员是唯一的(不同视频的点击率可以作为它的分数,将点击率进行排序,从高到低,做页面数据,将最优秀或最喜爱的商品放在前面),但分数(score)却可以重复,集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1), 集合中最大的成员数为 2^32-1(4294967295,每个集合可存储40多亿个成员)。
复杂度:数据的总数有多少不会根据数据量的增长而导致查询时间的增长。
(在1000里面找一个值和在10000里面找一个值是一样的时间。)
这就是它的优势。
十、生成有序集合
127.0.0.1:6379>ZADD zset1 1(分值) v1(加信息)
(integer)1
127.0.0.1:6379>ZADD zset1 2 v2
(integer)1
127.0.0.1:6379> ZADD zset1 2 v3
(integer)1
127.0.0.1:6379> ZADD zset1 3 v4
(integer)1
127.0.0.1:6379> TYPE zset1
Zset
127.0.0.1:6379> TYPE zset2
zset
一次生成多个数据:(和生成列表插入数据比较类似)
192.168.7.101:6379>ZADD zset2
1 v1
(一对)2 v2 3 v3 4v45 v5
(integer)5(需要在每个数据前面加上分数或者次数,成对)
十一、获取集合的长度数(看列表中的数据长度)
127.0.0.1:6379>ZCARD zset1
(integer) 4
127.0.0.1:6379> ZCARD zset?
(integer)4
(对于开发列表很重要,因为开发列表数据不是任意拿的,是一个一个拿的,或者拿到列表的总长度,然后全部获取出来。为什么?避免产生多余的链接溢出。否则会出现错误。OUT OF RANGE,所以需要拿到总长度)
十二、基于索引返回数值
怎么通过下标获取数据?
第一个,第二个等数据都会有隐藏的下标,从0开始依次往后。
127.0.0.1:6379> ZRANGE zset1 0(开始) 3(结束)这是下标的范围
1)“v2"
2)“v3"
3) "V4"
如果想要取一个固定的数据,那么就要固定它的开头和结尾。
127.0.0.1:6379> ZRANGE zset1 0 2
1)“V1"
2)“v2”
3) “V3"
127.0.0.1:6379> ZRANGE zset1 2 2
1)
"V3"
对于开发的时候需要注意
十三、返回某个数值
127.0.0.1:6379> ZRANK zset1 v2(不知道的下标位)
(integer) 1
127.0.0.1:6379> ZRANK zset1 v3
(integer) 3
十四、集合排行案例(实用场景)
192.168.7.104:6379> ZADD paihangbang 90 nezha 199 zhanlang 60 zhuluoji 30 gangtiexia(电影名称)
(integer) 4
192.168.7.101:6379> ZRANGE paihangbang 0(第一个) -1(最后一个)
#是示集合内所有的 key 无论有序集合有多长,-1都可以将最后一个值取出来。
1)"gangtiexia"
2)"zhuluoji"
3) "nezha"
4) "zhanlang"(不知道分数)
192-166.7-104:6379~ ZREVRANGE paihangbang o -1 withscores
#显示指定集合内所有 key 和得分情况
1)"zhuluoji"
2)“60"
3)"nezha"
4)*90"
5) "zhanlang"
6) “199"
自动排行,根据频数或者销量。取消了之后不会消失。
有些程序会根据页面排行。例如:根据频数进行排行。(需要具有评分标准)