Redis的数据类型及操作(三):set类型

一  set类型


set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作,操作中key 理解为集合的名字。 
 
Redis的set是 string类型的无序集合。set元素最大可以包含(2的 32次方)个元素。 
 
set的是通过hash table 实现的,所以添加、删除和查找的复杂度都是 O(1)。hash table 会随着添加或者删除自动的调整大小。需要注意的是调整 hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表(skip list)来实现,跳表已经在 sorted set 中使用了。关于 set 集合类型除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现 sns中的好友推荐和 blog的tag功能。下面详细介绍 set相关命令: 


1.1  sadd

向名称为key 的set中添加元素 

127.0.0.1:6379> sadd myset "hello" 
(integer) 1 
redis 127.0.0.1:6379> sadd myset "world" 
(integer) 1 
127.0.0.1:6379> sadd myset "world" 
(integer) 0 
127.0.0.1:6379> smembers myset 
1) "world" 
2) "hello" 
本例中,我们向myset中添加了三个元素,但由于第三个元素跟第二个元素是相同的,所以第三个元素没有添加成功,最后我们用smembers来查看myset中的所有元素。 


1.2   srem 

删除名称为key的 set中的元素member 

127.0.0.1:6379> sadd myset2 "one" 
(integer) 1 
127.0.0.1:6379> sadd myset2 "two" 
(integer) 1 
redis 127.0.0.1:6379> sadd myset2 "three" 
(integer) 1 
127.0.0.1:6379> srem myset2 "one" 
(integer) 1 
127.0.0.1:6379> srem myset2 "four" 
(integer) 0 
127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 

本例中,我们向myset2中添加了三个元素后,再调用 srem来删除 one 和four,但由于元素中没有four所以,此条 srem命令执行失败。

1.3  spop 

随机返回并删除名称为 key 的set中一个元素

127.0.0.1:6379> sadd myset3 "one" 
(integer) 1 
127.0.0.1:6379> sadd myset3 "two" 
(integer) 1 
127.0.0.1:6379> sadd myset3 "three" 
(integer) 1 
127.0.0.1:6379> spop myset3 
"three" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
本例中,我们向myset3中添加了三个元素后,再调用spop来随机删除一个元素,可以看到three元素被删除了。

1.4  sdiff 

返回所有给定key 与第一个key的差集

127.0.0.1:6379>  smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379>  smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sdiff myset2 myset3 
1) "three" 
127.0.0.1:6379> 
本例中,我们可以看到 myset2中的元素与 myset3中不同的只是three,所以只有three被查出来了,而不是 three和one,因为one 是 myset3的元素。

1.5  sdiffstore 
返回所有给定key 与第一个key的差集,并将结果存为另一个 key 

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sdiffstore myset4 myset2 myset3 
(integer) 1 
127.0.0.1:6379> smembers myset4 
1) "three" 


1.6   sinter 
返回所有给定key 的交集 

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sinter myset2 myset3 
1) "two" 
通过本例的结果可以看出, myset2和myset3 的交集two被查出来了 


1.7   sinterstore 

返回所有给定key 的交集,并将结果存为另一个 key 

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sinterstore myset5 myset2 myset3 
(integer) 1 
127.0.0.1:6379> smembers myset5 
1) "two" 

通过本例的结果可以看出, myset2和myset3 的交集被保存到myset5 中了 

1.8   sunion 

返回所有给定key 的并集 

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sunion myset2 myset3 
1) "three" 
2) "one" 
3) "two" 
通过本例的结果可以看出, myset2和myset3 的并集被查出来了 


1.9   sunionstore 

返回所有给定key 的并集,并将结果存为另一个 key

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> sunionstore myset6 myset2 myset3 
(integer) 3 
127.0.0.1:6379> smembers myset6 
1) "three" 
2) "one" 
3) "two" 
通过本例的结果可以看出, myset2和myset3 的并集被保存到myset6 中了 

1.10  smove

从第一个key 对应的set中移除member 并添加到第二个对应set中

127.0.0.1:6379> smembers myset2 
1) "three" 
2) "two" 
127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> smove myset2 myset7 three 
(integer) 1 
127.0.0.1:6379> smembers myset7 
1) "three" 
通过本例可以看到,myset2 的three 被移到 myset7中了


1.11 scard 

返回名称为key的 set的元素个数 

127.0.0.1:6379> scard myset2 
(integer) 1 
通过本例可以看到,myset2 的成员数量为1 


1.12  sismember 

测试member 是否是名称为 key的 set的元素

127.0.0.1:6379> smembers myset2 
1) "two" 
127.0.0.1:6379> sismember myset2 two 
(integer) 1 
127.0.0.1:6379> sismember myset2 one 
(integer) 0 
通过本例可以看到,two是myset2 的成员,而 one不是。


1.13   srandmember 

随机返回名称为 key的set的一个元素,但是不删除元素

127.0.0.1:6379> smembers myset3 
1) "two" 
2) "one" 
127.0.0.1:6379> srandmember myset3 
"two" 
127.0.0.1:6379> srandmember myset3 
"one" 



二   sorted set 类型及操作


sorted set是set的一个升级版本,它在 set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作中 key理解为 zset的名字。 
 
和 set 一样 sorted set 也是 string 类型元素的集合,不同的是每个元素都会关联一个 double类型的score。sorted set的实现是skip list和hash table 的混合体。当元素被添加到集合中时,一个元素到score 的映射被添加到hash table中,所以给定一个元素获取score 的开销是 O(1),另一个score 到元素的映射被添加到 skip list,并按照score 排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是 O(log(N))和 skip list的开销一致,redis的 skip list实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为 score 存储,对象的 id当元素存储。下面是 sorted set相关命令

2.1  zadd 

向名称为 key 的 zset 中添加元素 member,score 用于排序。如果该元素已经存在,则根据score 更新该元素的顺序

127.0.0.1:6379> zadd myzset 1 "one" 
(integer) 1 
127.0.0.1:6379> zadd myzset 2 "two" 
(integer) 1 
127.0.0.1:6379> zadd myzset 3 "two" 
(integer) 0 
127.0.0.1:6379> zrange myzset 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "3" 
本例中我们向 myzset 中添加了 one 和 two,并且 two 被设置了 2 次,那么将以最后一次的设置为准,最后我们将所有元素都显示出来并显示出了元素的score。

2.2  zrem 

删除名称为key的 zset中的元素member 

127.0.0.1:6379> zrange myzset 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "3" 
127.0.0.1:6379> zrem myzset two 
(integer) 1 
127.0.0.1:6379> zrange myzset 0 -1 withscores 
1) "one" 
2) "1" 
可以看到two被删除了

2.3  zincrby 

如果在名称为key 的zset中已经存在元素 member,则该元素的score增加 increment;否则向集合中添加该元素,其 score 的值为increment 

127.0.0.1:6379> zadd myzset2 1 "one" 
(integer) 1 
127.0.0.1:6379> zadd myzset2 2 "two" 
(integer) 1 
127.0.0.1:6379> zincrby myzset2 2 "one" 
"3" 
127.0.0.1:6379> zrange myzset2 0 -1 withscores 
1) "two" 
2) "2" 
3) "one" 
4) "3" 
本例中将one 的 score 从1 增加了2,增加到了 3


2.4   zrank

返回名称为key的 zset中member 元素的排名(按 score从小到大排序)即下标 

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zrank myzset3 two 
(integer) 1 
本例中将two的下标是1,我这里取的是下标,而不是 score 


2.5   zrangebyscore

返回集合中score在给定区间的元素

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores 
1) "two" 
2) "2" 
3) "three" 
4) "3" 
本例中,返回了 score在2~3区间的元素


2.6  zcount 

返回集合中score在给定区间的数量 

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zcount myzset3 2 3 
(integer) 2 
127.0.0.1:6379> 
本例中,计算了 score在2~3之间的元素数目 


2.7   zcard 

返回集合中元素个数

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zcard myzset3 
(integer) 4 

从本例看出myzset3 这个集全的元素数量是4

2.8  zscore

返回给定元素对应的 score

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zscore myzset3 two 
"2" 

此例中我们成功的将 two的score取出来了。 

2.9  zremrangebyrank 

删除集合中排名在给定区间的元素 

127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
7) "five" 
8) "5" 
127.0.0.1:6379> zremrangebyrank myzset3 3 3 
(integer) 1 
127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
在本例中我们将 myzset3中按从小到大排序结果的下标为3的元素删除了。

2.10  zremrangebyscore 

删除集合中score在给定区间的元素

127.0.0.1:6379> zrange myzset3 0 -1 withscores
1) "one" 
2) "1" 
3) "two" 
4) "2" 
5) "three" 
6) "3" 
127.0.0.1:6379> zremrangebyscore myzset3 1 2 
(integer) 2 
127.0.0.1:6379> zrange myzset3 0 -1 withscores 
1) "three" 
2) "3" 
在本例中我们将 myzset3中按从小到大排序结果的 score 在1~2之间的元素删除了。 






.








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Redis支持多种数据类型操作,包括链表、集合和位图等。 对于链表类型数据,可以使用lrem命令从链表中删除指定的值。lrem命令的作用是从key链表中删除value值,可以通过设置count参数来指定删除的个数和方向。当count大于0时,从表头开始删除;当count小于0时,从表尾开始删除。例如,使用lrem命令从名为anwser的链表中删除2个值为a的元素,可以执行以下命令: ``` lrem anwser 2 a ``` 执行完毕后,anwser链表中的值为\["a", "d", "c", "b", "a"\]。\[1\] 对于集合类型数据,可以使用srem命令从集合中移除指定的元素。例如,使用srem命令从名为setkey的集合中移除setvalue3,可以执行以下命令: ``` srem setkey setvalue3 ``` 执行完毕后,setkey集合中的值为\["setvalue1", "setvalue2"\]。\[2\] 对于位图类型数据,可以使用setbit命令设置指定偏移量上的二进制位的值。例如,使用setbit命令将名为char的键的第2位设置为1,可以执行以下命令: ``` setbit char 2 1 ``` 执行完毕后,char键对应的值为"a"。如果再将第2位设置为0,可以执行以下命令: ``` setbit char 2 0 ``` 执行完毕后,char键对应的值为"A"。\[3\] 综上所述,Redis提供了丰富的数据类型操作命令,可以根据具体需求选择适合的命令进行操作。 #### 引用[.reference_title] - *1* *3* [redis各种数据类型操作](https://blog.csdn.net/ldTrueLove/article/details/111594178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [redis当中各种数据类型操作](https://blog.csdn.net/weixin_42518541/article/details/105722913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御前两把刀刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值