【Redis】数据类型——set

一、操作

1.sadd:给set中添加值
格式: sadd key value1 value2

sadd myset v1
sadd myset v2
sadd myset v3
sadd myset v1//设置重复值时失败!

【Redis】数据类型——set_第1张图片

2.smembers:获取set中的所有值
格式:smembers key

smembers myset

在这里插入图片描述
3.sismember:判断某个值是否在set中
格式: sismember key value

sismember myset v1

【Redis】数据类型——set_第2张图片
4.scard:获取set中元素的个数
格式: scard key

scard myset

在这里插入图片描述
5.srem:删除set中的值
格式: srem key value1 value2…

srem myset v1 
srem myset v4//删除set集合中不存在的元素,则失败

【Redis】数据类型——set_第3张图片
6.srandmember:从set中获取随机值
格式: srandmember key count

srandmember myset 2//从set集合中获取指定个数的随机值

【Redis】数据类型——set_第4张图片
7.spop:随机删除指定个数个元素
格式: spop key count

spop myset 2//随机删除指定个数的元素

【Redis】数据类型——set_第5张图片
8.smove:将指定的元素从一个set中移动到另一个set中
格式: smove set1 set2 value

smove myset myset0 v2

【Redis】数据类型——set_第6张图片
【Redis】数据类型——set_第7张图片
9.简单应用:
抖音中,A用户将所有关注的人放在一个set集合中,将他的粉丝放在一个集合中可以实现共同关注,共同爱好,二度好友(推荐好友)等

sadd set1 a b c
sadd set2 c d e
sdiff set1 set2//差集
sinter set1 set2//交集(共同好友)
sunion set1 set2//并集

【Redis】数据类型——set_第8张图片
10.小结:set中的值是不能重复的

二、底层原理

Redis采用intset或hashtable来存储set。如果元素都是整数类型或者集合中的元素个数不大于 512(可以通过修改 set-max-intset-entries调整集合大小,默认512),使用inset存储。
如果不全是整数类型,就用hashtable(数组+链表的结构来存储),目的还是为了节省存储空间
1.intset定义

typedef struct intset
{
    // 编码方式
    uint32_t encoding;
    // 集合包含的元素数量
    uint32_t length;
    // 保存元素的数组
    int8_t contents[];
} 

2.intset的优点
(1)intset是非常紧凑的数据结构,占用的内存已经压缩的非常小了,可以提高内存的利用率。
(2)查询方式一般采用二分查找法,实际查询复杂度也就在log(n).
(3)intset底层是连续的内存空间,对CPU高速缓存支持更友好,提高查询效率。

你可能感兴趣的