15天玩转redis —— 第五篇 集合对象类型
这篇我们来看看Redis五大类型中的第四大类型:“集合类型”,集合类型还是蛮有意思的,第一个是因为它算是只使用key的Dictionary简易版,
这样说来的话,它就比Dictionary节省很多内存消耗,第二个是因为它和C#中的HashSet是一个等同类型,废话不多说,先看redis手册,如下:
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119160016280-281082373.png)
上面就是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
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119160537561-1584789947.png)
上面这个sadd你也看到了,我往集合里面成功添加了两个元素,现在你可能不满足这么简单的添加,你或许想知道set这个集合在redis底层是使用
什么来实现的,你可以用object encoding查看一下便知:
127.0.0.1:6379 object encoding fruits "hashtable" 127.0.0.1:6379
看到了吧,是hashtable这个吊毛,现在闭上眼睛都能想到,肯定就是只用key的dictionary啦,对不对,如果你还有疑问的话,我还可以找到底层
代码给你看,好不啦???
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119161107046-1912558516.png)
有没有看到dictAdd方法,而其中的第三个参数正好是Null。。。对应着*val形参,你看牛叉不牛叉。。。然后我再带你看看dictAdd方法的定义。
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119161255624-1439114717.png)
好了,关于hashtable的实现理论,我在上一篇文章中也已经说过了,这里就不再赘叙了。
2. SPOP,SMEMBERS
既然元素进来了,总不能不出来吧,这里的第一个SPOP:移除并返回集合中的一个随机元素,有一点奇怪的是,这种奇怪的方法其实在我们
C#中的HashSet并没有好办法解决,就比如”这个随机“就有点烦人了,下面这是我能想到的方法。
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119162328061-243759872.png)
刚才随便插了一句话,下面我们继续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
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119162818546-1895474.png)
这个方法确实还是蛮好的,起码它是原子性操作,如果要我自己实现的话,起码还是要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
![](http://images2015.cnblogs.com/blog/214741/201511/214741-20151119164920233-808377936.png)
好了,常用的操作就那么几个,是不是觉得好傻瓜哦。。。傻瓜就对了,方法是简单的,关键你需要了解这个方法底层是如何实现的,这样才能做到
心里有数,就比如Set函数,它的源代码全部都在 “t.set.c” 中。
Redis 集合(Sets) 复习 集合类似 Java 中的 HashSet,内部实现是一个 value 永远为 null 的 HashMap,实际就是通过计算hash的方式来快速排重的,这也是 set 能提供判断一个成员是否在集合内的原因。
【Redis】三、Redis整数集合和压缩列表 整数集合(intset)是集合建的底层实现之一,当一个集合只包括整数值的元素,并且这个集合的元素数量不多时,Redis就会用整数集合作为集合建的底层实现
相关文章
- 密码管理用Redis安全储存用户名密码(redis用户名)
- 使用Redis删除有序集合元素的操作(redis有序集合删除)
- Redis 集合差集:掌握实用技巧,优化数据处理方式(redis集合差集)
- Redis集合查询策略深度剖析(redis 集合查询)
- 数据如何使用Redis获取高性能的集合数据(redis获取集合)
- 将一个集合存入Redis中(往redis写入一个集合)
- 如何从Redis中获取集合值(获取redis集合的值)
- 高效执行生产上的Redis检查交接(生产上检测redis交接)
- 清除Redis缓存,轻松实现信息快速更新(清除redis的可以)
- 构建Redis缓存,保存商品信息(把商品信息存入redis)
- 成功跃层从博学谷学习Redis(博学谷redis)
- 利用Redis实现文件传输的简单策略(利用redis传输文件)
- Redis不包含的特性无需担心(以下哪项不属于redis)
- Redis实现高频限额控制(redis 高频限额控制)
- 无需实例化,Redis不同于一般数据库(redis 需要实例化么)
- 红色闪耀Redis集群无法支持多库(redis集群不支持多库)
- Redis集合处理高并发技术究竟如何运用(redis集合高并发)
- Redis实现高效的集合队列(redis 集合队列)
- 利用Redis集合快速实现批量数据删除(redis集合批量删除)
- 用Redis实现集合字段的自增操作(redis集合字段递增)
- 度运维Redis集合多维度运维之道(redis集合多维)
- Redis集合中最大值的突破(redis集合 max)
- 如何提升Redis队列的执行速度(redis队列执行速度)
- Redis连接数暴增不容忽视的影响(redis连接数暴增影响)
- Redis 强势升级,进阶实战从此开启(redis 进阶实战)
- Redis返回集合中的精彩元素(redis 返回集合元素)
- 利用Redis实现边界缓存(redis边路缓存)
- 利用Redis缓存提高对象数据性能(redis缓存对象数据)