Redis的数据结构之Set

4,256 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

简介

Reids的set是集合类型,可以保存多个字符串元素,集合中的元素不能重复,并且集合中的元素也是无序的,无法通过下标来获取集合中的元素,这些特性与java的set非常类似。

数据结构

Redis的set底层使用了intset和hashtable两种数据结构存储的,其中intset可以理解为一种特殊的数组,而hashtable就是普通的哈希表。

Set的底层存储intset和hashtable存在编码转换,使用intset存储必须满足下面两个条件,否则使用hashtable,条件如下:

  • 1.结合对象保存的所有元素都是整数值
  • 2.集合对象保存的元素数量不超过512个

hashtable数据结构

hashtable的数据结构与上一章Hash中的结构基本一致,本章就不在重复说明。

intSet数据结构

图片.png

说明:

  • encoding:contents保存的数据类型,默认类型为int16_t。
  • contents:实际内容数组
  • length:contents的元素数量

基础命令

图片.png

sadd 添加元素

基本语法

sadd key value1...valuen

示例

图片.png

scard 获取集合的成员数

基本语法

scard key

示例

图片.png

sdiff 获取集合与集合的差集

基本语法

sdiff key1 key2

示例

图片.png

sinter 获取集合与集合的交集

基本语法

sinter key1 key2

示例

图片.png

sismember 判断member元素是否是集合key的成员

基本语法

sismember key member

示例

图片.png

smembers 获取集合中的所有成员

基本语法

smembers key

示例

图片.png

sunion 获取所有给定集合的并集

基本语法

sunion key1 key2

示例

图片.png

srem 移除一个或多个元素

基本语法

srem key member

示例

图片.png

sscan 迭代集合中元素

基本语法

sscan key cursor [match pattern] count

说明:

  • cursor:游标,从0开始
  • pattern :匹配模式
  • count:指定从数据集里返回多少元素,默认值为10.

示例

sscan mset 0 match j*

图片.png

应用场景

  • 统计手机App每天的新增用户数

key以user:id 以及当天日期,例如 user:id:20200803; value为Set集合,记录当天登录的用户ID。

  • 博客共同好友

    通过set的获取多个集合的交集即可。

  • 网页UV的统计

统计用户每天访问网页的次数,一个用户一天内的多次访问只能算作一次。

注意事项

采用Set对于一些大集合进行相关的精确统计时,效率非常低,内存开销大,在生产环境尽量避免。

总结

本章讲解了Redis的数据结构Set,需要注意redis的set的聚合操作使用场景,如有疑问请随时反馈。