ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis中的集合类型(set,sortedset)

2021-11-17 15:32:38  阅读:218  来源: 互联网

标签:返回 set 分值 元素 redis sortedset score key 集合


目录

set集合

1.添加/移除元素的方式

2.检查元素是否存在

  3.返回集合内的元素

4.集合的操作(差集,交集,并集)

SortedSet有序集合

1.添加元素/移除元素的操作

2.对分值的操作

 3.返回排名

4.范围移除元素

5.返回元素个数

6.并集交集


set集合

特点:无序,去重,元素是字符串类型

最多包含2^32-1个元素

我创建了一个key: people 传入值的顺序是:red green blue

但是在数据库中查询的顺序并不是按我传入的顺序,这就是因为集合的无序性

 

1.添加/移除元素的方式

sadd key member(member1...) 如果添加的元素存在了,直接忽略

以下方法等效:

srem key member [member1 ...]元素如果不存在直接忽略

 

2.检查元素是否存在

sismember key member 查找给定元素是否存在集合中,存在返回1

  3.返回集合内的元素

如果集合内的元素过多,可能

导致redis崩溃,不建议这么干

SRANDMEMBER key [count] 随机返回集合中指定个数的

如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。

如果 count 大于等于集合基数,那么返回整个集合

如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值

如果 count 为 0,返回空

如果 count 不指定,随机返回一个元素

count为负数的情况单独列出来: 确实是有重复值出现

 

 返回集合中元素个数: scard key

随机从集合中移除并返回这个被移除的元素 SPOP key

把元素从源集合移动到目标集合 SMOVE source destination member

4.集合的操作(差集,交集,并集)

差集 sidiff key1 key2(key3...)  从key1的集合中去除其他集合和自己的交集部分

将差集的结果保存到一个目标key中:sdiffstore 目标key key1 key2(key3...)这个目标key可以是不存在的,他会帮我们创建

交集:sinter key key1 key2(key3...)

存储交集:sinterstore 目标key key1 key2(key3...)

对于存储结果的目标key,里面的内容是被覆盖操作的

并集:sunion key1 key2(key3...)

存储并集:sunionstore 目标key key1 key2(key3...)

集合与自身的差集为空;

一个集合可以与多个集合求差集 

 存储查询的差集

存储查询到的交集, 我上面明明存储的是green,这里消失了,所以这里的存储操作是重写目标key里面的内容

 

SortedSet有序集合

sortedset类似于set集合,所以也是去重的

不同于set的是他是有序的,并且他的每一个元素都关联这一个浮点数分值,按照从小到大的顺序排列集合中的元素,这个分值可以重复

1.添加元素/移除元素的操作

zadd key score member(score1 member1...)

这么看可能不是太好理解,写个例子fruit是我们的key,集合里卖的元素是一一对应的,3.0是apple的值,4.0实际orange的值

 如果元素已经存在,则使用新的score

可以看到上面apple的值从3变成了5

在输入分数的时候,存储的结果可能不大一样,但是不影响结果 

 

 

zrem key member(member...)   移除元素的操作

可视化界面查看结果 

 

2.对分值的操作

显示元素的对应分值   zscore key member

增加/减少分值 zincrby key number member

nember为正就是增加,为负就是减少

也可以作为加入元素的操作,你输入的member如果存在就会创建,对应的分值就是number

示例:分值加增加操作 

我的集合中并没有pear这个元素,这里增加成功l,集合中也出现了新的元素pear 

 

 3.返回排名

zrank key member 返回元素从小到大顺序的排名(排名为从0开始)

zrevrank key member  返回元素的逆序排名(最后一位是0)

zrange key start stop 返回指定索引区间元素

zrevrange key start stop 返回指定索引区间元素(逆序)    返回指定区间的元素中,如果分值相同则按照字典序lexicographical order (顺序/逆序)排列

zrangebyscore key min max (limit offset count) 返回指定分值区间的元素,括号内的内容加上后表示跳过offset 个元素,返回count个数的元素

我的集合现在只有2个元素,查看元素的排名:

查看元素的逆序排名 :

返回指定区间索引(正序)

添加了一个与pear分值相同的元素,apple字典顺序明显在pear前

索引是从大到小的顺序:0,1,2

也可以是 -3,-2,-1 

返回指定区间索引(逆序)将上面的结果以逆序返回了

 

 返回指定分值区间的元素

 

 使用limit 后:跳过一个元素,返回一个元素,所以只返回了第二位

4.范围移除元素

移除指定排名范围的元素    ZREMRANGEBYRANK key start stop

移除指定分值范围的元素    ZREMRANGEBYSCORE key min max

5.返回元素个数

返回集合中元素个数        ZCARD key

返回指定范围中元素的个数 ZCOUNT key min max

6.并集交集

并集:

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

numkeys指定key的数量, 

WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重

AGGREGATE选项,指定并集结果的聚合方式

SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值

MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值

MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

例子:创建score1和score2里面存储成绩和人名

127.0.0.1:6379> ZADD scores1 70 tom 80 peter 60 john
(integer) 3
127.0.0.1:6379> ZADD scores2 90 peter 60 ben
(integer) 2

   

求并集,没有加任何追加条件 ,可以看见他帮我们把元素名称相同的分值相加了

127.0.0.1:6379> ZUNIONSTORE scores-all 2 scores1 scores2
(integer) 4

 

 求并集, 加上AGGREGATE条件是sum,sum是将所有集合中某一个元素的score值之和作为结果集中该成员的score值

127.0.0.1:6379> ZUNIONSTORE scores-all1 2 scores1 scores2 AGGREGATE SUM
(integer) 4

 求并集,将上面的元素分值乘以各自的权重,score1的分值乘以1,score2的分值乘以2

127.0.0.1:6379> ZUNIONSTORE scores-all2 2 scores1 scores2 WEIGHTS 1 0.5 AGGREGATE SUM
(integer) 4
127.0.0.1:6379>

 

交集:

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]

numkeys指定key的数量, 

WEIGHTS选项,与前面设定的key对应,对应key中每一个score都要乘以这个权重

AGGREGATE选项,指定并集结果的聚合方式

SUM:将所有集合中某一个元素的score值之和作为结果集中该成员的score值

MIN:将所有集合中某一个元素的score值中最小值作为结果集中该成员的score值

MAX:将所有集合中某一个元素的score值中最大值作为结果集中该成员的score值

标签:返回,set,分值,元素,redis,sortedset,score,key,集合
来源: https://blog.csdn.net/zzds111/article/details/121367668

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有