redis相关⾯试题
1、Redis的⾼并发和快速原因?你为什么选择redis?Redis跟其他缓存相⽐,优势在哪⾥?
解释:多路——多个scoket、多个客户端、多个⿊窗⼝
复⽤:复⽤那⼀个线程
2、为什么Redis是单线程的
1.官⽅答案
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的⼤⼩或者⽹络宽带。既然单线程容易实现,⽽且CPU不会成为瓶颈,那就顺理成章地采⽤单线程的⽅案了。
2单线程避免了上下⽂切换,节约时间
3、 Redis单线程的优劣势
1)单进程单线程优势:
代码更清晰,处理逻辑更简单
2)单进程单线程弊端:
⽆法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善。
4、redis中的数据类型有哪些?
1 String:字符串类型,⼀个key对应⼀个值,可以存储任何内容,图⽚、视频都⾏,但是⼤⼩限制在512m以内
2 List:单键多值,值可以重复
3 t:单键多值,值不可以重复
4 Hash:key后⾯跟field属性,从⽽确定⼀个值
5 zSet:单键多值,有序不重复集合,可以⾃动排序
5、跳表的原理是什么?
跳表是⼀个随机化的数据结构,实质就是⼀种可以进⾏⼆分查找的有序链表。跳表在原有的有序链表上⾯增加了多级索引,通过索引来实现快速查找。跳表不仅能提⾼搜索性能,同时也可以提⾼插⼊和删除操作的性能。 redis的zt类型的底层就是⽤了这种数据结构
Redis key
String
< key value :只有在key不存在的时候设置key的值
常⽤来做分布式锁
2.incrby / decrby <;步长>将 key 中储存的数字值增减。⾃定义步长
Incr和decr是原⼦操作,java的i++是原⼦操作吗?不是
i=0;两个线程分别对i进⾏++100次,值是多少?2-200
List
1.lpop/rpop 从左边/右边吐出⼀个值。值在键在,值光键亡。
2.lrange 根据范围取值
什么是象牙塔
3.lpush/rpush存值
Set
1.sadd …
上海周边两日游
将⼀个或多个 member 元素加⼊到集合 key 中,已经存在的 member 元素将被忽略
2.smembers 根据范围取值
3.t类型数据的扩展操作
sinter 返回两个集合的交集元素。
sunion 返回两个集合的并集元素。
sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)
Hash
1.ht 给集合中的 键赋值
放松心情英文
2.hget 从集合取出 value
3.hexists 查看哈希表 key 中,给定域 field 是否存在。
Zt
2…zrevrangebyscore key maxmin [withscores] [limit offt count] 同上,改为从⼤到⼩排列。
3.zincrby 为元素的score加上增量
7.持久化⽅式有哪些?有什么区别?
redis持久化⽅案分为RDB和AOF两种。
RDB:
RDB持久化可以⼿动执⾏也可以根据配置定期执⾏,它的作⽤是将某个时间点上的内存中的数据保存到RDB⽂件中,RDB⽂件是⼀个压缩的⼆进制⽂件,通过它可以还原数据。由于RDB⽂件是保存在硬盘上的,所以即使redis崩溃或者退出,只要RDB⽂件存在,就可以⽤它来恢复数据。
可以通过save或者bgsave来⽣成RDB⽂件。
SAVE命令会阻塞redis进程,直到RDB⽂件⽣成完毕,在进程阻塞期间,redis不能处理任何命令请求,这显然是不合适的。
BGSAVE则是会创建⼀个⼦进程,然后由⼦进程去负责⽣成RDB⽂件,⽗进程还可以继续处理命令请求,不会阻塞进程。
AOF:
AOF和RDB不同,AOF保存的是命令,将写的命令保存起来。
AOF通过追加、写⼊、同步三个步骤来实现持久化机制。
1.当AOF持久化处于激活状态,服务器执⾏完写命令之后,写命令将会被追加aof缓冲区的末尾
2.在服务器结束⼀个事件之前,将会调⽤flushAppendOnlyFile函数决定是否要将aof缓冲区的内容保存到AOF⽂件中,可以通过配置appendfsync来决定。
配置如下:
always实时同步
everyc每秒同步
no同步时间由操作系统决定
默认选项将会是everyc,每秒同步
8.了解Redis事务机制吗?
redis通过MULTI、EXEC、WATCH等命令来实现事务机制,事务执⾏过程将多个命令按照顺序⼀次性执⾏,并且在执⾏期间,事务不会被中断,也不会去执⾏客户端的其他请求,直到所有命令执⾏完毕。事务的执⾏过程如下:
1事务以MULTI开始
2.如果客户端正处于事务状态,则会把执⾏命令放⼊队列,并且返回给客户端QUEUED,反之则直接执⾏这个命令
3.当服务器收到客户端的EXEC命令时,WATCH命令监视整个事务中的key是否有被修改,如果有则返回空,表⽰失败,否则redis会遍历整个事务队列,执⾏队列中的所有命令,最后返回结果给客户端
9.什么是悲观锁?什么是乐观锁?
(redis、mysql、oracle、mybatis-plus)
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别⼈会修改,所以每次在拿数据的时候都会上锁,这样别⼈想拿这个数据就会等待,直到拿到锁。传统的关系型数据库⾥边就⽤到了很多这种锁机制,⽐如⾏锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别⼈不会修改,所以不会上锁,但是在更新的时候会判断⼀下在此期间别⼈有没有去更新这个数据,可以使⽤版本号等机制。乐观锁适⽤于多读的应⽤类型,这样可以提⾼吞吐量。Redis就是利⽤这种check-and-t机制实现事务的。
10.主从复制的原理:
1)当从服务器连接上主服务器之后,从服务器就会向主服务器发送⼀个sync命令进⾏数据同步操作
2)主服务器接到从服务器发过来的同步命令,先将主服务器数据进⾏持久化,⽣成rdb⽂件,然后把rdb⽂件发送给从服务器,从服务器拿到rdb进⾏读取,完成复制
3)每次主服务器进⾏写操作之后,和从服务器进⾏数据同步
赞美春天4)全量复制:从机第⼀次连接主机,主机所有的数据将会同步给从机。
5)增量复制:主机继续将新的数据依次传给从机
6)但是只要是重新连接主机(从机发出slaveof命令),全量复制都会⾃动执⾏
11. 主从复制的三种⽅式:
⽅式⼀:⼀主多从(N个从机直接跟随主机)
⽅式⼆:薪⽕相传 (从机可以作为其他机器的主机)
⽅式三:反客为主 (主机宕机 ,从机可以通过slaveof no one 变成主机)
12 什么是哨兵机制?哨兵机制的⼯作原理是什么?
主从架构中,主机宕机,从机⽆法⾃动上位,需要⼿动上位,⽽哨兵机制就是⾃动上位
英语人物1.基于主从⽅案的缺点还是很明显的,假设主机宕机,那么就不能写⼊数据,那么从机也就失去了作⽤,整个架构就不可⽤了,除⾮你⼿动切换,主要原因就是没有⾃动故障转移机制。⽽哨兵具备⾃动故障转移、集群监控、消息通知等功能。
2.哨兵可以同时监视多个主从服务器,并且在被监视的主机下线时,⾃动将某个从机提升为主机,然后由新的主机继续接收命令。
3.哨兵会每隔1秒向所有实例(包括主从服务器和其他哨兵)发送ping命令,并且根据回复判断是否已经下线,这种⽅式叫做主观下线。当判断为主观下线时,就会向其他监视的哨兵询问,如果超过半数的投票认为已经是下线状态,则会标记为客观下线状态,同时触发故障转移。
13.知道什么是热key吗?热key问题怎么解决?
所谓热key问题就是,突然有⼏⼗万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理⽹卡上限,从⽽导致服务器宕机。
针对热key的解决⽅案:
1.提前把热key打散到不同的服务器,降低压⼒
2.加⼊⼆级缓存,提前把热key加载到⼆级缓存中,如果redis宕机,⾛⼆级缓存查询
14.什么是缓存击穿、缓存穿透、缓存雪崩?
(1)缓存穿透:
缓存穿透是指查询内存和数据库都不存在的数据,每次请求都会打到数据库上,从⽽压垮数据库。
解决⽅案:
1、 缓存null:根据id=30000去数据可查找ur,ur=null,也将ur=null放到redis中
2、 使⽤布隆过滤器:是⼀种数据结构,判断值肯定不存在或者可能存在
准备⼀个⾜够长的数组,将值存⼊数据库的时候,同时将key存⼊布隆过滤器
查找key的时候,先去布隆过滤器中获取这个key的三个hash值,在根据hash值去布隆过滤器中获取值,
三个值中有⼀个0,代表数据肯定不存在,如果三个值都是1,代表可能存在,再去数据库查找数据,针对这个问题,加⼀层布隆过滤器。布隆过滤器的原理是在你存⼊数据的时候,会通过散列函数将它映射为⼀个位数组中的K个点,同时把他们置为1。
这样当⽤户再次来查询A,⽽A在布隆过滤器值为0,直接返回,就不会产⽣击穿请求打到DB了。显然,使⽤布隆过滤器之后会有⼀个问题就是误判,因为它本⾝是⼀个数组,可能会有多个值落到同⼀个位置,那么理论上来说只要我们的数组长度够长,误判的概率就会越低,这种问题就可以在⼀定程度上得到解决。
(2)缓存击穿:
redis中不存在这个key,数据库中存在,key在redis中过期了,当⼤量请 求过来的时候,请求会直接打到数据库上,引起数据库崩溃
解决⽅案:a.加锁:操作数据库的时候加锁
B.当某⼀个请求去数据库查询的时候,同时在redis中将值设为null,待他 从数据库查到数据返回后,设置具体的值
(3)缓存雪崩:
(3)redis中不存在这些key,数据库中存在,这些key在某⼀时间集中过期了, 当⼤量请求过来的时候,请求会直接打到数据库上,引起数据库崩溃
解决⽅案:a.加锁
C.多级缓存
D.设置key 的不同的过期时间,⽐如固定的过期时间上在随机1-10分钟
15.Redis的过期策略有哪些?
redis主要有2种过期删除策略
惰性删除
一战结束时间惰性删除指的是当我们查询key的时候才对key进⾏检测,如果已经达到过期时间,则删除。显然,他有⼀个缺点就是如果这些过期的key没有被访问,那么他就⼀直⽆法被删除,⽽且⼀直占⽤内存。
骷髅虾定期删除
定期删除指的是redis每隔⼀段时间对数据库做⼀次检查,删除⾥⾯的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取⼀些key去做检查和删除。
16.那么定期+惰性都没有删除过期的key怎么办?
假设redis每次定期随机查询key的时候没有删掉,这些key也没有做查询的话,就会导致这些key⼀直保存在redis⾥⾯⽆法被删除,这时候就会⾛到redis的内存淘汰机制。
1.volatile-lru:从已设置过期时间的key中,移出最近最少使⽤的key进⾏淘汰
2.volatile-ttl:从已设置过期时间的key中,移出将要过期的key
3.volatile-random:从已设置过期时间的key中随机选择key淘汰
4.allkeys-lru:从key中选择最近最少使⽤的进⾏淘汰
五谷杂粮粥5.allkeys-random:从key中随机选择key进⾏淘汰