缓存面试题

项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?

如何使用

如何使用是回答用缓存来干嘛了。 回答点:缓存能用来干嘛,项目中的缓冲用来干嘛了。
缓存当然是用来缓冲存储层的数据的和计算后的结果。
在我们项目这使用了以上两种。 xxxx and xxxx

为什么使用

回答这个为什么使用的时候围绕两点:性能和高并发。
缓存了计算后的结果,节省了计算时间,那么自然性能就上来了。
缓存了存储层的数据,后续请求无需再次访问数据库,那么并发自然也就上来了。MySQL的QPS到2000已经是单机的瓶颈了,Redis单机的QPS上限在10w,并发提升50倍。

使用不当的后果,怎么避免

数据不一致问题:比如现在有一个写命令过来。 如果先操作缓存,再操作数据库。当操作完缓存后,OOM了。这个时候数据就不一致了。数据库和缓存数据不一致
缓存雪崩问题:当缓存集体失效或者缓存服务器宕机时,那么大量的请求会打到存储层,就可能级联导致存储层雪崩。
缓存穿透问题:当出现大量的缓存miss,流量就会打到存储层,也可能引起存储层的崩溃
缓存击穿问题:当某个热点key过期时,也会有大流量打到存储层,也可能引起存储层的崩溃
三个问题

Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发?

这个问题其实是在问技术选型。
当我们使用一项技术的时候,肯定有很多备选项,那么我们应该如何挑选呢?
我们需要分析各个备选项的特性和优缺点,选择最贴合项目需求,社区活跃,符合未来架构,足够的普遍性(降低学习成本)。

特性RedisMemcached
线程模型单线程架构多线程架构
网络IO模型IO多路复用IO多路复用
内存分配分配完内存后把内存的大小写入头部,提供释放内存速度,jemalloc算法分配预分配机制,按块分配,没有内存碎片
支持的数据结构string、hash、list、zset、set、geo、hyperloglog、bitmap、boomfilter简单的kv
数据持久化RDB AOF不支持
集群模式第三方和原生的cluster客户端或者第三方
高可用原生支持主从第三方支持

单线程架构,无锁。内存操作,纳秒级别。IO多路复用的网络模型

Redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

定时过期,定期过期,惰性过期。
内存淘汰机制:
无非就是针对过期键还是持久键,是随机删除还是lru还是ttl

linkedHashMap在put时如果当前size达到最大size,那么从头部remove一个节点。accessOrder置为true

如何保证 redis 的高并发和高可用?redis 的主从复制原理能介绍一下么?redis 的哨兵原理能介绍一下么?

高并发是依赖主从,从节点分担读请求。 写请求超过10w,那就要上集群模式了。
高可用就是主从复制+哨兵机制

主从复制原理

复制流程:ping - pong -sync - rdb - aof - 每次写命令异步发送到从服务器
短时间断线重连:psync - 检查是否为自己的从节点,复制偏移量是否在复制缓冲区 - aof | rdb
复制流程的rdb是不会落磁盘的,减少对master正常工作的影响
心跳:主节点10s一次,从节点1秒一次

本问题主要回答

哨兵redis-sentinel

哨兵是往master和slave节点发送ping来判断主节点是否存活。发送pub/sub发现其他sentinel节点和交换本节点的主从节点信息。
主观下线:当master超过down-after-milliseconds没有收到sub消息时,就会认为主观下线。
客观下线:当sentinel有quorum个节点都认为无响应后,认为客户下线
通过raft选举算法选举出领头羊来执行这次故障转移:

  1. 对从节点slaveof no one
  2. 对其他从节点执行slaveof 新master
  3. 记录原master为slave
    使用epoch来保证master的正确更新
  • 每隔10秒,每个sentinel节点向主节点和从节点发送info命令获取最新的拓扑结构
  • 每隔2秒,每个sentinel节点会向redis数据节点的__sentinel__:hello频道发送sentinel节点对于主节点的判断以及当前sentinel节点的信息,并且订阅此频道,了解其他节点对主节点的判断
  • 每隔1秒,每个sentinel节点会向主节点、从节点、其余sentinel节点发送一条ping命令做一次心跳检测,是否存活。

Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

特点AOFRDB
文件大小存储了每条写命令大于rdb二进制文件
完整度配置everysec最多延迟2s触发save才会保存,延迟较大
恢复速度较快
执行代价每次写命令后追加一天日志缓冲文件的写和定期的bgrewriteaof在业务低峰期执行,代价很小

aof:每一次写命令 写入到日志缓冲区,根据刷盘策略刷新到磁盘
rdb:根据配置的save 定时触发。fork 子线程 -> 复制 + aof +cow -> 主线程把aof写入rdb 原子性的更换rdb文件。

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

简单问题
redis开发与运维读书笔记

Redis 的并发竞争问题是什么?如何解决这个问题?了解 Redis 事务的 CAS 方案吗?

多个客户端并发操作一个key,因为网络问题导致先后执行顺序错乱。
事务+watch机制
lua脚本。

生产环境中的 Redis 是怎么部署的?

yaml文件。 headless + statefulset + pv + redis cluster

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值