Redis 之面试

本文深入探讨Redis在大规模数据环境下的高效应用,涵盖过期键处理、持久化策略、集群原理、缓存穿透与雪崩解决方案,以及如何确保数据热点与优化内存使用,旨在帮助读者掌握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,不是机器。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值