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

 更新时间:2023年06月12日 09:11:51   作者:小万哥  
这篇文章主要为大家介绍了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"

以上就是Redis数据结构高频面试问题解析的详细内容,更多关于Redis数据结构高频面试的资料请关注脚本之家其它相关文章!

相关文章

  • react之umi配置国际化语言locale的踩坑记录

    react之umi配置国际化语言locale的踩坑记录

    这篇文章主要介绍了react之umi配置国际化语言locale的踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • React模拟实现Vue的keepAlive功能

    React模拟实现Vue的keepAlive功能

    Vue中,keep-alive组件可以缓存组件状态,在路由切换时重新挂载,实现这一功能在React中并不简单,但我们可以借助一个第三方库——react-activation 来模拟Vue的keep-alive功能,需要的朋友可以参考下
    2024-10-10
  • 手挽手带你学React之React-router4.x的使用

    手挽手带你学React之React-router4.x的使用

    这篇文章主要介绍了手挽手带你学React之React-router4.x的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • React实现动效弹窗组件

    React实现动效弹窗组件

    最近在使用react开发项目,遇到这样一个需求实现一个带有动效的 React 弹窗组件,如果不考虑动效,很容易实现,接下来小编通过本文给大家介绍React实现动效弹窗组件的实现代码,一起看看吧
    2021-06-06
  • react使用axios进行api网络请求的封装方法详解

    react使用axios进行api网络请求的封装方法详解

    这篇文章主要为大家详细介绍了react使用axios进行api网络请求的封装方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • useEffect中不能使用async原理详解

    useEffect中不能使用async原理详解

    这篇文章主要为大家介绍了useEffect中为什么不能使用async的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React实现反向代理和修改打包后的目录

    React实现反向代理和修改打包后的目录

    这篇文章主要介绍了React实现反向代理和修改打包后的目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • React Fiber构建源码解析

    React Fiber构建源码解析

    这篇文章主要为大家介绍了React Fiber构建源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • React Hooks 钩子的具体使用

    React Hooks 钩子的具体使用

    React Hooks是React 16.8引入的重要特性,让函数组件能够拥有类组件的状态和生命周期能力,下面就来介绍一下React Hooks的具体使用,m感兴趣的可以了解一下
    2025-09-09
  • React状态管理器Rematch的使用详解

    React状态管理器Rematch的使用详解

    rematch是对redux的二次封装,简化了redux是使用,极大的提高了开发体验,这篇文章主要介绍了React状态管理器Rematch的使用,需要的朋友可以参考下
    2022-09-09

最新评论