Redis的常见⾯试题(全)
⽬录
前⾔
本⽂主要总结⼀下
之前学习的笔记知识点
以及⾯试⼋股⽂中常见的题⽬
也可参考⼀下他⼈的⾯试总结题
1. 了解⼀下你认识的Redis
⾼性能的 key-value
Redis ⽀持数据的持久化,可以将内存中的数据保存在磁盘中,重启的候可以再次加载进⾏使⽤
key-value数据多种,不仅是string
Redis 有着更为复杂的数据结构并且提供对他们的原⼦性操作
丰富的特性:可⽤于缓存,消息,按 key 设置过期时间,过期后将会⾃ 动删除
总体来说,它的功能还是多种多样的,⽐如缓存、数据持久化、⽀持事务、⽀持消息队列等
2. Redis的适⽤场景
缓存:减少压⼒,增加性能
排⾏榜:通过Sortset数据格式实现
计数器:原⼦性的⾃增操作(点赞访问量等)
集合关系:交并补集合的关系,共同兴趣点等
消息队列:⾃⾝的发布订阅模式
session共享:通过保存服务器⽂件,集服务中,哪台服务器登录都可以获取信息
3. Redis的线程机制
单线程模式(在redis6.0之后引⼊了多线程io,只是⽤来处理⽹络数据的读写和协议的解析,但执⾏命令还是单线程)
redis 利⽤队列技术将并发访问变为串⾏访问,消除了传统数据库串⾏控制的开销
4. Redis单线程,如何提⾼多核cpu利⽤率
部署多个Redis,当作不同服务器使⽤。也可考虑分⽚
5. Redis持久化机制
两种持久化机制 RDB 和 AOF 机制
RDB:在指定的时间间隔内将内存中的数据集快照写⼊磁盘写⼊⼀个临时⽂件,持久化结束后,⽤这个临时⽂件替换上持久化的⽂件,达到数据恢复优点:
节省磁盘空间
可以安全保存到磁盘
性能最⼤化,⽤单独⼦进程进程持久化
缺点:
数据安全性低。RDB 是间隔⼀段时间进⾏持久化,如果持久化之间 redis 发⽣故障,会发⽣数据丢失
AOF:
以⽇志的形式来记录每个写操作(增量保存),将Redis执⾏过的所有写指令记录下来(读操作不记录), 只许追加⽂件但不可以改写⽂件
优点:
数据安全,每⼀次命令操作就可以追加到后⾯,即使宕机,也可以通过redis-check-aof来修复
缺点:
⽂件过⼤,恢复速度慢
数据集⼤的时候,⽐RDB要慢
6. Redis过期键的删除策略
(1) 定时删除:在设置键的过期时间的同时,创建⼀个定时器 timer). 让定时器在键的过期时间来临时,⽴即执⾏对键的删除操作。
(2) 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
(3) 定期删除:每隔⼀段时间程序就对数据库进⾏⼀次检查,删除⾥⾯的过期键。⾄于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
7. Redis的同步机制
从机主动发送
Slave启动成功连接到master后,从机slave会发送⼀个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的⽤于修改数据集命令, 在后台进程执⾏完毕之后,master将传送整个数据⽂件到slave,以完成⼀次完全同步
全量复制:⽽slave服务在接收到数据库⽂件数据后,将其存盘并加载到内存中。(刚开始从机连接主机,主机⼀次给)
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步 (主机修改了数据会给予从机修改的数据同步,叫做增量复制)
断开之后重新连接,只要是重新连接master,⼀次完全同步(全量复制)将被⾃动执⾏,rdb的数据就会给从机。
主机负责写,从机负责读
8. 了解过集吗
Redis 集实现了对Redis的⽔平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。Redis 集通过分区(partition)来提供⼀定程度的可⽤性(availability): 即使集中有⼀部分节点失效或者⽆法进⾏通讯, 集也可以继续处理命令请求
具体的原理:
哨兵机制 Sentinal 着眼于⾼可⽤,在 master 宕机时会⾃动将 slave 提升 为 master,继续提供服务
集分⽚,Cluster 着眼于扩展性,在单个 redis 内存不⾜时,使⽤Cluster 进⾏分⽚存储
9. 什么情况会导致整个集⽆法使⽤
cluster-require-full-coverage
为yes ,那么 ,整个集都挂掉
为no ,那么,该插槽数据全都不能使⽤,也⽆法存储
10. 设置Redis的密码
通过启动界⾯后
在内部输⼊该命令set requirepass 123456,启动之后通过auth 123456
也可以在配置⽂件直接修改,变成永久密码
11. Redis中slots的卡槽有了解吗
⼀个 Redis 集包含 16384 个插槽(hash slot)也就是使⽤的是哈希槽
集使⽤公式 CRC16(key) % 16384 来计算键 key 属于哪个槽
12. 测试Redis的连通性
switch画法
通过ping命令
13. 理解Redis的事务
具体的命令有这么⼏个MULTI、EXEC、DISCARD、WATCH
事务开始 MULTI
命令⼊队
事务执⾏ EXEC
具体Redis的事务特性有:
单独的隔离操作(不会被打断)
没有隔离级别
不保证原⼦性
事务中的所有命令都会序列化、按顺序地执⾏
计算机网络osi七层模型
14. Redis事务保证原⼦性吗
Redis中,单条命令是原⼦性执⾏的,但事务不保证原⼦性,且没有回滚。
15. 降低Redis的内存使⽤情况
通过使⽤⽐较⼩key-value,可以更加好的紧凑在⼀起
也就是设计键值的时候,越短越好
好好利⽤ Hash,list,sorte,set,set 等集合类型数据。内部会针对不同类型存在编码的概念控制key的数量
16. ⼤量的 key 设置同⼀时间过期,需要注意什么
redis可能会出现短暂的卡顿现象。⼀般需要在时间上加⼀个随机值,使得过期时分散⼀些17. 了解过 Redis 分布式锁吗
Redis 的并发竞争Key
先拿 setnx 来争抢锁,抢到之后,再⽤ expire 给锁加⼀个过期时间防⽌锁忘 记了释放
但是如果setnx之后系统维护了,就不能给锁加时间
正确的应该是同时把 setnx 和 expire 合成⼀条指令来⽤的
补充基于zookeeper:
基于zookeeper临时有序节点可以实现的分布式锁。⼤致思想为:每个客户端对某个⽅法加锁时,在
zookeeper上的 与该⽅法对应的指定节点的⽬录下,⽣成⼀个唯⼀的瞬时有序节点。 判断是否获取锁的
⽅式很简单,只需要判断有 序节点中序号最⼩的⼀个。 当释放锁的时候,只需将这个瞬时节点删除即
可。同时,其可以避免服务宕机导致的锁 ⽆法释放,⽽产⽣的死锁问题。完成业务流程后,删除对应的
⼦节点释放锁
18. 为什么要⽤Redis这种新的数据库
主要是因为 Redis 具备⾼性能和⾼并发两种特性。importo是什么意思
⾼性能:假如⽤户第⼀次访问数据库中的某些数据。这个过程会⽐较慢,因为是从硬盘上读取的。将该⽤户访问的数据存在缓存中,这样下⼀次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
字符串转成bigdecimal⾼并发:直接操作缓存能够承受的请求是远远⼤于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样⽤户的⼀部分请求会直接到缓存这⾥⽽不⽤经过数据库。
19. 单线程的Redis为什么这么快
主要是有三个原因:
1、Redis的全部操作都是纯内存的操作;
2、Redis采⽤单线程,有效避免了频繁上下⽂切换;
3,采⽤了⾮阻塞I/O多路复⽤机制
20. MySQL有1000万数据,Redis作为中间缓存,取其中的10万,如何保证Redis中的数据都是热点数据?
可以使⽤Redis的数据淘汰策略,Redis 内存数据集⼤⼩上升到⼀定⼤⼩的时候,就会施⾏这种策略。具
体说来,主要有 6种内存淘汰策略:
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使⽤的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使⽤的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁⽌驱逐数据
21. AOF重写了解吗?
AOF重写可以产⽣⼀个新的AOF⽂件,这个新的AOF⽂件和原有的AOF⽂件所保存的数据库状态⼀样,
但体积更⼩。
在执⾏ BGREWRITEAOF 命令时,Redis 服务器会维护⼀个 AOF 重写缓冲区,该缓冲区会在⼦进程创
建新AOF⽂件期间,记录服务器执⾏的所有写命令。当⼦进程完成创建新AOF⽂件的⼯作之后,服务器
会将重写缓冲区中的所有内容 追加到新AOF⽂件的末尾,使得新旧两个AOF⽂件所保存的数据库状态
idea2018激活码永久⼀致。最后,服务器⽤新的AOF⽂件替换旧的 AOF⽂件,以此来完成AOF⽂件重写操作。
补充:(实时更新⾯经的常问题⽬:)
22. redis的数据结构以及应⽤场景
数据类型可以存储的
操作应⽤场景
string 字符串、整
数或者浮点
对整个字符串或者字符串的其中⼀部分执⾏操作,对整数和浮点数执
⾏⾃增或者⾃减操作
做简单的键值对缓存,计数器,共享session以及限速
list列表从两端压⼊或者弹出元素,对单个或者多个元素进⾏修剪,只保留⼀
个范围内的元素
存储⼀些列表型的数据结构,类似粉丝列表、⽂章的评论
列表之类的
set⽆序集合添加、获取、移除单个元素,检查⼀个元素是否存在于集合中。计算
交集、并集、差集。从集合⾥⾯随机获取元素
交集、并集、差集的操作,⽐如交集,可以把两个⼈的粉
丝列表整⼀,或者是⽤户的喜好标签等
hash 包含键值对
的⽆序散列
添加、获取、移除单个键值对。获取所有键值对。检查某个键是否存
结构化的数据,⽐如⼀个对象
zset有序集合添加、获取、删除元素。根据分值范围或者成员来获取元素。计算⼀
个键的排名。
去重但可以排序,如获取排名前⼏名的⽤户,排⾏榜等
23. 缓存穿透
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从⽽可能压垮数据源。⽐如⽤⼀个不存在的⽤户id获取⽤户信息,不论缓存还是数据库都没有,若⿊客利⽤此漏洞进⾏攻击可能压垮数据库
通俗的来说:访问的数据缓存不到,⼀直转⽽发送到数据库
解决⽅案:
⼀个⼀定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写⼊缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义
(1)对空值缓存:如果⼀个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进⾏缓存,设置空结果的过期时间会很短,最长不超过五分钟
(2)设置可访问的名单(⽩名单):
使⽤bitmaps类型定义⼀个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap⾥⾯的id进⾏⽐较,如果访问id不在bitmaps⾥⾯,进⾏拦截,不允许访问。
(3)采⽤布隆过滤器:(布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是⼀个很长的⼆进制向量(位图)和⼀系列随机映射函数(哈希函数)。布隆过滤器可以⽤于检索⼀个元素是否在⼀个集合中。它的优点是空间效率和查询时间都远远超过⼀般的算法,缺点是有⼀定的误识别率和删除困难。)
将所有可能存在的数据哈希到⼀个⾜够⼤的bitmaps中,⼀个⼀定不存在的数据会被 这个bitmaps拦截掉,从⽽避免了对底层存储系统的查询压⼒。
mysql面试题基础
(4)进⾏实时监控:当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维⼈员配合,可以设置⿊名单限制服务
总结如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。