Redis set
Redis set 使用以下方式向中添加一个成员,语法格式如下:
127.0.0.1:6379> SADD key member [member ...]
key:指定一个键
member:中要存储的成员。
和其他数据类型一样,当中一个成员被删除时,存储成员所用的数据结构也会被自动删除。
有一个非常重要的特性就是“自动去重”,这使得它可以适用于许多场景,比如过滤掉已中奖用户的 id,保证该用户不会被第二次抽中。
认识set
1) intset
Redis set 采用了两种方式相结的底层存储结构,分别是 intset(整型数组)与 hash table(哈希表),当 set 存储的数据满足以下要求时,使用 intset 结构:
内保存的所有成员都是整数值;
内保存的成员数量不超过 512 个。
当不满足上述要求时,则使用 hash table 结构。
Redis 中 intset 的结构体定义如下:
typedf struct inset{
uint32_t encoding;//指定编码方式,默认为INSET_ENC_INT16
uint32_t length;//内成员的总个数
int8_t contents[];//实际存储成员的数组,并且数组中的数值从小到大依次排列
}inset;
encoding:用来指定编码格式,共有三种,分别是 INTSET_ENC_INT16、INSET_ENC_INT32 和 INSET_ENC_INT64,它们对应不同的数值范围。Redis 为了尽可能地节省内存,它会根据插入数据的大小来选择不同的编码格式。
length:内成员的数量,记录 contents 数组中共有多少个成员。
contents:存储成员的数组,数组中的成员从小到大依次排列,且不允许重复。
intset 结构示意图如下所示:

在《Redis hash哈希散列(图解)》一节,我们已经对哈希表原理做了讲解, set 的哈希表与其相似,这里不再赘述。
令汇总
令 | 说明 |
|---|---|
SADD key member1 [member2] | 向中添加一个或者多个元素,并且自动去重。 |
SCARD key | 返回中元素的个数。 |
SDIFF key1 [key2] | 求两个或多个的差集。 |
SDIFFSTORE destination key1 [key2] | 求两个或多个的差集,并将结果保存到指定的中。 |
SINTER key1 [key2] | 求两个或多个的交集。 |
SINTERSTORE destination key1 [key2] | 求两个或多个的交集,并将结果保存到指定的中。 |
SIEMBER key member | 查看指定元素是否存在于中。 |
EMBERS key | 查看中所有元素。 |
OVE source destination member | 将中的元素移动到指定的中。 |
SPOP key [count] | 弹出指定数量的元素。 |
SRANDMEMBER key [count] | 随机从中返回指定数量的元素,默认返回 1个。 |
SREM key member1 [member2] | 删除一个或者多个元素,若元素不存在则自动忽略。 |
SUNION key1 [key2] | 求两个或者多个的并集。 |
SUNIONSTORE destination key1 [key2] | 求两个或者多个的并集,并将结果保存到指定的中。 |
SSCAN key cursor [match pattern] [count count] | 该令用来迭代的中的元素。 |
令演示
Redis 有特定的应用场景,比如用户的共同关注场景就可以使用 set 来实现。下面看一组示例,其中 user:1 与 user:2 代表两个用户,他们都关注了一些编程课程:在线练习工具:https://try.redis.io/#创建并添加多个成员
127.0.0.1:6379> SADD user:1 python java mysql
(integer) 3
127.0.0.1:6379> SADD user:2 python c redis
(integer) 3
#对两个求交集,求出他们共同关注的编程技术
127.0.0.1:6379> SINTER user:1 user:2
1) "python"
#两个求并集
127.0.0.1:6379> SUNION user:1 user:2
1) "java"
2) "python"
3) "mysql"
4) "redis"
5) "c"
#查看所有成员
127.0.0.1:6379> EMBERS user:1
1) "mysql"
2) "java"
3) "python"
#两个求并集,并把结果保存到另外一个user:3中
127.0.0.1:6379> SUNIONSTORE user:3 user:1 user:2
(integer) 5
#查看所有成员
127.0.0.1:6379> EMBERS user:3
1) "java"
2) "python"
3) "mysql"
4) "redis"
5) "c"
#从中弹出一个元素
127.0.0.1:6379> SPOP user:1 1
1) "python"
#从中弹出两个元素
127.0.0.1:6379> SPOP user:1 2
1) "mysql"
2) "java"
#查看元素个数
127.0.0.1:6379> SCARD user:2
(integer) 3
#迭代中元素
127.0.0.1:6379> SSCAN user:3 0
1) "0"
2) 1) "mysql"
2) "redis"
3) "java"
4) "python"
5) "c"
查看更多令:https://redis.io/commands
- 随机文章
- 核心危机(核心危机魔石合成攻略)
- 饿了么红包怎么用(饿了么红包怎么用微信支付)
- 儿童教育文章(儿童教育)
- 光遇花手先祖位置(安卓光遇手花先祖)
- 广州4a广告公司(广州4a广告公司创意总监年薪)
- 抖音卡(抖音卡顿怎么解决)
- 兵马俑(兵马俑介绍和历史背景)
- 陈武简历
- 韩国媳妇和小雪(韩国媳妇和小雪的父亲工资是多少)
- 鬼泣5攻略(鬼泣5攻略第三关怎么跳)
- 地球日主题(2020年世界地球日主题)
- 和柳亚子(和柳亚子先生于田)
- 冰客(冰客果汁)
- yy魔兽(yy魔兽世界)
- 国外成人游戏(国外成人游戏注册需要visa信用卡)
- 充值卡代理(充值卡代理加盟)
- 东天目山(东天目山景区)
- 杭同(杭同培训中心怎么样)
- 蝙蝠给人类的一封信(蝙蝠给人类的一封信)
- 大松电饭煲(美的大松电饭煲)
- 疯狂填字(疯狂填字5)
- 点对点短信息(点对点短信息费是什么意思)
- 河北省大运会(河北省大运会时间)
- 哈利波特官网(哈利波特官网在哪里)
- 骇客神条(骇客神条怎么辨别真假)
- 杜星霖(杜星霖图片)
- 广州晓港公园(广州晓港公园正门图片)
- 常州天宁寺(常州天宁寺求什么灵验)
- 河源巴伐利亚(河源巴伐利亚庄园)
- 广州中山大学(广州中山大学录取分数线2023)
