redis 四. set应用场景及底层分析

一. 简单命令示例

  1. Set 可以看成是一个无重复数据容器
  2. 简单命令示例
//1.添加元素
SADD key member[member...]
//2.删除元素
SREM key member[member...]
//3.遍历集合中所有元素
SMEMBERS key
//4.判断元素是否存在
SISMEMBER key member
//5.获取集合元素总个数
SCARD key
//6.从集合中随机弹出一个元素,不删除
SRANDMEMBER key[数字]
//7.从集合中随机弹出一个元素,并删除
SPOP key[数字]
//8.集合运算
  1. 进阶命令 集合运算
//首先向redis存储两个set集合元素
sadd set1 a b c 1 2
sadd set2 1 2 a 3 x

//1.差集:获取set1中独有的元素,返回b,c
SDIFF set1 set2

//2.交集:获取set1与set2中共同拥有的数据,返回a,1,2
SINTER set1 set2

//3.合集:获取set1与set2所有的数据
SUNION set1 set2

二. java 操作示例

  1. 操作 Set 无序集合类型,不允许重复的成员,是通过哈希表实现的,所有添加,删除,查找的复杂度都是O(1),优点:天然去重,可以取交集,差集等
	@Test
    public void testSet() {
        //1.创建操作Set类型数据的对象
        SetOperations<String, String> setOperations = stringRedisTemplate.opsForSet();

        //模拟数据
        String[] letters = new String[]{"aaa", "bbb", "ccc", "ddd", "eee"};

        //1.批量添加
        setOperations.add("letters", letters);
        //2.批量获取
        Set<String> let = setOperations.members("letters");

        //3.删除redis中key为letters的set类型数据中的aaa,bbb数据*
        setOperations.remove("letters", "aaa", "bbb");
    }

三. 使用场景

  1. 抽奖:key为奖品id,对应key中存储的是所有参与的用户id
//参加抽奖
SADD key
//1.获取参与人数
SCARD key
//2.随机获取5个人获取抽奖机会(不删除)
SRANDMEMBER key5
//3.5人中随机3人中奖(删除)
SPOP key[数字]
  1. 朋友圈点赞
//1.新增点赞
SADD
//2.取消点赞
SREM
//3.展现所有点赞过的用户
SMEMBERS
//4.点赞用户数统计
SCARD
//5.判断某个朋友是否都楼主点赞
SISMEMBER 
  1. 好友关注社交关系图,猜你喜欢,可能认识的人
//共同关注的人交集(共同好友,共同爱好)
SINTER set1 set2
//两个人,推荐给我可能认识的人 差集
SDIFF 他 我

四. 底层分析

  1. 首先确定redis中set类型有两种编码格式intset与hashtable
  2. 通过"config get set* " 命令查看一个参数"set-max-intset-entries" 默认值是512
  3. 当redis中存储set类型数据时,如果元素都是"long long"类型,并且元素个数小于等于"set-max-intset-entries",那么set类型使用intset编码格式,否则使用hashtable编码格式
  4. 示例(先查看"set-max-intset-entries"值为512,然后修改为3, 然后存储一个set类型数据"sadd set1 123" 满足小于等于3的条件,查看编码格式为intset, 后续再存储"sadd set1 abcd" 不是long类型,查看编码格式为hashtable)
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值