【Redis】数据类型——set

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

一、操作

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高速缓存支持更友好,提高查询效率。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值