指南针Java开发一面面经
《面试题目》
- 项目难点
- 你们系统的实际使用人数,有并发问题吗?
- 使用redis处理过什么问题?选择什么数据结构?
- 排行榜的zset里的score可以重复吗?
- 线上redis存在一个巨大的hash,比如1000万字段,每一小时需要全量读取做计算,如何保证不卡死?不影响其他业务?
- 实习实际的Redis是单机还是集群?
- 比如有量特别大的数据,把redis当数据库使用的时候,单机和集群有什么区别?
- 假设从数据库读数据写到redis中,集群的替代方案?
- 对于 1w 条数据,如果排序逻辑特别复杂,而且用户还要勾选过滤,怎么实现?
《参考解析》
1. Redis ZSet特性:ZSet的member是唯一的(类似Set),但score可以重复。这使得它非常适合做排行榜,处理分数相同的情况。
2. Redis大Key处理:千万级Hash一次性读取会导致阻塞。应使用 HSCAN 命令通过游标分批遍历,避免阻塞主线程;如果是统计需求,应考虑在业务层面进行拆分(如按天、按ID分片)。
3. 单机 vs 集群:单机和哨兵模式受单机内存限制,存储能力有限;集群模式通过分片(Slot)将数据分布在不同节点,突破了单机内存瓶颈,并实现了横向扩展与写压力分流。
4. 复杂排序与过滤实现:针对复杂逻辑,后端应预先计算好结果存入ZSet(按分数排序)。勾选过滤条件时,利用Redis的 SINTER(交集)或 ZINTERSTORE 对条件集合与结果集取交集,再分页获取,保证查询响应性能。