9
系列综述:
💞目的:本系列是个人整理为了秋招面试
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于拓跋阿秀、小林coding等大佬博客进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
🌈【C++】秋招&实习面经汇总篇
内存数据库
,提供多种高效的数据结构
来支持不同的业务场景
,从而实现高并发和高性能。基于内存存储
,读写速度快丰富的数据结构
能适合不同的业务场景。支持分布式部署
,支持集群间的数据迁移。KV结构
,其中key是字符串类型
,而value是redisObject结构体类型
。对象类型(type)
、编码格式(encoding)
、SDS指针
等字段char buf[ ]
,是c99引入的柔性数组,实际是一个指针LPUSH+RPOP
实现消息操作BRPOP
将获取到空消息的消费者阻塞,避免其自旋空转生产者自行实现全局唯一 ID
,消费者记录已经处理过的消息的 ID,每次处理消息前判断消息是否已经处理过BRPOPLPUSH
,从备份List读取过去的消息SRANDMEMBER
命令允许重复中奖跳表
实现的数据量大
的二值统计
场景
集合中不重复元素的个数
概率
完成的,标准误算率是 0.81%
。请求响应机制
保证生产者
的消息不可丢AOF持久化
保证仅丢失刷盘间隔内的中间队列
消息丢失内部队列的消息留存
保证消费者
中消费的消息不会丢失完成后再按序追加
到文件中,宕机重启则读取执行文件中的命令进行恢复默认是不开启
的,需要修改 redis.conf 配置文件写操作命令的执行
和日志的追加
过程中,服务器宕机,会有数据丢失风险给下一个命令带来阻塞风险
。server.aof_buf 缓冲区
:写操作命令执行完成后,会将命令追加到 server.aof_buf 缓冲区内核缓冲区
:通过 write() 系统调用,将 aof_buf 缓冲区的数据拷贝到了内核缓冲区 page cacheAOF文件
:具体内核缓冲区的数据什么时候写入到硬盘,由内核决定。超过所设定的阈值
后,Redis 就会启用 AOF 重写机制只记录该键值对的最新状态
,代替之前多条修改命令覆盖
现有的 AOF 文件。全量快照
(全部内存的实际数据)拷贝到临时文件替换
RDB文件主线程负责生成
RDB文件写时复制COW
生成RDB 文件,这样可以避免主线程的阻塞;过期字典
以哈希结构(key : 过期时间)的形式保存所有key的过期时间随机淘汰
设置了过期时间的任意键值更早过期
的键值,多个相同使用lfu最近最久未使用
的键值最少使用
的键值随机淘汰
任意键值;最久未使用
的键值;最少使用
的键值。config set maxmemory-policy <策略>
设置:设置后立即生效,重启Redis后失效maxmemory-policy <策略>
设置:设置后需要重启,但是之后一直有效最后访问时间字段
:在 Redis 的对象结构体中添加一个额外的字段,用于记录此数据的最后一次访问时间。缓存污染问题
,可以使用young和old分区进行处理访问间隔最大和
和数据访问次数最少
的数据FULLRESYNC响应
(全量同步,主服务器将所有数据同步给从服务器),其中runID表示主服务器的唯一标识,offset表示复制进度没有在规定的时间响应哨兵的PING命令
(由down-after-milliseconds 参数配置),哨兵就会将其标记为「主观下线」SLAVEOF no one
命令告知被选从结点切换为主结点,Leader再向所有从节点发送 SLAVEOF ,让它们成为新主节点的从节点。获得半数以上的赞成票 && 赞成票≥配置文件的quorum值
使用Redis作为缓存层
:减少磁盘数据库的访问,提高访问速度。设置数据过期时间
保证缓存中与数据库中的数据一致性。请求调入
:当用户访问的数据不在缓存或者过期时,系统会访问数据库,并将数据更新到 Redis 里,这样后续请求都可以直接命中缓存。大量缓存数据同时失效
或者Redis 故障宕机
时,如果此时有大量的用户请求会直接访问数据库,从而导致数据库的压力骤增,严重的会造成整个系统崩溃,这就是缓存雪崩的问题过期时间随机化
:同时设置的缓存数据过期时间都加上一个随机数构建缓存互斥锁
:当业务线程在处理用户请求时,如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到 Redis 里),但最好给互斥锁设置超时时间,避免阻塞时间太长造成饥饿后台更新缓存
:不设置缓存数据有效时间,由后台进行定时更新缓存请求限流机制
服务熔断
构建 Redis 缓存高可靠集群
互斥锁方案
:保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。异步更新
:不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;限制非法请求
:在 API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。缓存空值或者默认值
:线上业务发现缓存穿透的现象时,可以针对查询的数据,在缓存中设置一个空值或者默认值,避免大量请求查询数据库布隆过滤器
:快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。分布式锁
,保证同一时间只运行一个请求更新缓存,就会不会产生并发问题了,当然引入了锁后,对于写入的性能就会带来影响。过期时间
,这样即使出现缓存不一致的情况,缓存的数据也会很快过期,对业务还是能接受的。