Set的命令介绍与代码剖析笔记(7)

一:集合类型 

1. 应用场景: 交叉并。 O(M+N)
2. 集合类型本质上来说是只有key的hash。
3. 比hash更节省内存,它的代价就是应用场景比Hash少。

二:命令介绍

   所有集合的命令都是‘S'打头的。

1. SAdd key member  添加数据到集合中 O(1)
 127.0.0.1:6379> sadd fruits orange
(integer) 1
127.0.0.1:6379> sadd fruits apple
(integer) 1
127.0.0.1:6379> smember fruits
(error) ERR unknown command 'smember'
127.0.0.1:6379> smembers fruits
1) "orange"
2) "apple"
127.0.0.1:6379> 

2. SRem key member    删除集合中的指定数据 O(1)

127.0.0.1:6379> srem fruits apple
(integer) 1
127.0.0.1:6379> smembers fruits
1) "orange"

3.  Smembers key      获取集合中的所有元素 O(N)
4.  Sismeber key member  判断member是否在集合中

  
127.0.0.1:6379> sismember fruits orange
(integer) 1
127.0.0.1:6379> sismember fruits apple
(integer) 0
127.0.0.1:6379> 

5. SDiff, Sinner,SUnion
1》SDiff  集合A和集合B的差集 【A-B】


127.0.0.1:6379> sadd collection1 1 2 3
(integer) 3
127.0.0.1:6379> sadd collection2 2 3 4
(integer) 3
127.0.0.1:6379> sdiff collection1 collection2
1) "1"

《2》Sinner  集合A和集合B的交集

127.0.0.1:6379> sinter  collection1 collection2
1) "2"
2) "3"
3》SUnion 集合A和集合B的并集
127.0.0.1:6379> sunion collection1 collection2
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> 
6. SCARD key
127.0.0.1:6379> smembers frutis
1) "orange"
2) "nut"
3) "apple"
127.0.0.1:6379> scard frutis
(integer) 3
127.0.0.1:6379> 
7. SRandMember  我从集合中随机的获取一个元素
127.0.0.1:6379> scard frutis
(integer) 3
127.0.0.1:6379> srandmember frutis
"nut"
127.0.0.1:6379> srandmember frutis
"orange"
127.0.0.1:6379> srandmember frutis
"orange"
127.0.0.1:6379> srandmember frutis
"orange"
127.0.0.1:6379> srandmember frutis
"apple"
127.0.0.1:6379> srandmember frutis
"orange"
127.0.0.1:6379> srandmember frutis
"nut"
127.0.0.1:6379> srandmember frutis

8. SPOP key 【有一点像List集合】
127.0.0.1:6379> spop frutis
"orange"
127.0.0.1:6379> smembers frutis
1) "nut"
2) "apple"
127.0.0.1:6379> spop frutis
"apple"
127.0.0.1:6379> smembers frutis
1) "nut"
127.0.0.1:6379> spop frutis
"nut"
127.0.0.1:6379> smembers frutis
(empty list or set)

三:集合类型的源码实现


1. 集合的源码都在 t_set.c 中
2. 为什么set类型没有 t_set.h 文件


    疑问1: 没有tt_set.h
         疑问2:   没有结构体

3. set是没有hash的value的集合,就是说set在底层用的是hash。

四:一些命令的实现

1.  SADD命令


     《1》 void saddCommand(redisClient *c)
     《2》 set = setTypeCreate(c->argv[2]);    //生成一个字典结构 

     《3》 createSetObject();
           dict *d = dictCreate(&setDictType,NULL);

     《4》 dbAdd(c->db,c->argv[1],set);       //将空集合加入到RedisDb中的字典中

     《5》 setTypeAdd(set,c->argv[j]) 
      
     《6》 dictAdd(subject->ptr,value,NULL)   //发现dictAdd的时候没有value,因为value=null

2. SInter命令

     《1》 void sinterCommand(redisClient *c)

     《2》 sinterGenericCommand(c,c->argv+1,c->argc-1,NULL);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值