Redis-八股文

1. 什么是 Redis?

Redis 是基于内存Key-Value关系数据库开源,并且遵循 BSD 协议

  1. ​ Redis 支持数据持久化,可以内存中的数据保存磁盘中,重启时候可以再次加载进行使用
  2. Redis 不仅仅支持简单keyvalue 类型数据,同时还提供 listsetzsethash数据结构存储
  3. Redis 支持数据备份,即 masterslave 模式主从模式)的数据备份

2. Redis 的数据类型

Redis 支持五种数据结构string (字符串)、hash(哈希)、list(列表)、set(集合) 及 zset sorted set (有序集合)。

我们实际项目比较常用的是 stringhash。如果你是 Redis 中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub

3. 使用 Redis 有哪些好处?

4. Redis 相比 Memcached 有哪些优势?

  1. Memcached 所有的值都均是简单字符串,Redis 作为其替代者,支持更为丰富的数据类
  2. Redis 的速度比 Memcached 快很多
  3. Redis 可以持久化数据

5. Memcached 于 Redis 有哪些区别

  1. 存储方式 Memcached 把数据全部存储在内存中,断电后会挂掉,数据不能超过内存大小。Redis 有部分存在硬盘上,这样能保存数据的持久性
  2. 数据支持类型 Memcache 对数据类型支持相对简单,Redis 有复杂的数据类型
  3. 使用底层模型不同,它们之间底层实现方式,以及与客户端间通信应用协议不一样。Redis 直接构建了 VM 机制。因为一般的系统调用系统函数的话,会浪费一定的时间移动请求

6. Redis 是单进程线程的?

Redis 是单进程线程的,Redis 利用队列技术并发访问变为串行访问消除传统数据库串行控制的开销。

7. 一个字符串的值能存储最大容量是多少?

512M

8. Redis 的持久化机制什么?各自的优缺点

Redis 提供两种持久化机制 RDB 和 AOF 机制

  1. RDB (Redis DataBase)持久化方式:是指用数据集快照方式半持久化模式记录 Redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复
  2. AOF (Appendonlyfile)持久化方式:是指所有的命令行记录以 Redis 命令请求协议格式完全持久化存储保存aof 文件。

9. Redis 常见性能问题解决方案

  1. Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave 函数,会阻塞线程工作,当快照比较大的时候性能影响是非常大的,会间断暂停服务
  2. 如果数据比较重要,某个 slave 开启 AOF 备份数据,策略设置为每秒同步一次
  3. 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网
  4. 尽量避免在压力很大的主库上增加从库
  5. 为了 Master 的稳定性,主从复制不要用图状结构,用单向链表更稳定,即主从关系为: Master <— Slave1 <— Slave2 <— Slave3这样的结构也方便解决单点故障实现 Slave 对 Master 的替换,如果 Master 挂了,可以马上启用 Slave1 做 Master,其他不变。

10. Redis 过期键的删除策略

  1. 定时删除:在设置键的过期时间的同时,创建一个定时器timer)。让定时器在键的过期时间来临时,立即执行对键的删除操作。
  2. 惰性删除:放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
    • 优点:对 CPU 是友好的,只有在取出键值对的时候才会进行过期检查,这样就不会把 CPU 的资源花费在其它无关紧要的键值对的删除过期上。
    • 缺点:如果一些键值对永远不会被再次利用到,那么将不会被删除,最终造成内存泄露,无用的垃圾数据占用了大量的资源,但是服务器却不能去删除。
  3. 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至少要删除多少过期键,以及要检查多少个数据库,则由算法决定。

11. Redis 的回收策略(淘汰策略)?

注意这里的6种机制,volatile 和 allkeys 规定了是对已设置过期时间的数据集淘汰数据还是全部数据集淘汰数据,后面的 lru 、ttl 以及 random三种不同的淘汰策略,再加上一种 no-enviction 永不回收策略

使用策略规则

  1. 如果数据呈现幂律分布,也就是一部分数据访问评率高,一部分数据访问评率低,则使用 allkeys-lru
  2. 如果数据呈现平等分布,也就是所有的数据访问的频率都相同,则使用 allkeys-random

12. 为什么 Redis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据读到内存中,并通过异步方式将数据写入磁盘,所以 Redis 具有快速和数据持久化的特性,如果不将数据放在内存中,磁盘 I/O 速度会严重影响 Redis 的性能,在内存越来越便宜今天,Redis 会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值

13. Redis 的同步机制了解吗?

Redis 可以使用主从同步从从同步

  1. 一次同步时,主节点一次 bgsave,并同时将后续操作记录到内存 buffer
  2. 待完成后将 rdb 文件全量同步到复制节点复制节点接受完成后将 rdb 镜像加载到内存中。
  3. 加载完毕后,再通知节点期间修改的操作记录同步到复制节点进行重放就完成了同步过程

14. Pipeline什么好处?为什么要用 pipeline

可以将多次 IO 往返的时间缩减为一次, 减少多次 IO 延迟的开销。前提是 pipeline 执行的指令之间没有因果相关性。使用 redisbenchmark 进行压测时候可以发现影响 Redis 的 QPS 峰值的一个重要因素pipeline 批次指令数目

15. 是否使用过 Redis 集群集群原理什么

  1. Redis Sentinal 着眼于高可用,在 master 宕机时会自动将 slave 提升为 master,继续提供服务。
  2. Redis Cluster 着眼于扩展性,在单个 Redis 内存不足时,使用 Cluster 进行分片存储。

16. Redis 集群方案什么情况下会导致整个集群不可用?

有 A、B、C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少 5501 ~ 11000 这个范围的槽而不可用。

  • Redis 集群最大节点的个数是多少?

    16384

17. Redis 支持的 Java 客户端都有哪些?官方推荐使用哪个?

Redisson、Jedis、lettuce 等等,官方推荐使用 Redisson

18. Jedis 于 Redisson 对比有什么优缺点

19. Redis 如何设置密码验证密码

设置密码

config set requirepass 123456

授权密码

auth 123456

20. 说说 Redis 哈希槽的概念

21. Redis 集群的主从复制模型是怎么来的?

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品。

22. Redis 集群会有写操作丢失吗?为什么

Redis 并不能保证数据的强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作。

以下情况可能导致 写操作丢失

  1. 过期 key 被清理
  2. 最大内存不足,导致 Redis 自动清理部分 key 以节省空间
  3. 主库故障后自动重启从库自动同步。

23. Redis 集群之间是如何复制的?

异步复制

24. Redis 集群最大节点个数是多少?

16284 个

25. Redis 集群如何选择数据库?

Redis 集群目前无法做数据库选择默认在 0 数据库

26. 怎么测试 Redis 的连通性

使用 ping 命令

27. 怎么理解 Redis 事务

  1. 事务是一个单独的隔离操作:事务的所有命令都会序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发来的命令所打断。
  2. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行

28. Redis 事务相关的命令有哪几个?

  1. 事务为多个命令提供一次性按顺序执行的机制,与 Redis 事务相关的命令有以下三个:
  2. 正常情况下 Redis 事务分为三个阶段开启事务、命令入列、执行事务

29. Redis key 的过期时间和永久有效分别怎么设置?

  • expire 命令用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计
  • persist 命令用于移除给定 key 的过期时间,使得 key 永不过期
  • ttl 命令以秒为单位返回 key 的剩余过期时间

30. Redis 如何做内存优化

列表


31. Redis 回收进程如何工作的?

32. 都有哪些办法可以降低 Redis 的内存使用情况?

如果你使用的是 32 位的 Redis 实例,可以好好利用 hash、list、sorted set、set 等集合类型数据,因为通常情况下小的 key-value 可以用更紧凑的方式存储。

33. Redis 的内存用完了会发生什么

如果达到设置的上限,Redis 的写命令会返回错误信息(但是读命令还可以正常返回),或者你可以将 Redis 当缓存来使用配置淘汰机制,当 Redis 达到内存上限时会冲刷掉旧的内容


这个跟 Redis 的内存回收策略有关。

Redis 的默认回收策略是 noenviction,当内存用完之后,写数据会报错

34. 一个 Redis 实例最多能存放多少 keys、List、Set、Sorted Set 他们能存放多少元素

理论上 Redis 可以处理多达 2^32 的 keys,并且在实际中进行了测试,每个实力至少存放了 2 亿 5 千万个 keys,任何 list、set 和 sorted set 都可以存放 2 ^ 32 个元素。换句话说,Redis 的存储极限是系统中的可用内存值。

35. MySQL 里面有 2000W 数据 Redis 中只存 20W 的数据,如何保证 Redis 中的数据都是热点数据?

Redis 内存数据集大小上升到一定大小时候,就会施行数据的淘汰策略。

相关知识:Redis 提供 6 种数据淘汰策略:

volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据集淘汰

volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

allkeys-lru:从数据集中挑选最近最少使用的数据淘汰

allkeys-random:从数据集中任意选择数据淘汰

no-enviction:禁止驱逐数据

36. Redis 最合适的场景

  1. 会话缓存(Session Cache)
    • 最常用的一种 Redis 的情景是会话缓存(Session Cache)。用 Redis 缓存会比其他存储(如 Memcached)的优势在于:Redis 提供持久化。(当维护一个不是严格要求一致性缓存时(如果用户的购物车信息全部丢失,大部分人都会不高兴,现在,他们还会这样吗?),幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。)
  2. 全页缓存(FPC)
  3. 队列
  4. 排行榜 / 计数器
  5. 发布 / 订阅消息队列)

37. 假如 Redis 里面有 1 亿个 key,其中有 10W 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?

  • 可以用 keys 指令扫出指定模式的 key 列表
  • 对方追问:如果这个 Redis 正在给线上的业务提供服务,那是用 keys 指令会有什么问题

38. 如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,Redis 可能会出现短暂的卡顿现象。一般需要在时间上加一随机值。使得过期时间分散一些。

39. 使用过 Redis 做异步队列么,你是怎么用的?

一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep 一会再重试。不但客户端的 CPU 能降下来,Redis 的 QPS 也降下来了。

如果对方追问可不可以不用 sleep 呢?

  • blpop/brpop 替代前面的 lpop/rpoplist 还有个指令叫 blpop 阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。

如果对方追问能不能生产一次消费多次呢?

  • 使用 pub/sub 主题订阅者模式,可以实现1:N 的消息队列

如果对方追问 pub/sub 有什么缺点?

  • 消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 RabbitMQ等。Redis5.0 新增了 Stream 数据结构,这个功能给 Redis 带来了持久化消息队列。

如果对方追问 redis 如何实现延时队列?

40. 使用过 Redis 分布式锁吗?

先拿 setnx 来争取锁,抢到之后,再用 expire 给锁加一个过期时间方式锁忘记释放。

如果在 setnx 之后执行 expire 之前线程意外 crash 或者重启维护了,那么会怎么样?

在 set 指令的参数中,可以把 setnx expire 合成一条指令使用

redis 分布式锁的七种实现方式
https://blog.csdn.net/new_baibai/article/details/130763776?spm=1001.2014.3001.5501

原文地址:https://blog.csdn.net/new_baibai/article/details/130763730

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_25878.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注