面试题答案
一键面试缓存分片
- 按用户ID分片:根据用户ID的哈希值,将用户相关数据均匀分配到不同的缓存节点上。这样可以保证每个节点的数据负载相对均衡,例如使用
hash(user_id) % num_nodes
的方式,num_nodes
为缓存节点数量。 - 按游戏场景分片:对于不同游戏场景的数据,如主城、副本等,分别存储在不同的缓存分片上。这能提高缓存读取的针对性,减少不必要的数据传输。
分布式缓存的使用
- 选择合适的分布式缓存框架:如Redis Cluster,它支持自动分片,具备高可用性和可扩展性。通过多节点并行处理,能有效应对大规模的缓存请求。
- 数据一致性:采用异步复制的方式,保证数据在各个节点之间的最终一致性。在数据更新时,先在主节点更新,然后异步复制到从节点,在短时间内可能存在数据不一致,但最终会达到一致。
缓存预热
- 启动时预加载:在服务器启动阶段,预先加载热门数据到缓存中。例如,将排名靠前的玩家数据、热门游戏道具等加载进来,减少用户首次访问时的等待时间。可以从数据库中批量读取数据,然后写入缓存。
- 定时刷新:设定定时任务,定期重新加载缓存中的数据,确保数据的实时性。比如每小时刷新一次热门玩家的排行榜数据。
缓存穿透解决方案
- 布隆过滤器:在查询缓存之前,先通过布隆过滤器判断数据是否存在。布隆过滤器是一种概率型数据结构,能快速判断一个元素是否在集合中。如果布隆过滤器判断不存在,则直接返回,不再查询数据库,避免无效查询穿透到数据库。
- 空值缓存:当查询数据库也没有找到对应数据时,将空值也缓存起来,并设置一个较短的过期时间。下次相同查询直接从缓存返回空值,防止持续穿透到数据库。
缓存雪崩解决方案
- 分散过期时间:避免大量缓存数据在同一时间过期。对每个缓存项设置一个随机的过期时间,例如在原本过期时间基础上加上或减去一个随机值(如1 - 10分钟的随机数),使得缓存过期时间分散,降低缓存同时失效的风险。
- 搭建多级缓存:采用本地缓存(如Guava Cache)和分布式缓存(如Redis)相结合的方式。当分布式缓存失效时,先从本地缓存获取数据,减轻数据库的压力,给分布式缓存重新加载数据争取时间。