略难的题。一般在大厂的中高级职级面试里面会比较常见,校招和初级岗位比较少考察,
这个问题很容易回答出来,但是不容易刷出亮点。因为基本的做法如槽迁移这种很容易想到,但是你需要有一些特别的骚操作,才能赢得竞争优势。
这里我要先解释一下数据倾斜,数据倾斜一般是指某个地方的数据要比别的地方多。
具体到 Redis 这里,就是 Redis 的某些节点上的数据明显比别的节点多。而正常来说,数据倾斜了,QPS 也倾斜了。所以这些比较多数据的节点,QPS 也会更高。所以这些节点面临 CPU、内存、网络带宽等多方面的问题。
而且,如果是 QPS 很高,业内也把这个问题叫做热点问题。
所有的数据倾斜的解决思路只有一个:分而治之。也就是把这些集中的数据重新打散,分散到别的地方。
那么在 Redis 这里,按照这个思路,可以有很多种解决方案:
手动哈希这个我再举几个例子,假设说你选择的哈希函数叫做 new_hash:
new_hash(user:$id) user:new_hash($id) user:$id:new_hash($id)
这个是非常灵活的,你不要那么死板。注意选择之后数据是否均匀,生成的最终的 key 会不会冲突。
其中,我建议你至少要能回答出来挪走业务数据、槽迁移和增加Redis节点三个。后面的重新设计 key 结构和手动哈希是比较奇诡的做法,但是能刷出亮点,最后的拆分 key 是为了引出解决大 key 的问题。
注意,如果面试官 Redis 如何解决热点问题,你也可以参考这个回答。