缓存

9664 分钟interview-questions

缓存

Q:为什么学 redis?是否了解其他分布式缓存技术?

A:嗯因为 redis 本身是一个性能非常高的内存数据库,有丰富的数据结构,功能也非常强大,既能做缓存也能做消息队列、分布式锁等,使用起来也很方便,正好在项目中也有这方面功能实现的需求,所以我就选择了 redis,目前只是简单学了一下它的使用,底层我还在学习中,现在主要是用它来做项目里的房间状态缓存和游戏事件的快速推送;另外我也了解过其他的分布式缓存技术,比如说 Memcached,它是一个高性能的分布式内存对象缓存系统,主要用于加速动态 Web 应用程序,通过减轻数据库负担来提高性能 ,但它不支持数据持久化和复杂的数据结构,只适合简单的请求缓存

Q:讲一下 redis 的缓存雪崩,击穿和穿透以及解决方法

A:缓存穿透是指用户频繁请求不存在的数据,每次都无法在缓存中命中,又直接打到了数据库,这个主要是要对请求参数做合法校验,比如用布隆过滤器,或者直接存一个空值并设置较短的 TTL,这样就可以缓解数据库压力;缓存击穿主要是指某个热点 key 恰好在高并发时刻过期,导致大量并发请求无法命中缓存,同时击穿到数据库做查询或写入,瞬间击垮后端,这个主要要设置热点 key 的过期时间为随机值,也可以使用互斥锁来加锁,只有一个请求能去查询数据库,其他请求等待结果,或后续并发复用同一个结果;缓存雪崩就是指大量缓存,比如整个 redis 实例或大批 key 在同一时间点集中到期,或 redis 整体不可用,导致所有请求都到数据库,形成雪崩式的流量冲击,这个主要是要设置不同的过期时间,避免同一时间点集中到期,同时也可以使用多级缓存,比如在业务进程内做一层 LRU,让热点数据优先走本地,或采用 redis 集群和限流降级

Q:redis 的 QPS,单机顶不住,该怎么办

A:当我发现单机 redis 达到 QPS 瓶颈后,首先会在实例内排查慢命令,避免全表扫描并使用批量写入、单条原子增量命令代替多条写入,同时在应用层加进程级本地缓存来减少对 redis 的打击,如果单机硬件已升级到极限,就要使用主从复制和读写分离,把写请求集中到主节点,读请求分给多个从节点,然后做自动路由,随着业务继续扩张的话就要考虑部署 redis cluster,把数据分片到多个主节点,每个再配从节点做高可用,Cluster 模式下节点宕机能自动故障切换,扩缩容也更灵活