L11 Redis 核心技术考题
-
1 Redis的Streams数据类型可以用来实现消息队列,关于Streams
- Streams可以为消息自动生成全局唯一ID
- Streams会自动留存消息,直到消费者使用XACK确认后,再删除消息
- Streams支持阻塞式消息读取
- 消息队列中的消息一旦被消费组里的一个消费者读取了,就不能再被该消费组内的其他消费者读取了。
-
2.Redis运行的过程中,运维人员通过info memory 查看到
mem_fragmentation_ratio
的值等于2, Redis的内存使用情况是怎样的?
mem_fragmentation_ratio
大于 1.5。这表明内存碎片率已经超过了 50%。一般情况下,这个时候,我们就需要采取一些措施来降低内存碎片率了。
-
3.Redis使用RDB机制创建快照,关于RDB机制
- 使用save命令生成RDB快照时,是在主线程中执行的,会阻塞主线程
- RDB文件是Redis实例的镜像,用RDB 文件恢复实例时,直接把RDB文件加载到内存, 就可以快速恢复了
- 和AOF文件相比,RDB文件更小一点
- bgsave 创建快照时,主线程能同时处理读写请求
-
4.Redis使用AOF机制保存数据操作时,可以采用不同的写回策略。当需要有一定的数据可靠性,同时也不能对Redis实例造成较大阻塞的话,应该选择写回策略? everysec
- 使用everysec时,会使用子线程来操作,不会阻塞主线程。而使用always时,是使用主线程来操作,所以会阻塞主线程
- always 可靠性高,但会阻塞Redis实例
- no 基本不会阻塞Redis实例,但是宕机后,会丢失较多的日志记录
-
5. 现在,有一个Redis实例正在线上运行,它使用Hash类型保存了一个key为device的Hash集合,集合中保存了500万条记录。在这些记录中,有20万条记录的key是以“redis”开头的,现在想把这些记录读取出来,应该采用 HSCAN 命令
- KEYS 会引起Redis实例阻塞,而且KEYS无法查询日Hash集合中的记录
- SCAN只能查询整个数据库中的key
- SSCAN是用来扫描查询Set类型
- 6.在主从集群中,当主库收到从库发送的
psync?-1
命令时,从库希望主库执行的操作是: 进行全量复制- 增量复制时,从库会把自己记录的主库ID发给主库,所以psync命令会带有主库ID
- 结束数据复制操作: 不会发送psync
- 断开网络连接: 不会发送psync
- 7. 关于哨兵机制
- 通过 pub/sub 机制,哨兵之间可以组成集群,同时,哨兵又通过 INFO 命令,获得了从库连接信息,也能和从库建立连接,并进行监控了。
- 哨兵进程会使用 PING 命令检测它自己和主、从库的网络连接情况,用来判断实例的状态。
- 如果在
down-after-milliseconds
毫秒内,主从节点都没有通过网络联系上,我们就可以认为主从节点断连了。
- 8. 在使用哨兵机制对发生故障的主从集群进行主从库切时,会涉及
- 主库的主观下线只用哨兵自己判断就行,而客观下线需要多个哨兵共同决定,所以判断主库主观下线要早于判断客观下线。 主从库切换时,新主库是由哨兵Leader来确定的,所以,哨兵集群需要先选出Leader,再确定新主库。
- 9.在使用Redis Cluster时,如果客户端发送操作请求后,收到了MOVED命令,此时,Redis Cluster发生了以下 哪种情况? : 请求数据所在的哈希槽已经迁移到了其他实例
- 10.在Redis的诸多数据类型中,以下哪种数据类型允许插入重复的元素?
- List: 正确,允许写入重复元素
- HyperLogLog, Set, Sorted Set 会对元素去重
- HyperLogLog 是一种用于统计基数的数据集合类型,它的最大优势就在于,当集合元素数量非常多时,它计算基数所需的空间总是固定的,而且还很小。
- 11.Redis数据库是将下列哪种数据结构作为全局数据结构来保存每一对键值对?
- 哈希表
- 12 .在Redis的主从库集群中,如果主库宕机了,以下哪个机制可以让Redis实现自动的主从库切换? 哨兵机制
- AOF重写用来精简过大的AOF文件,加速Redis实例恢复。
- RDB机制用来生成快照,用于实例恢复或是主从库复制。
- 切片机制是把数据分散到多个实例保存,用于保存大量数据。
- 13.以下哪个功能是由Redis主线程完成的: 键值对读写
- UNLINK操作是Redis 4.0后提供的后台异步删除操作,由后台子线程完成。
- RDB生成是主线程通过fork创建了子进程来完成的。
- AOF重写也是由主线程通过fork创建了子进程来完成的
- 14. 以下哪些情况会引起Redis的主线程阻塞
- Redis 3.0中,删除一个100万元素的Set集
- AOF写回策略配置为everysec,同时
no-appendfsync-on-rewrite
设置为no
,AOF重写和AOF写回会竞争磁盘IO资源,导致AOF写回被阻塞,进而导致主线程也被阻塞 - 大量键值对同时过期会引发主线程阻塞
- 15.RDB和AOF是Redis使用的两种持久化机制,关于这两种机制,下面的哪些描述是正确的?
- 使用RDB进行实例恢复的速度,要比使用AOF 进行恢复的速度快认
- AOF日志记录是由主线程完成的
- AOF重写机制可以自动清理AOF文件,不用手动清理
- Redis 4.0版本中可以使用RDB做快照,同时使 用AOF记录两次快照间的操作日志
- 16.我们可以使用Hash和Sorted Set组合来保存时间序列数据,以下哪些功能可以使用这种方式直接在Redis实例上完成?
- 查询某个时刻的数据
- 查询某个时间范围内的所有数据
- 查询最新时刻的数据
- 17.Redis的Hash数据类型,是采用哈希表/压缩列表两种结构作为它的底层实现的?
- 18.关于Redis Cluster,下面哪个描述是正确的?
- Redis Cluster一共有16384个哈希槽
- 客户端需要缓存哈希槽和实例的对应关系,无法直接通过哈希计算就知道数据在哪个实例,只能知道在哪个哈希槽
- Redis Cluster属于可扩展集群,主要用途是让Redis数据库能够保存更多数据认
- Redis Cluster的实例也可以配置主从节点,进行可靠性保证
- 19.在秒杀场景下,你可以在下面哪个环节应用Redis: 秒杀商品库存查询和扣减
- 20.对于切片集群来说,数据倾斜是需要关注的问题,以下哪些原因会引起数据倾斜?
- 存在bigkey / 数据分布不均衡 / HashTag的使用
- 21.关于Redis 6.0的ACL控制机制的描述
- ACL支持不同用户用不同密码登录
- ACL支持对单个命令设置访问控制规则
- ACL可以禁止客户端调用所有命令操作
- ACL使用波浪线设置被访问控制的key: 使用波浪号
“~”
和 key 的前缀来表示控制访问的 key。例如,我们执行下面命令,就可以设置用户normaluser
只能对以“user:”
为前缀的 key 进行命令操作:ACL SETUSER normaluser ~user:* +@all
- 22.为了保证数据在主从库间的一致性,我们需要将数据的过期时间设置为绝对时间,可以使用以下哪些命令来进行设置?
- EXPIREAT 和 PEXPIREAT:它们会直接把数据的过期时间设置为具体的一个时间点。
- EXPIRE / PEXIRE 该命令设置相对过期时间
- 23.下面这些关于Redis事务机制的描述,哪些是正确的?
- Redis事务可以保证一致性 / Redis事务无法保证持久性
- Redis在事务中有命令语法错误时,无法保证原子性,其他情况可以保证
- Redis事务可以保证隔离性
- 24.下面这些关于Codis集群的描述,哪些是正确的?
- Codis proxy接收客户端请求,并进行请求转发
- Codis集群可以使用etcd保存集群元数据
- Codis默认使用1024个Slot
- Codis支持异步迁移,是为了避免阻塞主线程
- 25.当Redis用作缓存时,如果同时有大量数据失效: 缓存雪崩
- 缓存击穿是表示单个或少量热点数据失效
- 穿透是指访问的数据既不在缓存,也不在数据库
- 题干条件下,会发生缓存雪崩,导致大量请求发送到数据库层,给数据库层带来压力
- 26.在使用Redis作为缓存时,如果有一个应用的负载是对一个大数据集中的所有数据扫描一遍,那么使用下面哪种数据淘汰策略会更加合适?
- allkeys-Ifu
- allkeys-lru: 该策略按数据访问时效性进行筛选,会导致刚被访问的数据滞留在缓存,无法被及时淘汰,造成缓存污染
- allkeys-random: 该策略随机选取淘汰的数据,会造成缓存污染
- noeviction: 该策略不会淘汰数据
- LFU 缓存策略是在 LRU 策略基础上,为每个数据增加了一个计数器,来统计这个数据的访问次数。(Least frequent)
- LRU 算法的全称是 Least Recently Used,从名字上就可以看出,这是按照最近最少使用的原则来筛选数据,最不常用的数据会被筛选出来,而最近频繁使用的数据会留在缓存中
- 27 当Redis用作只读缓存时,如果数据发生了修改,以下哪个说法是正确的?
- 在先删除缓存值,后更新数据库时,如果有并发读,可以使用延迟双删,来应对数据不一致问题
- 28 Redis缓存一旦发生缓存击穿,就会导致大量请求发送到数据库层进行处理,可能会导致数据库压力过大而崩溃, 以下哪些方法可以应对缓存击穿问题,缓解数据库压力?
- 数据库限流 / 不给热点数据设置过期时间
- 击穿是表示单个或少量热点数据失效