Redis
本文最后更新于67 天前,其中的信息可能已经过时,如有错误请发送邮件到3082654005@qq.com

Redis 基础概念

  1. 什么是Redis?它主要有什么特点?
    • 参考答案: Redis是一个开源的、基于内存的键值对(Key-Value)存储系统,它可以用作数据库、缓存和消息中间件。其主要特点包括:高性能、支持丰富的数据结构、提供持久化功能、支持主从复制和高可用。
  2. 为什么Redis这么快?(或者说Redis是基于内存的,这带来了什么优势?)
    • 参考答案: 主要原因有:1. 数据完全存储在内存中,读写操作不需要磁盘I/O,速度极快。2. 采用单线程模型(6.0版本前),避免了多线程的上下文切换和竞争条件开销。3. 使用了高效的数据结构和I/O多路复用模型。
  3. Redis相比Memcached有哪些优势?
    • 参考答案: Redis支持更丰富的数据结构(如List, Hash, Set, Sorted Set等),而Memcached只支持简单的字符串。Redis支持数据持久化,可以将内存数据保存到磁盘,重启后可以再次加载,而Memcached不支持。Redis还支持更复杂的功能,如发布订阅、Lua脚本、事务等。
  4. Redis常用的数据类型有哪些?
    • 参考答案: 最常用的五种:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Sorted Set(有序集合)。此外还有Bitmaps、HyperLogLogs、Streams等。

Redis 数据结构与使用

  1. String类型一般用于什么场景?
    • 参考答案: 用于缓存简单的键值对、计数器(如文章的点赞数、阅读数,使用INCR命令)、存储Session信息等。
  2. Hash类型适合存储什么类型的数据?
    • 参考答案: 适合存储对象,例如用户信息(用户ID为key,用户的姓名、年龄、邮箱等字段作为field和value)。相比于将整个对象序列化成String存储,Hash可以更高效地存取单个字段。
  3. List类型的特点是什么?可以用来做什么?
    • 参考答案: List是一个双向链表。可以用来实现消息队列(生产者用LPUSH,消费者用RPOP)、最新消息排行(如朋友圈时间线,LTRIM可以限制列表长度)。
  4. Set和Sorted Set有什么区别?
    • 参考答案: Set是无序的字符串集合,保证元素的唯一性。Sorted Set(ZSet)是有序的集合,每个元素都会关联一个double类型的分数(score),Redis通过分数来为集合中的成员进行从小到大的排序。Set常用于好友共同关注(求交集),ZSet常用于排行榜。
  5. 如何使用Redis实现一个简单的分布式锁?
    • 参考答案: 最简单的方式是使用SET key value NX PX milliseconds命令。NX表示只有当key不存在时才设置,PX设置一个过期时间。这条命令可以原子性地完成“判断是否存在”和“设置值及过期时间”两个操作,防止死锁。
  6. 什么是缓存穿透?如何避免?
    • 参考答案: 缓存穿透是指查询一个根本不存在的数据,缓存和数据库都不会命中,导致每次请求都直接打到数据库上。解决方案:1. 对不存在的key也缓存一个空值或特殊标记,并设置较短的过期时间。2. 使用布隆过滤器(Bloom Filter)快速判断数据是否存在。
  7. 什么是缓存击穿?如何避免?
    • 参考答案: 缓存击穿是指一个热点key在缓存过期的瞬间,大量请求同时涌入,直接击穿缓存,全部请求数据库。解决方案:1. 设置热点数据永不过期。2. 使用互斥锁(如Redis分布式锁),只让一个请求去数据库加载数据,其他请求等待。
  8. 什么是缓存雪崩?如何避免?
    • 参考答案: 缓存雪崩是指在同一时间,大量缓存key同时失效,导致所有请求都转向数据库,造成数据库瞬时压力过大。解决方案:1. 给不同的key设置随机的过期时间,避免同时失效。2. 构建Redis高可用集群(哨兵或集群模式),防止Redis本身宕机。3. 使用熔断降级机制。
  9. 如何用Redis实现一个延时队列?
    • 参考答案: 可以使用Sorted Set实现。将消息内容作为member,消息的 ready 时间(当前时间戳 + 延时时间)作为score。消费者轮询地用ZRANGEBYSCORE key 0 current_timestamp LIMIT 0 1获取已到期的消息,然后进行处理。

Redis 持久化与事务

  1. Redis有哪两种持久化方式?
    • 参考答案: RDB(Redis DataBase)和AOF(Append Only File)。
  2. 说说RDB持久化的原理和优缺点。
    • 参考答案: 原理: 在指定的时间间隔内,fork一个子进程,将内存中的数据生成一个快照(snapshot)并压缩保存到磁盘上的.rdb文件。优点: 1. 文件紧凑,适合做灾难恢复和备份。2. 恢复大数据集时速度比AOF快。缺点: 1. 可能会丢失最后一次快照之后的数据。2. 如果数据集很大,fork子进程的过程可能会阻塞主线程。
  3. 说说AOF持久化的原理和优缺点。
    • 参考答案: 原理: 以日志的形式记录每个写操作命令,追加到文件末尾。Redis重启时会重新执行AOF文件中的命令来重建数据。优点: 数据安全性高,根据不同的同步策略(如每秒同步),最多丢失一秒的数据。缺点: AOF文件通常比RDB文件大,恢复速度慢。
  4. 在项目中你会如何选择持久化方案?
    • 参考答案: 如果对数据安全性要求不高,可以单独使用RDB。如果既希望保证数据安全又希望快速重启恢复,可以同时开启RDB和AOF。AOF用于保证数据不丢失,RDB用于快速重启和备份。官方也建议同时使用两种方式。
  5. Redis的事务是什么?它能保证ACID中的哪些特性?
    • 参考答案: Redis事务是通过MULTIEXECDISCARD等命令实现的一组命令的批量执行。它不能保证完全的原子性(Atomicity)——如果命令语法错误,整个事务都不会执行;但如果运行时错误(如对字符串进行HINCRBY),只有出错的命令不执行,其他命令照常执行。它保证了隔离性(Isolation),但没有回滚(Rollback)机制。

Redis 架构与部署

  1. Redis为什么早期版本选择单线程?
    • 参考答案: 因为Redis的操作都是基于内存的,CPU通常不是瓶颈,瓶颈往往是内存或网络带宽。采用单线程模型避免了不必要的上下文切换和竞争条件,简化了实现,保证了每个操作的原子性。
  2. Redis如何实现高可用?
    • 参考答案: 主要通过主从复制(Replication) 和哨兵模式(Sentinel) 实现。主从复制实现数据备份和读写分离。哨兵模式监控主从节点,并在主节点故障时自动进行故障转移,选举新的主节点,实现高可用。
  3. 说说主从复制的流程。
    • 参考答案: 1. 从服务器连接主服务器,发送SYNC命令。2. 主服务器执行BGSAVE生成RDB文件,同时用一个缓冲区记录从现在开始执行的所有写命令。3. 主服务器将RDB文件发送给从服务器,从服务器加载RDB文件。4. 主服务器再将缓冲区的写命令发送给从服务器,从服务器执行这些命令,实现数据同步。
  4. Redis Cluster集群模式是如何分片的?
    • 参考答案: Redis Cluster采用哈希槽(Hash Slot)分片,共有16384个槽。每个键通过CRC16校验后对16384取模来决定放置在哪个槽。集群中的每个节点负责一部分哈希槽,通过这种分片方式将数据分布到多个节点上。

Redis 应用与场景

  1. Redis除了做缓存,还能做什么?
    • 参考答案: 还能做:1. 排行榜(Sorted Set)。2. 消息队列(List的LPUSH/RPOP)。3. 分布式锁(SETNX)。4. 好友关系(Set求交集、并集)。5. Session共享(在分布式服务中存储用户登录状态)。
  2. 如何保证数据库和Redis缓存之间的数据一致性?
    • 参考答案: 这是一个复杂的问题。常见的策略有:1. 先更新数据库,再删除缓存(Cache-Aside pattern)。2. 为缓存设置合理的过期时间,最终达到一致性。对于一致性要求极高的场景,可以通过 Canal 等工具监听数据库的binlog来异步更新或失效缓存。
  3. 使用过Redis的哪些客户端?
    • 参考答案: 对于Java应届生,最常见的答案是JedisLettuce。可以补充说:Jedis是早期广泛使用的同步阻塞客户端,而Lettuce基于Netty实现了异步非阻塞,性能更好,是Spring Boot 2.x后的默认客户端。
  4. 如何查看Redis的内存使用情况?
    • 参考答案: 使用info memory命令,它会返回详细的内存相关信息,如used_memory_human会以人类可读的格式显示Redis分配的内存总量。
  5. 如何批量删除某些key?
    • 参考答案: 可以使用redis-cli工具结合KEYS命令(生产环境慎用KEYS *,会阻塞)和xargs命令。例如:redis-cli KEYS "user:*" | xargs redis-cli DEL。更安全的方式是使用SCAN命令迭代删除。
  6. 描述一下使用Redis实现一个简单排行榜的流程。
    • 参考答案: 1. 使用Sorted Set(ZSet),将用户的ID作为member,将排行榜的分数(如积分、成绩)作为score。2. 用户得分更新时,使用ZADD key score member命令。3. 查询top N的用户,使用ZREVRANGE key start stop WITHSCORES命令。
  7. Pipeline(管道)是做什么用的?
    • 参考答案: Pipeline用于将多个命令打包一次性发送给服务器,服务器处理完所有命令后再将结果一次性返回。这减少了多次网络往返(RTT)的时间开销,显著提升了批量操作的性能。
  8. 你如何在Spring Boot项目中使用Redis?
    • 参考答案: 1. 引入spring-boot-starter-data-redis依赖。2. 在配置文件中配置Redis的连接信息(host, port, password等)。3. 注入RedisTemplateStringRedisTemplate对象来操作Redis。还可以通过注解@RedisHash和Repository方式来操作实体类。
文末附加内容
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇