Redis_高频面试题
1、什么是Redis?简述它的优缺点?
2、Redis相比memcached有哪些优势?
3、Redis支持哪几种数据类型?
4、Redis主要消耗什么物理资源?
5、Redis的全称是什么?
6、Redis有哪几种数据淘汰策略?
7、Redis官方为什么不提供Windows版本?
8、一个字符串类型的值能存储最大容量是多少?
9、为什么Redis需要把所有数据放到内存中?
10、Redis集群方案应该怎么做?都有哪些方案?
11、Redis集群方案什么情况下会导致整个集群不可用?
12、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
13、Redis有哪些适合的场景?
14、Redis支持的Java客户端都有哪些?官方推荐用哪个?
15、Redis和Redisson有什么关系?
16、Jedis与Redisson对比有什么优缺点?
17、Redis如何设置密码及验证密码?
18、说说Redis哈希槽的概念?
19、Redis集群的主从复制模型是怎样的?
20、Redis集群会有写操作丢失吗?为什么?
21、Redis集群之间是如何复制的?
22、Redis集群最大节点个数是多少?
23、Redis集群如何选择数据库?
24、怎么测试Redis的连通性?
25、Redis中的管道有什么用?
26、怎么理解Redis事务?
27、Redis事务相关的命令有哪几个?
28、Redis key的过期时间和永久有效分别怎么设置?
29、Redis如何做内存优化?
30、Redis回收进程如何工作的?
31、为什么redis需要把所有数据放到内存中?
32、Redis常见的性能问题都有哪些?如何解决?
33、Redis最适合的场景有哪些?
34、Memcache与Redis的区别都有哪些?
35、Redis有哪几种数据结构?
36、Redis的持久化是什么?
37、RDB的优缺点?
38、AOF的优缺点?
39、简单说说缓存雪崩及解决方法
40、缓存穿透怎么导致的?
41、项目中有出现过缓存击穿,简单说说怎么回事?
42、遇到缓存一致性问题,你怎么解决的?
43、为什么要用 Redis 而不用 map/guava 做缓存?
44、如何选择合适的持久化方式?
45、Redis持久化数据和缓存怎么做扩容?
46、Redis的内存淘汰策略有哪些?
47、简单描述下Redis线程模型
48、Redis事务其他实现方式?
49、生产环境中的 redis 是怎么部署的?
50、 如何解决 Redis 的并发竞争 Key 问题?
51、 什么是 RedLock?52、什么时候需要缓存降级?
53、如何保证缓存与数据库双写时的数据一致性?
1、什么是Redis?简述它的优缺点?
Redis本质上是key-value基于内存的数据库,因为是纯内存操作,Redis的性能非常出色,每秒的可以处理10W的读写操作,是已知性能最好的 key-value数据库。
不仅如此,Redis最优秀的还是他的五种常用类型和4种扩展类型,拥有多种数据结构让我们选择.
但是选择Redis的数据类型的时候也是需要注意的,一般的keyValue存储官方是推荐我们使用哈希,而不是使用string类型,因为string类型的底层结构是两种编码模式,一种是Raw,一种是embstr,在存入大于44个字节的时候,会用Raw编码来分配内存空间,但是这种编码如果存64个字节,可能会给我们分配100多个字节的空间,存入字节小于44就会变成Embstr编码。所以一般string类型就做一些存Token之类的操作或者整型的自增自减操作(拿memcached和redis对比 一个是取全量之后还要本地计算list 而redis直接计算好之后返回结果-性能快)。
为什么选择哈希呢,因为Redis的哈希底层也是两种数据结构:一种是zipList,一种是哈希表
- 正常的List,每个元素的内存空间一样,假如每个内存空间都是100字节,第1个元素10字节,第二个100字节,第三个20字节,浪费大量空间),而zipList是自动适应内存空间的, 第1个元素10字节,那么存储的内存空间就是10字节,都是在内存空间开辟一连串的空间,只不过zip会自动适应内存空间,但也有问题:每次要插入值的时候,要开辟新的大空间把原先的迁移过来,把新值插入进去,所以每次新值内容,就要开辟一次新的空间,并且没有下标,因为不知道每个值的长度,普通的List有下标。查询的时候,要重头来计算前面的空间大小,所以查询速度变慢了。
- 所以就存在两个问题:1.每次插入都需要开辟新的空间,2.每次查询的时候都需要重头计算,所以查询速度变慢了
所以当zipList里面子数量个数大于512或者元素长度大于64字节会自动选择哈希表-避免zip存入过大过多的数据导致性能变慢
而哈希table之所比string更好的是因为存用户信息要取里面的年龄元素要全部取出,而哈希不用,因为是数组加链表形式直接取就可以了,但是也存在问题。
- 问题:因为Redis是通过哈希函数计算Key,Value的指针放入哈希桶的,而哈希桶的数量有限,当Key数量过多就会存在哈希冲突,多个Key存在同一个桶中就形成了链表,而每个链表指向下一个元素,如果链表过长,这样查询的速度就变得慢了起来,
- 那么Redis怎么解决:建立两个哈希表,并且进行reHash(当表1的元素个数等于数组长度的时候,就往表2存数据,表2扩容成表1的两倍), 但是Redis是单线程的不可能直接全量搬迁,于是每次客户端访问Redis的hash的都会搬迁一点到新的哈希表-渐进式reHash, 再搬迁过程中,查询优先找表1然后是表2 ,删除只能对表1操作,插入只能对表2操作。最后表1快搬迁完了元素个数小于数组长度的10%就进行缩容,如此反复。
还有Redis是工作单线程-io是多线程:通过多路复用,由系统帮Redis监听链接,只要有系统处理,系统会调用Redis的回调函数,把监听事件交给了系统,释放了我们的代码,而这也是我们直接调Redis的接口就能实现秒杀功能的原理。单线程串行化
多路复用:就是把监听和阻塞等待是否有请求进来的事情交给系统内核处理而系统直接开启高速通道处理
缺点:
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能
读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2、Redis相比memcached有哪些优势?
计算向数据移动:memcached取List数据里面的一个元素要取全量,Redis能直接取到里面的元素
3、Redis支持哪几种数据类型?
string hash list set zset, 地图 布隆过滤器,logs
4、Redis主要消耗什么物理资源?
内存
5、Redis的全称是什么?
Remote Dictionary Server。 远程字典服务器
6、Redis有哪几种数据淘汰策略?
6种 novection 内存慢了直接返回错误, lru 删除过期时间后长时间没有使用的, lfu删除过期时间后使用频率最低的 随机淘汰, 随机过期时间淘汰,过期时间越早淘汰
7、Redis官方为什么不提供Windows版本?
Linux稳定,用户量大,反而会带来兼容性问题
8、一个字符串类型的值能存储最大容量是多少?
512M
9、为什么Redis需要把所有数据放到内存中?
为了打到最高的性能化,读写都在内存,然后异步化到磁盘,所以Redis具有快速和数据持久化特点,因为磁盘的IO会严重英雄Redis的性能,内存也越来越便宜
10、Redis集群方案应该怎么做?都有哪些方案?
1.codis。
目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点
数据可恢复到新hash节点。
11、Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少
5501-11000这个范围的槽而不可用。
12、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
13、Redis有哪些适合的场景?
秒杀 Session,全局配置信息,排行榜计数器 发布订阅
17、Redis如何设置密码及验证密码?
设置密码:config set requirepass 123456
授权密码:auth 123456
18、说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过
CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。所以每个节点都是一部分数据读取,而不是其他分布式kafka等全量数据镜像
19、Redis集群的主从复制模型是怎样的?
为了防止不分节点失败和无法通信,集群仍然可以使用,所以集群使用了主从模型,每个节点都会有N-1个复制品
20、Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。
21、Redis集群之间是如何复制的?
异步复制
22、Redis集群最大节点个数是多少?
16384个
23、Redis集群如何选择数据库?
Redis集群目前无法做数据库选择,默认在0数据库。
24、怎么测试Redis的连通性?
Ping
25、Redis中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服
务器,而不用等待回复,最后在一个步骤中读取该答复。
26、怎么理解Redis事务?
事务是一个单独隔离的操作,里面的所有命令都会顺序化,在执行过程中不被其他程序打搅,具有原子性,要么全部成功,要么全部失败
27、Redis事务相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH
28、Redis key的过期时间和永久有效分别怎么设置?
Eepire和Persist命令。
29、Redis如何做内存优化?
尽可能使用哈希表
30、Redis回收数据策略进程如何工作的?
一个客户端运行了新的命令,添加了新的数据。
Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。
32、Redis常见的性能问题都有哪些?如何解决?
1.主从架构下,写内存快照,然后Save命令调度rdbSave函数,会阻塞主线程的工作,当快照大会对性能进行英雄.会间歇性暂停服务,所以Master最好不要写内存快照
2.Master主从模式下 AOF持久化 这对性能小因为是追加的, 但是AOF过大会对Master重启的恢复速度有影响,特别不要用使用内存快照。因为是全量复制的。主从下最好不要持久化,真需要,就对重要的数据保存单独的AOF备份,每秒同步一次
35、Redis有哪几种数据结构?
string可以是字符串或者整型有自增自减
哈希字典,存用户信息
List:双向链表
Set:不重复的集合
Zset-带权重的集合
bitMap:地图
logs:海量信息统计
布隆过滤器:极少内存存储大量数据
36、Redis的持久化是什么?
RDB:指定间隔内数据生出快照
AOF:记录服务器执行的所有写的操作命令,在服务启动的时候,重新执行这下命令来还原.AOF全部以Redis协议格式来报仇,新命令会追加到文件末尾。
两个同时用:Redis重启的时候,会优先使用AOF还原,因为保存更完整,速度更快
37、RDB的优缺点?
优点:RDB是一个非常紧凑(compact)的文件,它保存了Redis在某个时间点上的数据集。这种非常适合备份,并且可以进行加密传输给别的系统,可以独立1个子线程来保存
但是 服务器故障的时候,可能会丢失某1个时间段的数据,当数据庞大的时候,子线程 也会非常耗时,造成服务器在某毫秒内处理客户端,如果CPU紧张和数据集大,可能会停止长达一秒
38、AOF的优缺点?
优点:不同的fsunc异步策略,每秒钟1次性能也很好,只是进行日志文件追加,假如写入磁盘慢了,中途停机了 也可以使用redis-check-aof工具修复 ,AOF文件过大也会进行创建新的AOF进行自动重写,从旧的AOF切换到新的AOF。
39、简单说说缓存雪崩及解决方法
过期时间设置一样突然失效, 设置不同过期时间策略 50s
请求数据库之前,把高并发请求队列化。
40、缓存穿透怎么导致的?
高并发下 插缓存key不存在,然后穿透到了数据库,
对查询结果为空的也给一个null缓存。 在查缓存之前加一层布隆过滤器,查询的时候先去布隆过滤器查询key是否存在,不存在则返回,存在在继续插缓存和DB
41、项目中有出现过缓存击穿,简单说说怎么回事?
缓存没有数据库有,缓存提前预热,
42、遇到缓存一致性问题,你怎么解决的?
1.设置过期时间2.延时双删,更新数据库的同时删除缓存,然后2s之后再删除缓存,等到读的时候再会写到缓存
44、如何选择合适的持久化方式?
1.先要达到和sql一样的数据安全性应该两种同时使用,Redis重启的时候会优先载入AOF来恢复原始数据,因为AOF保存的比RDB完整,然后RDB做备份,因为比AOF恢复的数据速度更快
45、Redis持久化数据和缓存怎么做扩容?
1.使用Redis的哈希数据类型,作自动的扩容和缩容
47、简单描述下Redis线程模型
Redis基于Reactor模式开发了网络事件处理器也叫文件事件处理器,组成部分:多个套接字,IO多路复用程序,文件事件分派器,事件处理器,因为文件事件分派器队列的消费是单线程的,所以Redis也叫单线程模型
文件事件处理器使用IO多路复用的程序来监听多个套接字,根据套接字目前执行的任务来为套接字关联不同的事件处理器
当套接字准备好执行答(accept)、读取(read)、写入(write)、关闭(close)等操作时
与操作对应的文件事件就会产生,然后文件事件处理器就会调用套接字关联好的事件处理器来处理这些事件
虽然文件事件处理器是单线程的,单是通过io多路复用程序来监听多个套接字,文件事件处理器又实现了高性能的网络通信,又可以保持好Redis单线程的简单性
48、Redis事务其他实现方式?
基于Lua脚本,保证脚本命令一次性,按顺序的执行
49、生产环境中的 redis 是怎么部署的?
1.两台服务器,一主一从,
主实例宕机,都会自动故障迁移,redis
从实例会自动变成主实例继续提供读写服务。
50、 如何解决 Redis 的并发竞争 Key 问题?
使用分布式Redis锁
51、 什么是 RedLock?
1. 安全特性:互斥访问,即永远只有一个 client 能拿到锁
2. 避免死锁:最终 client 都可能拿到锁,不会出现死锁的情况,即使原本锁住某资源的 client crash
了或者出现了网络分区
3. 容错性:只要大部分 Redis 节点存活就可以正常提供服务
52、什么时候需要缓存降级?
当访问量剧增,服务出现问题,边角业务影响到核心业务的时候进行缓存降低:也就是缓存失效的情况下,不让请求取到服务器,而是返回1个默认值,但也是有影响的需要权衡
- 错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能够承受的最大阈值,此时可以根据情况自动降级或者人工降级
- 严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级
本文来自博客园,作者:12不懂3,转载请注明原文链接:https://www.cnblogs.com/LZXX/p/16368039.html