Redis 之面试


可能是目前最详细的Redis内存模型及应用解读
读完这篇文章,就基本搞定了Redis主从复制
Redis高可用详解:持久化技术及方案选择
可能是目前最详细的Redis内存模型及应用解读
Redis高可用详解:持久化技术及方案选择
读完这篇文章,就基本搞定了Redis主从复制
实现故障恢复自动化:详解Redis哨兵技术

假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

使用keys指令可以扫出指定模式的key列表。

对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

Redis如何做持久化的?

bgsave做镜像全量持久化,aof做增量持久化。
因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。

如果再问aof文件过大恢复时间过长怎么办?你告诉面试官,Redis会定期做aof重写,压缩aof文件日志大小。
如果面试官不够满意,再拿出杀手锏答案,Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。

如果对方追问那如果突然机器掉电会怎样?取决于aof日志sync属性的配置,如果不要求性能,在每条写指令时都sync一下磁盘,就不会丢失数据。但是在高性能的要求下每次都sync是不现实的,一般都使用定时sync,比如1s1次,这个时候最多就会丢失1s的数据。

是否使用过Redis集群,集群的原理是什么?

Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储;使用了虚拟槽技术,将槽划分成 16384 个(即 0 ~ 16383),每个节点上都会分配均匀的一部分插槽,然后通过公式:公式:slot = CRC16(key)mod 16384 计算存放哪个节点。

什么是缓存穿透

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

如何避免?
1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后设置缓存。
2:使用布隆过滤器,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

Redis 之使用布隆过滤器解决缓存穿透

什么是缓存雪崩

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

何如避免?
1、在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2、不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

如何保证redis中的数据都是热点数据

当redis使用的内存超过了设置的最大内存时,会触发redis的key淘汰机制,在redis 3.0中有6种淘汰策略。
限定 Redis 占用的内存,Redis 会根据自身数据淘汰策略,留下热数据到内存。所以,计算一下 50W 数据大约占用的内存,然后设置一下 Redis 内存限制即可,并将淘汰策略为volatile-lru或者allkeys-lru(最近最少使用的数据淘汰)。

八种淘汰策略:

  • noeviction:默认策略,不淘汰任何 key,直接返回错误。
  • allkeys-lru:在所有的 key 中,使用 LRU 算法淘汰部分 key。
  • allkeys-lfu:在所有的 key 中,使用 LFU 算法淘汰部分 key。
  • allkeys-random:在所有的 key 中,随机淘汰部分 key。
  • volatile-lru:在设置了过期时间的 key 中,使用 LRU 算法淘汰部分 key。
  • volatile-lfu:在设置了过期时间的 key 中,使用 LFU 算法淘汰部分 key。
  • volatile-random:在设置了过期时间的 key 中,随机淘汰部分 key。
  • volatile-ttl:在设置了过期时间的 key 中,挑选 TTL(time to live,剩余时间)短的 key 淘汰。

LRU: 是淘汰最长时间没有被使用的key。
LFU: 是淘汰一段时间内,使用次数最少的key。
设置redis最大占用内存: maxmemory 268435456
设置过期策略: maxmemory-policy volatile-lru

redis 最适合的场景?

会话缓存:
https://www.cnblogs.com/xcgShare/articles/11673018.html
https://www.cnblogs.com/xcgShare/articles/11673018.html

使用redis有哪些好处?

速度快;
支持丰富的数据类型;
支持事务;

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

Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争。
用到Redis的setnx命令。

Redis中String类型的Value最大可以容纳数据长度

https://redis.io/topics/data-types
在Redis中字符串类型的Value最多可以容纳的数据长度是512M
在这里插入图片描述
Redis中List类型的Value最大可以容纳多少个元素
在这里插入图片描述

Redis是怎么对过期key进行删除的

定期删除: Redis默认是每隔 100ms 就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意这里是随机抽取的。为什么要随机呢?想一想假如 Redis存了几十万个 key ,每隔100ms就遍历所有的设置过期时间的 key 的话,就会给 CPU 带来很大的负载!
惰性删除 : 定期删除可能会导致很多过期 key 到了时间并没有被删除掉。所以就有了惰性删除。假如你设置了一个过期key,靠定期删除没有被删除掉,一直停留在内存里,除非你的系统去查一下这个 key,才会被Redis给删除掉。这就是所谓的惰性删除!

但是仅仅通过定期、惰性删除方式来删除过期时间key还是有问题的。
想一下:如果定期删除漏掉了很多过期 key,然后也没及时去查,也就没走惰性删除,此时会导致大量过期key堆积在内存里,导致redis内存块耗尽了。怎么解决这个问题呢?Redis内存淘汰机制。

Redis怎么排查阻塞

内在原因包括: 不合理地使用API或数据结构、CPU饱和、持久化阻塞 等。
外在原因包括: CPU竞争、内存交换、网络问题等。
发现阻塞: 应用方会收到 量Redis超时异常,比如Jedis客户端会抛出JedisConnectionException异常。
如对一个包含上万个 元素的hash结构执行hgetall操作,如果只需要部分字段数据使用hmget,如果需要遍历全部可以使用hscan命令,该命令会渐进式遍历哈希类型。最好是将这个大对象拆分成多个小对象。防止一个命令操作过多的数据。

bigkey的危害

内存空间不均匀(平衡): 例如在Redis Cluster中,bigkey会造成节点 的内存空间使用不均匀。
超时阻塞: 由于Redis单线程的特性,操作bigkey比较耗时,也就意味着阻塞Redis可能性增大。
网络拥塞: 每次获取bigkey产生的网络流量较大,假设一个bigkey为 1MB,每秒访问量为1000,那么每秒产生1000MB的流量。

如何发现bigkey: 判断一个key是否为 bigkey,只需要执行debug object key查看serializedlength属性即可,它表示key 对应的value序列化之后的字节数。可以发现serializedlength=11686193字节,约为1M。
在这里插入图片描述
主动检测: scan+debug object:如果怀疑存在bigkey,可以使用scan命令渐进的扫描出所有的key,分别计算每个key的serializedlength,找到对应 bigkey 进行相应的处理和报警。

RedisCluster集群原理

Redis 集群模式的工作原理能说一下么?在集群模式下,Redis 的 key 是如何寻址的?了解一致性 hash 算法吗?

分布式寻址算法: hash 算法、一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)、redis cluster 的 hash slot 算法。

hash 算法: 来了一个 key,首先计算 hash 值,然后对节点数取模。然后打在不同的 master 节点上。一旦某一个 master 节点宕机,所有请求过来,都会基于最新的剩余 master 节点数去取模,尝试去取数据。这会导致大部分的请求过来,全部无法拿到有效的缓存,导致大量的流量涌入数据库。

一致性 hash 算法:

redis cluster 的 hash slot 算法: redis cluster 有固定的 16384 个 hash slot,对每个 key 计算 CRC16 值,然后对 16384 取模,可以获取 key 对应的 hash slot。redis cluster 中每个 master 都会持有部分 slot,比如有 3 个 master,那么可能每个 master 持有 5000 多个 hash slot。hash slot 让 node 的增加和移除很简单,增加一个 master,就将其他 master 的 hash slot 移动部分过去,减少一个 master,就将它的 hash slot 移动到其他 master 上去。移动 hash slot 的成本是非常低的。
好处是任何一台机器宕机,另外两个节点,不影响的。因为 key 找的是 hash slot,不是机器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值