一、概述
集合(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开发与运维》
网友评论