zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

15天玩转redis —— 第五篇 集合对象类型

Redis集合对象 类型 15 玩转 第五篇
2023-09-14 08:57:27 时间

这篇我们来看看Redis五大类型中的第四大类型:“集合类型”,集合类型还是蛮有意思的,第一个是因为它算是只使用key的Dictionary简易版,

这样说来的话,它就比Dictionary节省很多内存消耗,第二个是因为它和C#中的HashSet是一个等同类型,废话不多说,先看redis手册,如下:

上面就是redis中的set类型使用到的所有方法,还是老话,常用的方法也就那么四个(CURD)。。。

一: 常用方法

1. SAdd

这个方法毫无疑问,就是向集合里面添加数据,比如下面这样,我往fruits集合里面添加喜爱的水果。

127.0.0.1:6379 sadd fruits apple

(integer) 1

127.0.0.1:6379 sadd fruits banana

(integer) 1

127.0.0.1:6379 smembers fruits

1) "banana"

2) "apple"

127.0.0.1:6379 

上面这个sadd你也看到了,我往集合里面成功添加了两个元素,现在你可能不满足这么简单的添加,你或许想知道set这个集合在redis底层是使用

什么来实现的,你可以用object encoding查看一下便知:

127.0.0.1:6379 object encoding fruits

"hashtable"

127.0.0.1:6379 

看到了吧,是hashtable这个吊毛,现在闭上眼睛都能想到,肯定就是只用key的dictionary啦,对不对,如果你还有疑问的话,我还可以找到底层

代码给你看,好不啦???

有没有看到dictAdd方法,而其中的第三个参数正好是Null。。。对应着*val形参,你看牛叉不牛叉。。。然后我再带你看看dictAdd方法的定义。

好了,关于hashtable的实现理论,我在上一篇文章中也已经说过了,这里就不再赘叙了。

2. SPOP,SMEMBERS

既然元素进来了,总不能不出来吧,这里的第一个SPOP:移除并返回集合中的一个随机元素,有一点奇怪的是,这种奇怪的方法其实在我们

C#中的HashSet并没有好办法解决,就比如”这个随机“就有点烦人了,下面这是我能想到的方法。

刚才随便插了一句话,下面我们继续SAdd,再SPop出来。

127.0.0.1:6379 sadd fruits pear

(integer) 1

127.0.0.1:6379 sadd fruits grape

(integer) 1

127.0.0.1:6379 sadd fruits chestnut

(integer) 1

127.0.0.1:6379 smembers fruits

1) "grape"

2) "pear"

3) "banana"

4) "apple"

5) "chestnut"

127.0.0.1:6379 spop fruits

"apple"

127.0.0.1:6379 spop fruits

"chestnut"

127.0.0.1:6379 smembers fruits

1) "grape"

2) "pear"

3) "banana"

127.0.0.1:6379 

这个方法确实还是蛮好的,起码它是原子性操作,如果要我自己实现的话,起码还是要10行左右代码的。

3. SREM

既然说到了CURD,那怎么能少了D呢,它的功能定义就是:移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略,

下面我随便举个例子,删除fruits中的pear。

127.0.0.1:6379 smembers fruits

1) "grape"

2) "pear"

3) "banana"

127.0.0.1:6379 srem fruits pear

(integer) 1

127.0.0.1:6379 smembers fruits

1) "grape"

2) "banana"

127.0.0.1:6379 

好了,常用的操作就那么几个,是不是觉得好傻瓜哦。。。傻瓜就对了,方法是简单的,关键你需要了解这个方法底层是如何实现的,这样才能做到

心里有数,就比如Set函数,它的源代码全部都在 “t.set.c” 中。


Redis 集合(Sets) 复习 集合类似 Java 中的 HashSet,内部实现是一个 value 永远为 null 的 HashMap,实际就是通过计算hash的方式来快速排重的,这也是 set 能提供判断一个成员是否在集合内的原因。
【Redis】三、Redis整数集合和压缩列表 整数集合(intset)是集合建的底层实现之一,当一个集合只包括整数值的元素,并且这个集合的元素数量不多时,Redis就会用整数集合作为集合建的底层实现