乐趣区

关于redis:2022年Redis最新面试题第1篇-Redis基础知识

大家好,我是散步 coding, 最近在整顿 2022 年 Redis 最新面试题, 大家也能够通过我上面的博客地址在线浏览, 明天讲讲第 1 篇 – Redis 基础知识。本文首发于公众号: 散步 coding

2022 年 Redis 最新面试题目录

  • Redis 基础知识
  • Redis 数据结构
  • Redis 事务
  • Redis 数据长久化
  • Redis 集群
  • Redis 淘汰策略
  • Redis 分布式锁
  • Redis 缓存问题
  • 运维和部署

Redis 基础知识

  • 什么是 Redis, 有哪些优缺点?
  • Redis 最适宜的场景, 能够简略的说说吗?
  • Redis 相比 Memcached 有哪些劣势?
  • 一个字符串类型的值能存储最大容量是多少?
  • Redis 读写拆散

什么是 Redis, 有哪些优缺点?

呈现概率: ★★★★

Redis 是一个非关系性数据库, 开源的、应用 C 语言编写、反对网络、可基于内存亦可长久化的日志型、key-value(键值对)数据库,是目前分布式架构中不可或缺的一环。

Redis 服务器程序是 <font color=#FF000 > 单过程模型 </font>,也就是在一台服务器上能够同时启动多个 Redis 过程,而 Redis 的理论处理速度则齐全依附于主过程的的执行效率。若在服务器上只运行一个 Redis 过程,当多个客户端同时拜访时,服务器的解决能力会有肯定水平的降落,若在同一台服务器上开启多个 Redis 过程,Redis 在进步并发解决能力的同时会给服务器的 CPU 造成很大压力。也就是说,在理论生产环境中,须要依据理论的需要来决定开启多少个 Redis 过程。若对高并发要求更高一些,可能会思考在同一台服务器上开启多个过程。若 CPU 资源比拟缓和,采纳单过程即可。

<font color=#FF000 >Redis 长处 </font>:

1)、性能极高, 读写性能优异,从内存当中进行 IO 读写速度快。

2)、反对数据的长久化 (反对 <font color=#FF000 >AOF</font> 和 <font color=#FF000 >RDB</font> 两种长久化形式),对数据的更新采纳 <font color=#FF000 >Copy-on-write</font> 技术(写拷贝),能够异步的保留在磁盘上

因为 Redis 的数据都寄存在内存中,如果没有配置长久化,redis 重启后数据就全失落了,于是须要开启 redis 的长久化性能,将数据保留到磁 盘上,当 redis 重启后,能够从磁盘中复原数据。

redis 提供两种形式进行长久化,一种是 RDB 长久化: 指在指定的工夫距离内将内存中的数据集快照写入磁盘,实际操作过程是 fork 一个子过程,先将数据集写入临时文件,写入胜利后,再替换之前的文件,用二进制压缩存储。

还有一种是 AOF 长久化:以日志的模式记录服务器所解决的每一个写、删除操作,查问操作不会记录,以文本的形式记录,能够关上文件看到具体的操作记录。

3)、反对主从复制,主机会主动将数据同步到从机,能够进行读写拆散。

4)、数据结构丰盛:除了反对 string 类型的 value 外还反对 string、hash、set、sortedset、list 等数据结构。

5)、原子性:多个操作通过 MULTI 和 EXEC 指令反对事务

<font color=#FF000 >Redis 毛病 </font>:

1)、主从同步,如果主机宕机,宕机前有一部分数据没有同步到从机,会导致数据不统一。

2)、主从同步,数据同步会有提早。

3)、读写拆散,主机写的负载量太大,也会导致主机的宕机

4)、数据库容量受到物理内存的限度,不能用作海量数据的高性能读写

Redis 最适宜的场景, 能够简略的说说吗?

呈现概率: ★★★★

1、会话缓存(Session Cache)最罕用的一种应用 Redis 的情景是会话缓存(session cache), Redis 缓存会话比其余存储(如 Memcached)的劣势在于:Redis 提供长久化。

2、排行榜 / 计数器

Redis 在内存中对数字进行递增或递加的操作实现的十分好。汇合(Set)和有序汇合(Sorted Set)也使得咱们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。

3、公布 / 订阅

Redis 的公布 / 订阅性能。公布 / 订阅的应用场景的确十分多。我已看见人们在社交网络连接中应用,还可作为基于公布 / 订阅的脚本触发器,甚至用 Redis 的公布 / 订阅性能来建设聊天零碎!

4、缓存热数据

能够缓存一些高频读, 低频写的内容,比方 app 首页一些设置等。

5、利用 BitMap 统计用户签到、统计沉闷用户、用户在线状态等

Redis 从 2.2.0 版本开始新增了 setbit,getbit,bitcount 等几个 bitmap 相干命令。尽管是新命令,然而并没有新增新的数据类型,因为 setbit 等命令只不过是在 set 上的扩大。

能够利用 BitMap 统计用户签到、统计沉闷用户、用户在线状态

6、限速,接口拜访频率限度:比方发送短信验证码的接口,通常为了避免他人歹意频刷,会限度用户每分钟获取验证码的频率,例如一分钟不能超过 5 次。

假如用于数据量上亿的场景下,例如几亿用户零碎的签到,去重登录次数统计,某用户是否在线状态等等。腾讯 10 亿用户,要几个毫秒内查问到某个用户是否在线,能怎么做?

千万别说给每个用户建设一个 key,而后挨个记(你能够算一下须要的内存会很恐怖,而且这种相似的需要很多。这里要用到位操作——应用 setbit、getbit、bitcount 命令。原理是:

redis 内构建一个足够长的数组,每个数组元素只能是 0 和 1 两个值,而后这个数组的下标 index 用来示意用户 id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0 和 1)来构建一个记忆系统。

Redis key name 约定

$dayKey = 'login:'.\date('Ymd',\time());

Redis 数据结构

key sign:20220405 sign:20220405 sign:20220405 …
offset (UserId) 1000 1001 1002
value 0 1 1
status 未签到 已签到 已签到

应用教训

127.0.0.1:6379> setbit 'login-20220405' 2 1
127.0.0.1:6379> setbit 'login-20220405' 100 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 200000000 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 4290000000 1
(integer) 1
127.0.0.1:6379> setbit 'login-20220405' 4300000000 1
(error) ERR bit offset is not an integer or out of range
127.0.0.1:6379> getbit 'login-20220405' 100
(integer) 1
127.0.0.1:6379> getbit 'login-20220405' 101
(integer) 0
127.0.0.1:6379>

这里须要留神的是 Redis 中字符串限度最大为 512MB,所以位图中最大能够设置 2^32 个不同的位(42.9 亿个)。图位的最小单位是比特 (bit),每个 bit 的值只能是 0 或 1。同时留神 setbit 时的偏移量,当偏移量很大时,可能会有较大耗时。位图不是相对的好,有时可能更节约空间。

Redis 相比 Memcached 有哪些劣势?

呈现概率: ★★★

如果简略地比拟 Redis 与 Memcached 的区别,大多数都会失去以下观点:

1、数据反对类型 Memcache 对数据类型反对绝对简略。Redis 有简单的数据类型。Redis 不仅仅反对简略的 k / v 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

2、Redis 反对数据的备份,即 master-slave 模式的数据备份。

3、存储形式 Memecache 把数据全副存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis 反对数据的长久化,能够将内存中的数据放弃在磁盘中,重启的时候能够再次加载进行应用。

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

Redis 中 <font color=#FF000 > 字符串限度最大为 512MB</font>

Redis 读写拆散

呈现概率: ★★★

读取申请 QPS(Queries Per Second)压力较大的服务, 能够采纳 Redis 读写拆散,能够提供高可用、高性能、灵便的读写拆散服务,满足热点数据集中及高并发读取的业务需要,最大化地节约运维老本。

读写拆散版采取 <font color=#FF000 > 链式复制架构 </font>,能够通过扩大只读实例个数使整体实例性能呈线性增长,同时基于源码层面对 Redis 复制流程的定制优化,能够最大水平地晋升线性复制的零碎稳定性,充分利用每一个只读节点的物理资源。

因为数据同步至只读节点存在肯定提早,且采纳链式复制,只读节点数越多,凑近链路末端的只读节点数据提早越大,因而选用此架构时,业务须要能承受肯定水平的脏数据。如果对数据一致性要求较高,举荐选用集群架构。

你晓得怎么用 Redis 实现实现分布式锁?

呈现概率: ★★★★

Redis 官网站提出了一种权威的基于 Redis 实现分布式锁的形式名叫 <font color=#FF000 >Redlock</font>,此种形式比原先的单节点的办法更平安。它能够保障以下个性:

平安个性:互斥拜访,即 <font color=#FF000 > 永远只有一个 client 能拿到锁 </font>

防止死锁:最终 client 都可能拿到锁,不会呈现死锁的状况,即便本来锁住某资源的 client crash 了或者呈现了网络分区

容错性:只有大部分 Redis 节点存活就能够失常提供服务

也欢送关注我的公众号: 散步 coding。一起交换, 在 coding 的世界里散步, 回复: redis, 收费获取最新 Redis 面试题 (含答案)。

退出移动版