一、操作
1.sadd:给set中添加值
格式: sadd key value1 value2
sadd myset v1
sadd myset v2
sadd myset v3
sadd myset v1//设置重复值时失败!

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

3.sismember:判断某个值是否在set中
格式: sismember key value
sismember myset v1

4.scard:获取set中元素的个数
格式: scard key
scard myset

5.srem:删除set中的值
格式: srem key value1 value2…
srem myset v1
srem myset v4//删除set集合中不存在的元素,则失败

6.srandmember:从set中获取随机值
格式: srandmember key count
srandmember myset 2//从set集合中获取指定个数的随机值

7.spop:随机删除指定个数个元素
格式: spop key count
spop myset 2//随机删除指定个数的元素

8.smove:将指定的元素从一个set中移动到另一个set中
格式: smove set1 set2 value
smove myset myset0 v2


9.简单应用:
抖音中,A用户将所有关注的人放在一个set集合中,将他的粉丝放在一个集合中可以实现共同关注,共同爱好,二度好友(推荐好友)等
sadd set1 a b c
sadd set2 c d e
sdiff set1 set2//差集
sinter set1 set2//交集(共同好友)
sunion set1 set2//并集

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高速缓存支持更友好,提高查询效率。
本文介绍了Redis中Set数据类型的常用操作,包括sadd、smembers、sismember等,并探讨了Set的底层存储原理,当元素为整数或数量小于512时使用intset,否则采用hashtable。intset的紧凑结构和二分查找带来了内存优化和查询效率的提升。
482

被折叠的 条评论
为什么被折叠?



