首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试题43:介绍一下Redis中set类型的实现方式是什么?

面试题43:介绍一下Redis中set类型的实现方式是什么?

作者头像
爪哇缪斯
发布2023-05-09 21:43:16
发布2023-05-09 21:43:16
3770
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

【概述】

  • 适用场景: 存储有去重需求的数据;比如:针对一篇文章用户进行点赞操作。
  • 它的特点是内部元素无序且不重复。它的内部实现相当于一个特殊的字典,字典中所有的value指都为NULL。

【内部实现】

  • 集合对象的编码可以是intsethashtable

【intset】

  • intset编码集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
代码语言:javascript
复制
127.0.0.1:6379> SADD number 1 2 3 4
(integer) 4
127.0.0.1:6379> OBJECT encoding number
"intset"
  • 数据结构如下:

【hashtable】

  • 字典作为底层实现,每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值则全部被设置为NULL。
  • 数据结构如下:

【编码转换规则】

  • 当集合对象同时满足以下两个条件时,对象使用intset编码,否则使用hashtable编码:
    • 条件1:集合对象保存的所有元素都是整数值。
    • 条件2:集合对象保存的元素数量不超过512个。
  • 演示如下所示:
代码语言:javascript
复制
127.0.0.1:6379> SADD alphabet a b c d
(integer) 4
127.0.0.1:6379> OBJECT encoding alphabet
"hashtable"
127.0.0.1:6379> EVAL "for i=1, 512 do redis.call('SADD', KEYS[1], i) end" 1 bigset
(nil)
127.0.0.1:6379> SCARD bigset
(integer) 512
127.0.0.1:6379> OBJECT encoding bigset
"intset"
127.0.0.1:6379> SADD bigset 513
(integer) 1
127.0.0.1:6379> SCARD bigset
(integer) 513
127.0.0.1:6379> OBJECT encoding bigset
"hashtable"
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 【概述】
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档