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

腾讯面试官经常问的问题:Redis 为什么能快到飞起?搞懂这 5 种核心数据结构,你就掌握了 Redis 高性能的秘密!
Redis 为什么能快到飞起搞懂这 5 种核心数据结构你就掌握了 Redis 高性能的秘密很多 Java 后端开发者都会使用 RedisredisTemplate.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 集合。而是自己设计SDSziplistquicklistskiplist等底层结构。二、Redis 五大基本数据结构Redis 常用数据结构数据结构特点典型应用String字符串缓存、计数器Hash键值对集合对象存储List列表消息队列Set无序集合标签、去重ZSet有序集合排行榜下面详细介绍。一、String最常用的数据结构1. 什么是 StringString就是字符串类型。例如key: user:name value: TomRedisSET user:name Tom获取GET user:name结果Tom2. String 能存什么不仅仅是字符串。还可以存数字例如SET count100增加INCR count结果101JSON对象例如{id:1,name:Tom}转换成字符串存储。String 应用场景1. 缓存例如数据库MySQL 用户信息缓存Redis user:1001查询请求 ↓ Redis ↓ 没有 ↓ MySQL2. 计数器例如文章点赞INCR article:like:10013. 分布式锁例如SET lock:user:1trueNX EX10二、Hash存储对象1. 什么是 HashHash 类似Java 中MapString,Object例如用户user:1001 name Tom age 20 address BeijingRedisHSET user:1001 name Tom HSET user:1001 age20查询HGET user:1001 name返回TomHash 应用场景存储对象信息例如用户{name:Tom,age:20}可以Redis Hash user:1001 name Tom age 20优点修改一个字段不用重新存整个对象。三、List列表结构1. 什么是 ListList类似 JavaLinkedList特点有序可重复例如A B CRedis左边插入LPUSH list A右边弹出RPOP listList 应用场景1. 消息队列例如生产者订单服务 ↓ Redis List ↓ 消费者流程生产消息 LPUSH 消费消息 RPOP2. 最新消息列表例如微博最新动态。四、Set无序集合1. 什么是 SetSet类似 JavaHashSet特点无序不重复例如用户标签 Java Redis Spring添加SADD user:tag JavaSet 应用场景1. 去重例如统计访问用户user1 user2 user1Set自动去重。2. 共同好友例如用户A张三 李四 王五用户B李四 王五 赵六求共同好友SINTER userA userB结果李四 王五五、ZSet有序集合重点1. 什么是 ZSetZSetSorted Set。特点有序 不重复。它比 Set 多一个score分数例如排行榜用户 分数 Tom 100 Jack 90 Lucy 80RedisZADD rank100Tom查询排名ZRANGE rank010ZSet 应用场景1. 排行榜例如游戏排名玩家积分排行榜2. 热门文章文章score代表阅读量。六、Redis 数据结构底层实现面试高级问题Redis 五种数据结构底层是什么String底层SDS(Simple Dynamic String)优势获取长度快二进制安全扩容方便Hash底层根据数据量可能使用ziplistlistpackhash tableList底层以前ziplist后来quicklistSet底层hash tableintsetZSet底层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% 的日常使用场景。