欢迎光临
我们一直在努力

腾讯面试官经常问的问题:Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!

🚀 Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!

很多 Java 后端开发者都会使用 Redis:

redisTemplate.opsForValue().set("user:1", user);

但是面试官继续问:

Redis 有哪些数据结构?底层为什么这么设计?分别适用于什么场景?

很多人只能回答:

String、List、Set、Hash、ZSet。

这个答案只能拿基础分。

真正理解 Redis,需要知道:

  • 每种数据结构解决什么问题?
  • 什么时候使用?
  • 底层为什么快?

今天一篇文章彻底搞懂 Redis 五大核心数据结构。


一、Redis 为什么这么快?

在了解数据结构之前,先理解 Redis 的设计思想。

Redis 高性能主要来自:

1. 基于内存存储

传统数据库:

磁盘

读取数据

速度较慢。

Redis:

内存

直接访问

速度非常快。


2. 单线程事件模型

Redis 核心命令执行采用单线程:

请求1

请求2

请求3

Redis线程依次执行

避免:

  • 线程切换
  • 锁竞争

3. 高效的数据结构

Redis 没有简单使用 Java 集合。

而是自己设计:

  • SDS
  • ziplist
  • quicklist
  • skiplist

等底层结构。


二、Redis 五大基本数据结构

Redis 常用数据结构:

数据结构特点典型应用
String 字符串 缓存、计数器
Hash 键值对集合 对象存储
List 列表 消息队列
Set 无序集合 标签、去重
ZSet 有序集合 排行榜

下面详细介绍。


一、String:最常用的数据结构

1. 什么是 String?

String:

就是字符串类型。

例如:

key:

user:name

value:

Tom

Redis:

SET user:name Tom

获取:

GET user:name

结果:

Tom


2. String 能存什么?

不仅仅是字符串。

还可以存:

数字

例如:

SET count 100

增加:

INCR count

结果:

101


JSON对象

例如:

{
"id":1,
"name":"Tom"
}

转换成字符串存储。


String 应用场景

1. 缓存

例如:

数据库:

MySQL

用户信息

缓存:

Redis

user:1001

查询:

请求

Redis

没有

MySQL


2. 计数器

例如:

文章点赞:

INCR article:like:1001


3. 分布式锁

例如:

SET lock:user:1 true NX EX 10


二、Hash:存储对象

1. 什么是 Hash?

Hash 类似:

Java 中:

Map<String,Object>

例如用户:

user:1001

name = Tom

age = 20

address = Beijing

Redis:

HSET user:1001 name Tom
HSET user:1001 age 20


查询:

HGET user:1001 name

返回:

Tom


Hash 应用场景

存储对象信息

例如:

用户:

{
"name":"Tom",
"age":20
}

可以:

Redis Hash

user:1001

name Tom

age 20


优点:

修改一个字段:

不用重新存整个对象。


三、List:列表结构

1. 什么是 List?

List:

类似 Java:

LinkedList

特点:

  • 有序
  • 可重复

例如:

A

B

C


Redis:

左边插入:

LPUSH list A

右边弹出:

RPOP list


List 应用场景

1. 消息队列

例如:

生产者:

订单服务

Redis List

消费者


流程:

生产消息

LPUSH

消费消息

RPOP


2. 最新消息列表

例如:

微博:

最新动态。


四、Set:无序集合

1. 什么是 Set?

Set:

类似 Java:

HashSet

特点:

  • 无序
  • 不重复

例如:

用户标签:

Java

Redis

Spring


添加:

SADD user:tag Java


Set 应用场景

1. 去重

例如:

统计访问用户:

user1

user2

user1

Set:

自动去重。


2. 共同好友

例如:

用户A:

张三
李四
王五

用户B:

李四
王五
赵六

求共同好友:

SINTER userA userB

结果:

李四
王五


五、ZSet:有序集合(重点)

1. 什么是 ZSet?

ZSet:

Sorted Set。

特点:

有序 + 不重复。

它比 Set 多一个:

score(分数)


例如排行榜:

用户 分数

Tom 100

Jack 90

Lucy 80

Redis:

ZADD rank 100 Tom


查询排名:

ZRANGE rank 0 10


ZSet 应用场景

1. 排行榜

例如:

游戏排名:

玩家积分排行榜


2. 热门文章

文章:

score:

代表:

阅读量。


六、Redis 数据结构底层实现

面试高级问题:

Redis 五种数据结构底层是什么?


String

底层:

SDS:

(Simple Dynamic String)

优势:

  • 获取长度快
  • 二进制安全
  • 扩容方便

Hash

底层:

根据数据量:

可能使用:

  • ziplist
  • listpack
  • hash table

List

底层:

以前:

ziplist

后来:

quicklist


Set

底层:

  • hash table
  • intset

ZSet

底层:

  • skiplist(跳表)
  • hash table

七、Redis 常见数据结构选择

实际开发:

需求选择
缓存对象 String / Hash
计数 String
点赞数量 String
用户信息 Hash
消息队列 List
去重统计 Set
共同好友 Set
排行榜 ZSet
热点排行 ZSet

八、面试最终回答

如果面试官问:

Redis 有哪些数据结构?

可以这样回答:

Redis 常用的数据结构主要有五种:String、Hash、List、Set 和 ZSet。String 常用于缓存和计数器;Hash 适合存储对象;List 可以实现消息队列;Set 用于去重和集合运算;ZSet 通过 score 实现排序,常用于排行榜。Redis 底层针对不同场景设计了 SDS、HashTable、QuickList、SkipList 等高效结构,因此能够实现高性能的数据访问。


最后一句话记忆:

String:存一个值

Hash:存一个对象

List:存一串数据

Set:存不重复数据

ZSet:带排名的数据

掌握这五种数据结构,你就掌握了 Redis 80% 的日常使用场景。

赞(0)
未经允许不得转载:171主机测评 » 腾讯面试官经常问的问题:Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址