Redis学习笔记:Set类型内部编码及其应用场景

一、概述

集合(Set)类型是用来保存多个字符串元素,但是与list类型不停,集合中不允许有重复元素,一个集合最对可以存储2^32-1个元素,Redis除了支持集合内的增删改查,同时还支持多个集合的交并差集操作,合理地使用集合可以在实际开发中解决很多实际问题。

二、常用命令

1.集合内操作

  • 添加元素:sadd key element [element ...],返回结果为添加成功的元素个数;
  • 删除元素:srem key element [element ...],返回结果为成功删除的元素个数;
  • 计算元素个数:scard key ,该命令的实际复杂度为O(1),不会遍历集合中所有元素,而是直接使用Redis的内部变量;
  • 判断元素是否在集合中:sismember key element,存在则返回1,否则返回0;
  • 随机从集合中返回指定的个数元素:srandmember key [count]
  • 从集合随机弹出元素:spop key
  • 获取全部元素:smembers key

2.集合间操作

  • 取交集:sinter key [key ...]
  • 取并集:suinon key [key ...]
  • 取差集:sdiff key [key ...]

三、内部编码

集合类型的内部编码有两种:

  • intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用;
  • hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现;

在实际开发过程中,合理地设计集合元素类型,并预估元素个数,可以有效减少内存资源的消耗。

四、使用场景

集合类型典型的使用场景是标签功能(tag),标签数据对用户体验以及增强用户粘度比较重要(在推荐系统中尤其重要);

下面简单介绍如何使用集合类型实现标签功能的若干功能:

1.给用户添加标签:

    sadd user:1:tags  tag1  tag2  tag3
    sadd user:2:tags  tag1  tag2  tag4
    ...
    sadd user:2:tags  tag1  tag2  tag5

2.给标签添加用户:

    sadd tag1:users user:1  user:2
    sadd tag2:users user:1  user:3
    ...
    sadd tag3:users user:1  user:4

3.删除用户下的标签:

    srem  user:1:tags  tag1  tag5

4.计算用户通过感兴趣的标签:

    sinter user:1:tags user:2:tags

备注:在开发过程中,用户和标签的关系维护应该在一个事务里面执行,防止部分命令失败造成数据不一致。

总结:实际开发一个标签系统远不止以上这些,还有很多复杂的情况需要考虑,不过集合类型的应用场景通常为以下几种:

  • sadd = Tags(标签)
  • spop/srandmember = Random item(生成随机数,抽奖活动/抽卡游戏)
  • sadd + sinter = Social Graph(社交需求)

感谢阅读~

参考资料:


《Redis开发与运维》

你可能感兴趣的:(Redis学习笔记:Set类型内部编码及其应用场景)