常见Redis面试题有哪些

技术常见Redis面试题有哪些本篇内容主要讲解“常见Redis面试题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“常见Redis面试题有哪些”吧!1、Redis支持的数

本文主要讲解“Redis面试常见问题有哪些?”感兴趣的朋友不妨看看。本文介绍的方法简单、快速、实用。让边肖带你学习“Redis面试常见问题有哪些”!

1、Redis支持的数据类型?

String(字符串)

格式:设置键值

字符串类型是二进制安全的。字符串意味着redis可以包含任何数据。例如jpg图片或序列化对象。

字符串类型是Redis最基本的数据类型,一个键最多可以存储512MB。

Hash(哈希)

格式:hm设置名称key1值1 key2值2

Redihash是一组键=值对。

Redis hash是字符串类型的字段和值的映射表,hash特别适合存储对象。

List(列表)

Redis列表是一个简单的字符串列表,按照插入顺序排序。您可以将元素添加到列表的头部(左)或尾部(右)。

格式: lpush名称值

将字符串元素添加到对应于关键字的列表头。

格式化: rpush名称值

在对应于键的列表末尾添加一个字符串元素。

格式化: lrem名称索引

从相应的键列表中删除具有相同值的计数元素。

格式: llen名称

返回与键对应的列表长度

Set(集合)

格式: sadd名称值

Redis的集合是一个无序的字符串类型集合。

集合是通过哈希表实现的,因此添加、删除和搜索的复杂度为O(1)。

zset(sorted set:有序集合)

格式: zadd名称分值

Redis zset和set一样,是string类型元素的集合,不允许有重复的成员。

不同的是,每个元素都与一个double类型的分数相关联。Redis通过分数将集合中的成员从小到大排序。

zset的成员是唯一的,但是分数可以重复。

2、什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

持久性是将内存数据写入磁盘,以防止服务关闭时内存数据丢失。

Redis提供了两种持久性方式:RDB(默认)和AOF。

RDB:

Rdb是Redis DataBase缩写。

核心功能是rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)

AOF:

Aof是仅附加文件缩写。

每当执行服务器(定时)任务或函数时,都会调用flushAppendOnlyFile函数。该功能执行以下两项任务

aof写入保存:

写:根据条件,将aof_buf中的缓存写入aof文件。

保存:根据条件,调用fsync或fdatasync函数将AOF文件保存到磁盘。

存储结构:

是内容redis通信协议(RESP)格式的命令文本存储。

比较:

Aof文件比rdb更新更频繁,aof更适合恢复数据。

Aof比rdb更安全更大。

Rdb比aof有更好的性能。

如果两者都配备了优先AOF

刚才你提到了redis通信协议(RESP)。你能解释一下RESP是什么吗?有什么特点?(可以看到很多面试其实都是连环炮,面试官其实是在等你回答这一点。如果你回答你的评价,你会得到另一分。)

RESP协议是redis客户端和服务器之前使用的一种通信协议。

RESP特点:实现简单,分析快速,可读性好。

对于简单字符串,回复的第一个字节是“回复”

对于错误,回复的第一个字节是“error”。

For Integers the first byte of the reply is ":" 整数

For Bulk Strings the first byte of the reply is "$" 字符串

For Arrays the first byte of the reply is "*" 数组

持久化在面试中问到的频率较高,重点学一下,篇幅有限,具体点下面的文章:

10分钟彻底理解Redis的持久化机制:RDB和AOF

3、Redis 有哪些架构模式?讲讲各自的特点

单机版

特点:

简单

问题:

  •  内存容量有限

  •  处理能力有限

  •  无法高可用。

主从复制

Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。

只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。

特点:

  •  master/slave 角色

  •  master/slave 数据相同

  •  降低 master 读压力在转交从库

问题:

  •  无法保证高可用

  •  没有解决 master 写的压力

哨兵

Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:

  • 监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

  •  提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

  •  自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

特点:

  •  保证高可用

  •  监控各个节点

  •  自动故障迁移

缺点:

  •  主从模式,切换需要时间丢数据

  •  没有解决 master 写的压力

集群(proxy 型)

Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器;Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。

特点:

  •  多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins

  •  支持失败节点自动删除

  •  后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致

缺点:

  •  增加了新的 proxy,需要维护其高可用。

  •  failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预

集群(直连型):

从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

特点:

  •  无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。

  •  数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。

  •  可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。

  •  高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本  -实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。

缺点:

  •  资源隔离性较差,容易出现相互影响的情况。

  •  数据通过异步复制,不保证数据的强一致性

高可用Redis架构分析搭建,可以参考:

高可用Redis服务架构分析与搭建

4、使用过Redis分布式锁么,它是怎么实现的?

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

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

set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

5、使用过Redis做异步队列么,你是怎么用的?有什么缺点?

一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

缺点:

  •  在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。

能不能生产一次消费多次呢?

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

6、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?

缓存穿透

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。

如何避免?

  • 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

  •  对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。

如何避免?

  •  在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

  •  做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期

  •  不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

这道相当常见,详细再参考下文,一定熟练掌握:

Redis缓存雪崩、缓存击穿、缓存穿透和常见的几种缓存模式

7、Redis常用命令

管理命令

# dbsize 返回当前数据库 key 的数量。  # info 返回当前 redis 服务器状态和一些统计信息。  # monitor 实时监听并返回redis服务器接收到的所有请求信息。  # shutdown 把数据同步保存到磁盘上,并关闭redis服务。  # config get parameter 获取一个 redis 配置参数信息。(个别参数可能无法获取)  # config set parameter value 设置一个 redis 配置参数信息。(个别参数可能无法获取)  # config resetstat 重置 info 命令的统计信息。(重置包括:keyspace 命中数、  # keyspace 错误数、 处理命令数,接收连接数、过期 key 数)  # debug object key 获取一个 key 的调试信息。  # debug segfault 制造一次服务器当机。  # flushdb 删除当前数据库中所有 key,此方法不会失败。小心慎用  # flushall 删除全部数据库中所有 key,此方法不会失败。小心慎用

工具命令

#redis-server:Redis 服务器的 daemon 启动程序  #redis-cli:Redis 命令行操作工具。当然,你也可以用 telnet 根据其纯文本协议来操作  #redis-benchmark:Redis 性能测试工具,测试 Redis 在你的系统及你的配置下的读写性能  $redis-benchmark -n 100000 –c 50  #模拟同时由 50 个客户端发送 100000 个 SETs/GETs 查询 #redis-check-aof:更新日志检查  #redis-check-dump:本地数据库检查

8.Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

9、为什么Redis 单线程却能支撑高并发?

为什么Redis 单线程却能支撑高并发?

10、Redis常见性能问题和解决方案:

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

4).Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

Redis性能分析相关问题,限于篇幅,给出文章链接:

Redis 性能问题分析(好文推荐)

11、Redis的并发竞争问题如何解决?

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Jedis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是由于客户端连接混乱造成。对此有2种解决方法:

  •  客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

  •  服务器角度,利用setnx实现锁。

注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。

12、说说Redis的内存淘汰策略

直接点这里:Redis的内存淘汰策略

13、Redis最适合的场景

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

  •  Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

  •  Redis支持数据的备份,即master-slave模式的数据备份。

  •  Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”。

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:ZRANGE user_scores 0 10 WITHSCORES

到此,相信大家对“常见Redis面试题有哪些”有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/85699.html

(0)

相关推荐

  • DAY17 个人中心头像设置

    技术DAY17 个人中心头像设置 DAY17 个人中心头像设置先来说存储文件的两种情形,同文件不同名的存储以及同名不同文件的存储
    解决的方法就是指纹,用指纹来识别文件,并通过指纹进行文件的获取
    写入

    礼包 2021年10月28日
  • Alibaba Sentinel LeapArray源码分析

    技术Alibaba Sentinel LeapArray源码分析这篇文章主要介绍“Alibaba Sentinel LeapArray源码分析”,在日常操作中,相信很多人在Alibaba Sentinel LeapArr

    攻略 2021年11月17日
  • 基于Maxwell的MySQL数据传输服务整体设计方法教程

    技术基于Maxwell的MySQL数据传输服务整体设计方法教程这篇文章主要介绍“基于Maxwell的MySQL数据传输服务整体设计方法教程”,在日常操作中,相信很多人在基于Maxwell的MySQL数据传输服务整体设计方

    攻略 2021年10月22日
  • 抖音刷双击在线秒刷,怎么在平台刷抖音赞呢

    技术抖音刷双击在线秒刷,怎么在平台刷抖音赞呢增加抖音点赞量,我们最快速的方法就是去抖音刷赞双击网站,在该网站上可以刷抖音作品点赞量双击量,从而快速的增加抖音作品点赞。那有些抖音用户就纳闷了,花钱买抖音赞,抖音点赞多有什么

    测评 2021年10月21日
  • berkeleydb应用(berkeleydb环境是什么)

    技术MySQL不再支持Berkeley DB 转而添加插件的示例分析这篇文章将为大家详细讲解有关MySQL不再支持Berkeley DB 转而添加插件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这

    攻略 2021年12月17日
  • mydumper怎么用

    技术mydumper怎么用小编给大家分享一下mydumper怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!下载:https://laun

    攻略 2021年11月2日