Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试题43:介绍一下Redis中set类型的实现方式是什么?

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

作者头像
爪哇缪斯
发布于 2023-05-09 13:43:16
发布于 2023-05-09 13:43:16
18700
代码可运行
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯
运行总次数:0
代码可运行

【概述】

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

【内部实现】

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

【intset】

  • intset编码集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《闲扯Redis九》Redis五种数据类型之Set型
Redis 中的 Set 是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中。
大道七哥
2020/07/31
6910
《闲扯Redis九》Redis五种数据类型之Set型
跟着大彬读源码 - Redis 6 - 对象和数据类型(下)
ziplist 编码的哈希对象使用压缩列表作为底层实现。每当有新的键值对要加入到哈希对象时,程序会先将保存了键的压缩列表节点推入到表尾,然后再将保存了值的压缩列表节点推入到表尾。因此:
北国风光
2019/07/25
4460
跟着大彬读源码 - Redis 6 - 对象和数据类型(下)
面试官:Redis中集合数据类型的内部实现方式是什么?
虽然已经是阳春三月,但骑着共享单车骑了这么远,还有点冷的。我搓了搓的被冻的麻木的手,对着前台的小姐姐说:“您好,我是来面试的。”小姐姐问:“您好,您叫什么名字?”我回答:“我叫万猫学社。”小姐姐笑出了声,说道:“这名字好怪,谁给你起的啊。”我面无表情地回答:“俺爹。”小姐姐收起了笑容,说道:“跟我来吧。”我被带到了面试间等候,片刻后一个干净满脸清秀的青年走了进来,一股男士香水的淡香扑面而来。
万猫学社
2022/04/22
2400
Redis 数据结构与对象编码 (Object Encoding)
为了将性能优化到极致,redis 作者为每种数据结构提供了不同的实现方式,以适应特定应用场景。
烂猪皮
2020/11/10
6970
Redis数据结构:Set类型全面解析
Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。相对于列表,集合也有两个特点:无序、不可重复
栗筝i
2023/10/16
1.8K1
Redis数据结构:Set类型全面解析
面试题45:介绍一下Redis中hash类型的实现方式是什么?
【概述】 适用场景 存储无序字典的数据。比如:适合存储对象类型。比如存储猪肉价格。 它的内部采用数组+链表的结构,类似java里的HashMap。 hash的key值只能是字符串。将对象存储为hash结构可以针对需要来获取部分数据,而不是将整个对象获取。减少网络资源浪费。 rehash采用了渐进式的策略。 ---- 【内部实现】 哈希对象编码支持ziplist和hashtable两种。 ---- 【ziplist】 ziplist编码底层使用压缩列表实现,当有新的键值对要加入到哈希对象时,会先将key值
爪哇缪斯
2023/05/09
2480
面试题45:介绍一下Redis中hash类型的实现方式是什么?
面试遇到 Redis,我作为小白是这么被“刁难”的!|还可以学到什么(1)?
http://redisbook.com/preview/object/set.html
早起的鸟儿有虫吃
2021/03/22
5410
面试遇到 Redis,我作为小白是这么被“刁难”的!|还可以学到什么(1)?
面试题42:介绍一下Redis中list类型的实现方式是什么?
【概述】 适用场景:消息队列。 它的特点:内部元素有序、重复,并且插入和删除很快O(1),但是查找却很慢O(n)。功能支持队列和栈操作。 ---- 【内部实现】 列表对象的编码支持ziplist和linkedlist两种。 ---- 【ziplist】 ziplist编码列表对象,采用压缩列表实现。每个列表节点保存一个列表中的元素。比如我们插入a、b、c三个元素到列表中: 127.0.0.1:6379> RPUSH testlist a b c (integer) 3 那么它的存储结构是这样的:
爪哇缪斯
2023/05/09
1860
面试题42:介绍一下Redis中list类型的实现方式是什么?
redis源码之set结构
关于set的命令和常用场景我们暂时先不说了,如果对命令不太熟悉的朋友可以用 help @set命令查看,我们先来看set中的一种现象
程序员小饭
2020/10/14
6660
redis源码之set结构
Redis(5)——set
集合set类型的保存多个字符串元素,集合不允许存在重复元素,并且集合的元素是无序的,不能通过索引下标获取元素
羊羽shine
2019/05/29
3580
面试题41:介绍一下Redis中String类型的实现方式是什么?
【概述】 适用场景 缓存业务信息,且只是根据key直接获取缓存value,不需要排序,去重等功能。 string是Redis中最简单的数据结构,但是却是大家日常使用频率最高的数据结构。 它使用简单,并且扩展性非常的强。我们可以设置普通的字符串,也可以使用json存储复杂value信息。存取速度也是最快的。 字符串存储的底层结构其实就是字符数组。 这个字符串是动态的,是可修改的。内部采用预分配冗余空间的方式来减少内存的频繁分配。分配方式如下所示: 当存储的字符串大小<=1M的时候,都是翻倍扩容。 如果存储的
爪哇缪斯
2023/05/09
2030
面试题41:介绍一下Redis中String类型的实现方式是什么?
Redis 集合
集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。一个集合最多可以存储 232−1 2^{32}-1 个元素。Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题。
三产
2021/01/12
5810
redis之五种基本数据类型
本文主要讲解 redis 的五种基本数据类型:String、List、Set、Sorted Set、Hash。学习如何使用它们,并且了解它们的底层数据结构实现,这样我们才能在适当的应用场景选择最适合的数据类型来解决我们的需求。
编程黑洞
2023/03/06
1K0
redis之五种基本数据类型
redis基础指令及数据类型
全局指令 redis有5种数据类型,它们是键值对中的值,对于键来说有些通用的命令。这里称之为全局指令。 set 创建一个键值对
小手冰凉
2020/07/14
3690
Redis使用及源码剖析-8.Redis对象-2021-1-21
Redis对象系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象。每一种对象底层都由前面介绍的SDS,双向链表,哈希表,跳表,整数集合或者压缩列表等一种数据结构实现,下面会详细进行介绍。 Redis 使用对象来表示数据库中的键和值, 每次当我们在 Redis 的数据库中新创建一个键值对时, 我们至少会创建两个对象, 一个对象用作键值对的键(键对象), 另一个对象用作键值对的值(值对象) 键对象均有字符串对象表示,值对象可以时五种对象中的任意一种,因此当说一个键是列表键时,指的是值的类型是列表对象。对一个键执行type命令时,返回的类型也是键对应的值得类型,如下所示:
用户7719114
2022/02/22
5770
Redis使用及源码剖析-8.Redis对象-2021-1-21
redis数据结构入门
Redis 提供了丰富的数据结构,而每种数据结构又都有自己底层的内部编码实现,而且可能是多种实现
vitofliu
2019/06/29
5370
Redis专题(2):Redis数据结构底层探秘
上篇文章 Redis闲谈(1):构建知识图谱介绍了redis的基本概念、优缺点以及它的内存淘汰机制,相信大家对redis有了初步的认识。互联网的很多应用场景都有着Redis的身影,它能做的事情远远超出了我们的想像。Redis的底层数据结构到底是什么样的呢,为什么它能做这么多的事情?本文将探秘Redis的底层数据结构以及常用的命令。
宜信技术学院
2019/06/18
6280
Redis专题(2):Redis数据结构底层探秘
Redis类型(Type)与编码(Encoding)
Redis是一款开源的高性能key-value数据库,广泛应用于各种场景。在Redis中, 数据类型(Type)和编码(Encoding) 是非常重要的概念。本篇博客将详细介绍Redis支持的数据类型以及相应的编码方式和底层实现原理。
BookSea
2023/09/26
5270
Redis类型(Type)与编码(Encoding)
Redis的数据类型——探究竟
接上篇 为什么要用Redis,今天来聊聊具体的Redis数据类型与命令。本篇是深入理解Redis的一个重要基础,请坐稳,前方 长文预警。
大愚
2018/09/13
6610
Redis的数据类型——探究竟
Redis详解(五)------ redis的五大数据类型实现原理
  前面两篇博客,第一篇介绍了五大数据类型的基本用法,第二篇介绍了Redis底层的六种数据结构。在Redis中,并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这些对象系统也就是前面说的五大数据类型,每一种数据类型都至少用到了一种数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型判断一个对象是否可以执行给定的命令,而且可以针对不同的场景,为对象设置多种不同的数据结构,从而优化对象在不同场景下的使用效率。
IT可乐
2018/07/31
1.5K0
Redis详解(五)------ redis的五大数据类型实现原理
推荐阅读
相关推荐
《闲扯Redis九》Redis五种数据类型之Set型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验