面试题答案
一键面试处理哈希冲突
- 选择合适的哈希函数:Redis 使用的哈希函数在一般情况下表现良好,但在极端高并发场景,可以考虑定制更适合业务数据分布特点的哈希函数,尽量让数据在哈希表中均匀分布,减少冲突概率。
- 优化哈希表大小:根据预估的数据量和负载因子,合理设置哈希表的初始大小。当哈希表的负载因子过高(Redis 中默认负载因子达到 1 时会进行 rehash),及时进行扩容,以降低冲突的可能性。扩容操作虽然会消耗一定资源,但能显著提升哈希表的性能。
- 链地址法优化:Redis 采用链地址法解决哈希冲突,在高并发下,可以对链表结构进行优化。例如,当链表长度超过一定阈值时,将链表转换为跳表等更高效的结构,以提高查找效率。
合理设置过期时间
- 根据业务场景设置:对于不常变化且允许一定时间内存在缓存的热点数据,设置较长的过期时间,减少频繁查询数据库的开销。例如一些配置信息、商品基本信息等。对于实时性要求较高的数据,如实时交易数据,设置较短的过期时间,保证数据的准确性。
- 避免集中过期:如果大量数据设置了相同或相近的过期时间,在过期时刻可能会导致缓存雪崩,瞬间大量请求穿透到后端数据库。可以在设置过期时间时,添加一个随机的时间偏移量,让过期时间分散开来。
- 使用惰性删除和定期删除结合:Redis 采用惰性删除(访问 key 时检查是否过期,过期则删除)和定期删除(每隔一段时间随机检查一批 key 并删除过期的)策略。在高并发场景下,合理调整定期删除的频率和每次检查的 key 数量,既保证过期 key 能及时被清理,又不会对系统性能产生过大影响。同时,惰性删除要注意不要因为删除操作导致响应时间过长,可考虑异步删除。
- 主动更新缓存:在数据发生变化时,主动更新缓存并重新设置过期时间,而不是等待过期后再更新,这样可以保证缓存数据的一致性和及时性,减少高并发下数据不一致问题。