Java八股文-Redis学习记录2


马士兵-Redis面试题

1.Redis为什么这么快

纯内存访问,单线程避免上下文切换,渐进式ReHash,缓存时间戳

其中,渐进式Rehash用到了两张全局哈希表,缓存时间戳就是,不用System.currentTimeInMillis(因为要调用系统级别的IO,很耗时,单线程的Redis承受不起),而是对时间进行缓存,由一个定时任务,每毫秒更新一次时间缓存,获取时间都是从缓存中直接拿。

2.Redis合适的应用场景

缓存,分布式锁,消息队列,排行榜等

String:缓存,计数,共享Session,

Hash:存对象

List: 消息队列,文章列表的展示

Set: 标签(tag)–>用户喜好

Zset: 排行榜

BitMaps: 布隆过滤器

HyperLogLog: 统计UV:同一个用户一天之内的访问请求只能算作一次。用HyperLogLog存的话比用集合存要更省存储(set存要28G的内容,HyperLogLog存的话要5M即可)

可以结合工作中的具体场景。

3.Redis6.0之前为什么一直是单线程

使用Redis,CPU不是瓶颈,IO是瓶颈。

可以使用pipeline(批量处理),每秒100万个请求。

单线程的话维护成本低,线程安全。而且多线程的线程切换,锁的开销也很大。

4.Redis6.0之后为什么要引入多线程

8W-10W的QPS就是单线程的极限值了。大的公司需要更大的QPS,IO的多线程(内部执行命令还是多线程)

多线程,主线程去做CPU的任务,一些从线程去做IO的任务。

5.Redis有哪些高级功能

慢查询、Pipeline(发送,批处理一堆命令,返回结果)、

事务的功能比较低级,弱事务。

持久化,分布式锁。主从,集群。集群的扩容,缩容,迁移

故障转移:故障发现(主观下线,客观下线。)故障恢复(选举)

6.为什么要用Redis

高性能,高并发。

mysql的并发是1000/s, redis的并发是10W/s

7.Redis与memcache相对比有哪些优势

支持的数据类型比较多,支持单个/批量/弱事务操作。

redis支持发布/订阅。主从多可用,序列化支持,支持lua脚本。执行命令-单线程,网络操作-多线程。

memcache支持多线程

8.怎么理解Redis中事务

redis的事务很简单。将一组需要一起执行的命令放到multi和exec两个命令之间。前面表示事务开始,后面代表事务结束。

redis的事务很弱,只对基本的语法错误进行判断,比如写的sett这种。运行时的错误管不了。

事务还是要用lua.

9.Redis的过期策略以及内存淘汰机制

定期删除–定时扫描,从过期字典里抽20个key,删除其中已经过期的,如果比例超过1/4,则重复。

惰性删除–访问这个Key的时候检查是否过期,如果过期则立刻删除,不返回任何东西。

淘汰算法:
1.不淘汰

2.只淘汰有过期时间的,分为ttl,LRU

3.不管有没有过期时间,LRU,随机

10.什么是缓存穿透

访问一些缓存不存在的数据,就是缓存穿透。

解决放案是让redis直接返回Null,或者用布隆过滤器。

布隆过滤器优化方案:增大数组(预估合适值),或者增加hash函数。

增加了hash函数以后,只有hash1和hash2全是1才继续往下走,有一个是0则说明数据一定不存在。

11.什么是缓存雪崩

Redis宕机或大量key同时失效。

解决方案:集群/主从。 TTL 岔开。

12.使用Redis如何设计分布式锁

使用setnx命令。为了避免死锁,给这个锁一个过期时间。又因为过期时间不好评估,加入watchDog

13.怎么使用Redis实现消息队列

14.什么是Bigkey,会有什么影响

15.Redis如何解决key冲突

key的设计,业务模块+系统名称+关键词

biz-pay-orderId-userId

分布式锁,多个客户端对同一个key的竞争。拿到锁才能进行操作

16.怎么提高缓存命中率

1.提前加载 2.给缓存扩容 3.调整缓存的存储类型(String–>Hash) 4.提升缓存的更新频次(比如canal监听mysql的binlog)

17. Redis持久化方式有哪些,有什么区别

RDB,快照,大,阻塞

AOF,追加,

混合的方式

18.为什么Redis需要把所有数据放到内存中

磁盘读取时间太慢了,太耗时了。

19.如何保证缓存与数据库双写时的数据一致性

1.先删除缓存,后更新数据库,休眠1秒然后再删缓存。(延时双删)

2.先更新数据库,后删除缓存

20.Redis集群方案怎么做

16384个槽。

21.Redis集群方案什么情况下会导致整个集群不可用

为了保证集群完整性,默认情况下,16384个槽任意一个不能用,则集群不可用。

将参数cluster-require-full-coverage配置为no,则主节点只负责它负责的槽,不影响其他槽的可用性。

集群半数以上宕机

选举机制异常的时候

22.Redis的哈希槽的概念

0-16383,三个节点,则每个节点负责大约5460个槽

23.Redis集群会有写操作丢失吗,为什么

一主多从,异步同步,主节点宕机来不及同步。

24.Redis常见性能问题和解决方案

持久化。主从,主不要做持久化,从做持久化

数据比较重要,AOF持久化,slave开启持久化,策略每秒同步一次。

主从复制不要一主99从的网状,可以用多级的树来搞从节点,分担主节点的压力。

25.热点数据和冷数据

数据更新前至少读取2次–才能放缓存。

26.什么情况下会导致Redis阻塞

客户端的主线程执行大命令,比如 keys*

bigkey的删除,释放大量的占用空间。

清空库,flushdb

AOF日志同步写,记录AOF日志,同步写。

从库加载RDB文件


文章作者: 爱敲代码の鱼儿
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 爱敲代码の鱼儿 !
  目录