Redis 数据结构:高频面试题及解析

概述

Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。

键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。

Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。

数据类型

数据类型可以存储的值操作
STRING字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作,对整数和浮点数执行自增或者自减操作
LIST列表从两端压入或者弹出元素,对单个或者多个元素进行修剪,只保留一个范围内的元素
SET无序集合添加、获取、移除单个元素,检查一个元素是否存在于集合中,计算交集、并集、差集,从集合里面随机获取元素
HASH包含键值对的无序散列表添加、获取、移除单个键值对,获取所有键值对,检查某个键是否存在
ZSET有序集合添加、获取、删除元素,根据分值范围或者成员来获取元素,计算一个键的排名

STRING

Redis 的 String 类型使用 SDS(简单动态字符串)作为底层的数据结构实现。SDS 与 C 字符串有所不同,它不仅可以保存文本数据,还可以保存二进制数据。这是因为 SDS 使用 len 属性的值而不是空字符来判断字符串是否结束,并且 SDS 的所有 API 都会以处理二进制的方式来处理 SDS 存放在 buf[] 数组里的数据。因此,SDS 不仅能存放文本数据,还能保存图片、音频、视频、压缩文件等二进制数据。

另外,Redis 的 SDS API 是安全的,拼接字符串不会造成缓冲区溢出。这是因为 SDS 在拼接字符串之前会检查 SDS 空间是否满足要求,如果空间不够会自动扩容,从而避免了缓冲区溢出的问题。

此外,获取字符串长度的时间复杂度是 O(1),因为 SDS 结构里用 len 属性记录了字符串长度,所以获取长度的复杂度为 O(1)。相比之下,C 语言的字符串并不记录自身长度,所以获取长度的复杂度为 O(n)。这些特性使得 SDS 成为 Redis 的一个重要组成部分。

> set hello world
OK
> get hello
"world"
> del hello
(integer) 1
> get hello
(nil)

LIST

Redis 的 List 类型底层数据结构可以由双向链表或压缩列表实现。如果列表元素个数小于 512 个且每个元素的值都小于 64 字节,则 Redis 会使用压缩列表作为底层数据结构;否则,Redis 会使用双向链表作为底层数据结构。然而,在 Redis 3.2 版本之后,List 类型底层数据结构只由 quicklist 实现,代替了双向链表和压缩列表。

> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"> lindex list-key 1
"item2"> lpop list-key
"item"> lrange list-key 0 -1
1) "item2"
2) "item"

SET

Set 类型的底层数据结构可以是哈希表或整数集合。当集合中的元素都是整数并且元素个数小于512时,Redis使用整数集合作为Set类型的底层数据结构;否则,Redis使用哈希表作为Set类型的底层数据结构。

> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0> smembers set-key
1) "item"
2) "item2"
3) "item3"> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1> srem set-key item2
(integer) 1
> srem set-key item2
(integer) 0> smembers set-key
1) "item"
2) "item3"

HASH

Redis 中的 Hash 类型的底层数据结构可以是压缩列表或哈希表。如果元素个数小于 512 个且每个元素的值都小于 64 字节,Redis 会使用压缩列表作为底层数据结构;否则会使用哈希表。在 Redis 7.0 中,压缩列表已经废弃,改用 listpack 数据结构来实现。

> hset hash-key sub-key1 value1
(integer) 1
> hset hash-key sub-key2 value2
(integer) 1
> hset hash-key sub-key1 value1
(integer) 0> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"> hdel hash-key sub-key2
(integer) 1
> hdel hash-key sub-key2
(integer) 0> hget hash-key sub-key1
"value1"> hgetall hash-key
1) "sub-key1"
2) "value1"

ZSET

Zset 类型的底层数据结构可以是压缩列表或跳表。

如果有序集合的元素个数小于 128 个,且每个元素的值小于 64 字节,则 Redis 会使用压缩列表作为 Zset 类型的底层数据结构。

如果有序集合的元素个数大于等于 128 个或者每个元素的值大于等于 64 字节,则 Redis 会使用跳表作为 Zset 类型的底层数据结构。

需要注意的是,Redis 7.0 中废弃了压缩列表数据结构,改用 listpack 数据结构来实现。

> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

最后

为了方便其他设备和平台的小伙伴观看往期文章:

微信公众号搜索:Let us Coding,关注后即可获取最新文章推送

看完如果觉得有帮助,欢迎 点赞、收藏、关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218945.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nature 确认:大语言模型只是没有感情的「学人精」

DeepMind、EleutherAI 科学家提出,大模型只是在角色扮演。 ChatGPT 爆火后,大语言模型一跃而至,成为了行业与资本的宠儿。而在人们或是猎奇、或是探究地一次次对话中,大语言模型所表现出的过度拟人化也引起了越来越多的关注。 其实…

【DEBUG】AttributeError: module ‘numpy‘ has no attribute ‘object‘

error File “numpy/init.py”, line 305, in getattr AttributeError: module ‘numpy’ has no attribute ‘object’. np.object was a deprecated alias for the builtin object. To avoid this error in existing code, use object by itself. Doing this will not modif…

【数据结构】哈希经典应用:布隆过滤器(哈希+位图)——[深度解析](9)

前言 大家好吖,欢迎来到 YY 滴 数据结构 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴 数据结构 专栏!更多干货持续更新!以下是传送门! 目录 一.布隆过滤器产生的…

第31期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

Plasmocin® Treatment (ant-mpt)可用于干细胞支原体污染清除

Plasmocin™作为Invivogen的支原体抗生素产品之一,受国内外许多科研工作者使用并大力推广。其包含大环内酯物及对苯二酚两种主要成分,可有效作用于支原体复制的蛋白合成阶段和DNA复制阶段,只需两周即可清除支原体污染,并且不会影响…

【CANoe】CANoe手动发送XCP报文读取观测量

文章目录 1、硬件连接:配置CANoe的CAN端口,连接到ECU标定对应的CAN口2、配置CAN IG模块报文:连接XCP,读取观测量,断开XCP3、报文解析4、参考资料 1、硬件连接:配置CANoe的CAN端口,连接到ECU标定…

文本生成图片 学习笔记

目录 diffusion-v1-5 修改参数sample_size: diffusion-v1-5 安装: pip install diffusers 模型下载地址: 深入浅出完整解析Stable Diffusion(SD)核心基础知识 - 知乎 from diffusers import StableDiffusionPipeline import torchmodel_id = "./stable-diffus…

构筑安全之城:迅软DSE助力大型建筑企业打造数据防泄密方案

电子文件如今已成为各大建筑机构和设计院进行信息存储的主要方式,以及信息交换的重要载体。而对于如何保护好单位内的设计图纸、工程方案等重要资料的数据防泄密问题,就需要相关单位规划好一套合规有效的数据防泄密解决方案。 企业简介 该企业是我国最早…

压缩pdf怎么压缩又小又清晰?超级实用!

当PDF文件过大时,很容易遇到无法上传等现象,这时候我们可以借助一些专业的压缩工具,将PDF文件压缩变小,如果你还不知道怎么做,下面就来看下具体的压缩方法吧。 方法一:使用嗨格式压缩大师 1、打开电脑上安…

Leetcode 78 子集

题意理解: 求一个集合的所有子集。该集合中没有重复元素。 首先明确什么是子集:子集中的元素都在全集里。 [1,2,3] 子集:[]、[1]、[2]、[3]、[12]、[13]、[23]、[123] 注意:[]空集是所有集合的子集。 解题思路: 类似于…

【obs】官方最强插件obs-websocket入门

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ obs-websocket简介OBS版本说明obs-websocket版本说明安装(27.x版本OBS)配置插件 2️⃣ OBS-web介绍特征使用方法-5.xhttp vs https 3️⃣ obs-websocket-js开发tester.html 4️⃣ 其它开源项目obs-stud…

vue2-使用vue-i18n搭建多语言切换环境

安装 注意:vue2.0要用8版本的,使用9版本的会报错 npm install vue-i18n8.27.0 --save 创建相关的语言包文件 在src目录下,新建i18n文件夹 在新文件夹i18n中新建langs文件夹,里边放语言文本文件.js zh.js:存…

vmware 使用scsi_id 获取ID返回空

/usr/lib/udev/scsi_id -g -u -d --whitelisted --replace-whitespace --device/dev/sdb2 结果返回是空的,根本的原因是 虚拟机的设置问题。 修改虚拟机的配置文件,vmx后缀的那个:例如 CentOS 7 64 位.vmx disk.EnableUUID "TRUE&quo…

ADC学习总结

ADC的架构分类: 1、Delta-Sigma 采样率一般是在1M以内,位数一般可以做的很高,比如24位,Delta-Sigma ADC采用了过采样技术,不需要在模拟输入端加抗混叠滤波,由后端数字滤波器进行处理,通过信噪…

Yearning安装及使用

Yearning是基于go和vue开发的一款SQL审核工具。在实际开发中,生产环境DDL、DML脚本一般需要走工单流程进行审批后执行,Yearning可以制定MySQL的SQL审核流程、规范及审批等功能。 一、主要功能 1.支持自定义SQL审核流程2.自动化SQL语句审核,可对SQL进行…

springboot(ssm北工国际健身俱乐部 健身管理系统Java系统

springboot(ssm北工国际健身俱乐部 健身管理系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0) …

什么是高阶组件

高阶组件(HOC)是一个将组件作为参数并返回一个新组件的函数。他是一种由 React 自身组合性质产生的模式。由于高阶组件接受他的组件参数来动态创建子组件,且不会修改或复制其组件中的任何行为,因此他与纯组件较为类似。 高阶组件可…

初学者如何入门 Generative AI 之 Stable Diffusion 与 CLIP :看两篇综述,玩几个应用感受一下先!超多高清大图,沉浸式体验

文章大纲 4种 图片生成 的算法扩散模型的起源Stable DiffusionUNetCLIP参考文献与学习路径A synthography of an astronaut riding a horse created in NightCafe Studio with Stable Diffusion XL (SDXL). Prompt is a photograph of an astronaut riding a horse with weight…

MySQL之DML语句

DML语句 数据操作语言DML(Data Manipulation Langua) 是SQL语言的一个分类,用于对表的数据进行增,删,改,查 创建表 CREATE TABLE 语句用于创建数据库中的表。 语法: CREATE TABLE 表名称 (列…

DDD领域驱动架构设计学习网站和开源框架

文章目录 介绍1、国外Axon2、阿里Cola 介绍 近年来,关于DDD的讨论越来越多,关于网上的文章很多都是理论上的介绍,由于自己最近也在学习相关知识,所以分享几个关于DDD落地的开源框架。 1、国外Axon Axon是国外一款比较系统的DDD…