zvvq技术分享网

分享Redis常见面试题(redis面试题汇总)

作者:zvvq博客网
导读介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。 专题推荐:2020年

zvvq.cn

介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。

内容来自zvvq

专题推荐:2020年redis面试题大全(最新)

传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。 本文来自zvvq

Github 源码:https://github.com/antirez/redis zvvq

Redis 官网:https://redis.io/ 内容来自samhan

推荐:《redis教程

zvvq好,好zvvq

zvvq好,好zvvq

Redis支持的数据类型? 内容来自zvvq

String字符串:

zvvq

格式: set key value

内容来自samhan666

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

内容来自samhan

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

内容来自zvvq

Hash(哈希)

内容来自zvvq

格式: hmset name  key1 value1 key2 value2 内容来自zvvq

Redis hash 是一个键值(key=>value)对集合。

内容来自samhan

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

本文来自zvvq

List(列表)

本文来自zvvq

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

格式: lpush  name  value

zvvq

在 key 对应 list 的头部添加字符串元素

zvvq好,好zvvq

格式: rpush  name  value

本文来自zvvq

在 key 对应 list 的尾部添加字符串元素

本文来自zvvq

格式: lrem name  index 本文来自zvvq

key 对应 list 中删除 count 个和 value 相同的元素 copyright zvvq

格式: llen name   zvvq好,好zvvq

返回 key 对应 list 的长度

zvvq好,好zvvq

Set(集合)

zvvq

格式: sadd  name  value

zvvq

Redis的Set是string类型的无序集合。

内容来自zvvq

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 本文来自zvvq

zset(sorted set:有序集合)

zvvq好,好zvvq

格式: zadd  name score value

内容来自samhan

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

内容来自zvvq,别采集哟

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

内容来自samhan

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

zvvq

什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么? 本文来自zvvq

持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。 copyright zvvq

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

内容来自samhan666

RDB: 内容来自zvvq,别采集哟

rdb是Redis DataBase缩写 内容来自samhan

功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数 copyright zvvq

本文来自zvvq

AOF:

内容来自samhan

Aof是Append-only file缩写

内容来自zvvq

本文来自zvvq

每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作 内容来自samhan

aof写入保存: 内容来自samhan

WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件

zvvq.cn

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

zvvq好,好zvvq

存储结构:

本文来自zvvq

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

内容来自zvvq

比较zvvq.cn

1、aof文件比rdb更新频率高,优先使用aof还原数据。

内容来自zvvq

2、aof比rdb更安全也更大

zvvq

3、rdb性能比aof好 zvvq好,好zvvq

4、如果两个都配了优先加载AOF

本文来自zvvq

刚刚上面你有提到redis通讯协议(RESP ),能解释下什么是RESP?有什么特点?(可以看到很多面试其实都是连环炮,面试官其实在等着你回答到这个点,如果你答上了对你的评价就又加了一分) copyright zvvq

RESP 是redis客户端和服务端之前使用的一种通讯协议;

zvvq

RESP 的特点:实现简单、快速解析、可读性好

内容来自zvvq,别采集哟

For Simple Strings the first byte of the reply is "+" 回复 本文来自zvvq

For Errors the first byte of the reply is "-" 错误

内容来自zvvq,别采集哟

For Integers the first byte of the reply is ":" 整数 内容来自samhan

For Bulk Strings the first byte of the reply is "$" 字符串 内容来自zvvq,别采集哟

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

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

内容来自zvvq,别采集哟

 单机版 zvvq

内容来自samhan666

特点:简单 内容来自samhan

问题: 内容来自samhan

1、内存容量有限 2、处理能力有限 3、无法高可用。

内容来自zvvq

主从复制 内容来自samhan666

zvvq.cn

Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步 给从服务器,从而一直保证主从服务器的数据相同。

内容来自zvvq,别采集哟

特点: 本文来自zvvq

1、master/slave 角色

本文来自zvvq

2、master/slave 数据相同 copyright zvvq

3、降低 master 读压力在转交从库 本文来自zvvq

问题: copyright zvvq

无法保证高可用 内容来自zvvq,别采集哟

没有解决 master 写的压力 内容来自samhan

哨兵

内容来自zvvq,别采集哟

内容来自zvvq,别采集哟

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

zvvq.cn

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

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

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

特点:

内容来自zvvq

1、保证高可用

内容来自samhan666

2、监控各个节点 copyright zvvq

3、自动故障迁移

内容来自zvvq,别采集哟

缺点:主从模式,切换需要时间丢数据

本文来自zvvq

没有解决 master 写的压力

内容来自zvvq,别采集哟

集群(proxy 型): 内容来自zvvq

内容来自zvvq

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

内容来自samhan666

特点:1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins 

zvvq好,好zvvq

2、支持失败节点自动删除

zvvq

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

内容来自samhan

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

copyright zvvq

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

集群(直连型): 内容来自zvvq,别采集哟

本文来自zvvq

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

内容来自samhan666

特点:

内容来自samhan

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

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

zvvq

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

内容来自samhan

4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本

zvvq.cn

5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。 内容来自zvvq

缺点: 内容来自zvvq,别采集哟

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

zvvq.cn

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

copyright zvvq

什么是一致性哈希算法?什么是哈希槽?

内容来自samhan

Redis常用命令? 内容来自zvvq

Keys pattern 内容来自samhan

*表示区配所有

内容来自samhan666

以bit开头的 内容来自samhan666

查看Exists  key是否存在

zvvq好,好zvvq

Set

zvvq好,好zvvq

设置 key 对应的值为 string 类型的 value。 内容来自samhan

setnx

zvvq.cn

设置 key 对应的值为 string 类型的 value。如果 key 已经存在,返回 0,nx 是 not exist 的意思。

zvvq好,好zvvq

删除某个key 内容来自samhan666

第一次返回1 删除了 第二次返回0 zvvq好,好zvvq

Expire 设置过期时间(单位秒) 内容来自samhan

TTL查看剩下多少时间

内容来自samhan666

返回负数则key失效,key不存在了 本文来自zvvq

Setex

内容来自samhan666

设置 key 对应的值为 string 类型的 value,并指定此键值对应的有效期。

本文来自zvvq

Mset

zvvq好,好zvvq

一次设置多个 key 的值,成功返回 ok 表示所有的值都设置了,失败返回 0 表示没有任何值被设置。

zvvq好,好zvvq

Getset 本文来自zvvq

设置 key 的值,并返回 key 的旧值。

zvvq好,好zvvq

Mget

内容来自samhan666

一次获取多个 key 的值,如果对应 key 不存在,则对应返回 nil。

zvvq.cn

Incr

内容来自samhan

对 key 的值做加加操作,并返回新的值。注意 incr 一个不是 int 的 value 会返回错误,incr 一个不存在的 key,则设置 key 为 1

zvvq.cn

incrby

copyright zvvq

同 incr 类似,加指定值 ,key 不存在时候会设置 key,并认为原来的 value 是 0

copyright zvvq

Decr zvvq

对 key 的值做的是减减操作,decr 一个不存在 key,则设置 key 为-1

内容来自zvvq,别采集哟

Decrby zvvq

同 decr,减指定值。

内容来自zvvq,别采集哟

Append

zvvq好,好zvvq

给指定 key 的字符串值追加 value,返回新字符串值的长度。

zvvq

Strlen

内容来自zvvq

取指定 key 的 value 值的长度。 内容来自zvvq

persist xxx(取消过期时间)

内容来自zvvq

选择数据库(0-15库) zvvq

Select 0 //选择数据库 copyright zvvq

move age 1//把age 移动到1库

内容来自zvvq,别采集哟

Randomkey随机返回一个key

zvvq好,好zvvq

Rename重命名 内容来自samhan666

Type 返回数据类型 zvvq.cn

08

本文来自zvvq

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

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

内容来自zvvq,别采集哟

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

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

内容来自samhan

09

内容来自zvvq,别采集哟

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

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

zvvq

缺点:

zvvq.cn

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

zvvq

能不能生产一次消费多次呢? 内容来自samhan666

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

内容来自zvvq

10

内容来自zvvq

什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免? zvvq.cn

缓存穿透 copyright zvvq

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

zvvq好,好zvvq

如何避免? copyright zvvq

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

zvvq

2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。 内容来自zvvq,别采集哟

缓存雪崩 copyright zvvq

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

zvvq

如何避免? 内容来自samhan

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

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

内容来自samhan666

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

内容来自zvvq

以上就是分享Redis常见面试题的详细内容,更多请关注其它相关文章!

本文来自zvvq