项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果?
如何使用
如何使用是回答用缓存来干嘛了。 回答点:缓存能用来干嘛,项目中的缓冲用来干嘛了。
缓存当然是用来缓冲存储层的数据的和计算后的结果。
在我们项目这使用了以上两种。 xxxx and xxxx
为什么使用
回答这个为什么使用的时候围绕两点:性能和高并发。
缓存了计算后的结果,节省了计算时间,那么自然性能就上来了。
缓存了存储层的数据,后续请求无需再次访问数据库,那么并发自然也就上来了。MySQL的QPS到2000已经是单机的瓶颈了,Redis单机的QPS上限在10w,并发提升50倍。
使用不当的后果,怎么避免
数据不一致问题:比如现在有一个写命令过来。 如果先操作缓存,再操作数据库。当操作完缓存后,OOM了。这个时候数据就不一致了。数据库和缓存数据不一致
缓存雪崩问题:当缓存集体失效或者缓存服务器宕机时,那么大量的请求会打到存储层,就可能级联导致存储层雪崩。
缓存穿透问题:当出现大量的缓存miss,流量就会打到存储层,也可能引起存储层的崩溃
缓存击穿问题:当某个热点key过期时,也会有大流量打到存储层,也可能引起存储层的崩溃
三个问题
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发?
这个问题其实是在问技术选型。
当我们使用一项技术的时候,肯定有很多备选项,那么我们应该如何挑选呢?
我们需要分析各个备选项的特性和优缺点,选择最贴合项目需求,社区活跃,符合未来架构,足够的普遍性(降低学习成本)。
特性 | Redis | Memcached |
---|---|---|
线程模型 | 单线程架构 | 多线程架构 |
网络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选举算法选举出领头羊来执行这次故障转移:
- 对从节点slaveof no one
- 对其他从节点执行slaveof 新master
- 记录原master为slave
使用epoch来保证master的正确更新
- 每隔10秒,每个sentinel节点向主节点和从节点发送info命令获取最新的拓扑结构
- 每隔2秒,每个sentinel节点会向redis数据节点的
__sentinel__:hello
频道发送sentinel节点对于主节点的判断以及当前sentinel节点的信息,并且订阅此频道,了解其他节点对主节点的判断 - 每隔1秒,每个sentinel节点会向主节点、从节点、其余sentinel节点发送一条ping命令做一次心跳检测,是否存活。
Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?
特点 | AOF | RDB |
---|---|---|
文件大小 | 存储了每条写命令大于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