略难的题,在社招中会遇到,一般在中高级岗位中考察较多。
这个问题是包含两层意思:怎么知道有大 key,知道了怎么解决。
回答这个问题,最好就是能引出一个具体的案例,然后借助这个案例来刷亮点。
所谓的大 key,不是指 key 本身很长,而是指值很大,比如说一个巨大的 JSON 串,一个巨大的 zset,list 等。大 key 一般会引起数据倾斜、QPS 倾斜等问题。或者说大 key 有极大的可能是热点 key,并发极高。
在这之前,你可以先看这些问题,它们有些类似,但是又很不同:
大 key 其实就有一个解决方案,分而治之。也就是拆分 key。比如说原本一个 key 对应的 list,放了 100w 数据,那么可以拆成 100 个 key,每个 key 只有 1w 数据。
你在 Redis 这个场景下,要考虑不同的数据结构分 key 怎么分,假定这里都是分成 10 个key。基本的拆分思路有两个:
除了这些通用的拆分方法,还有一些独特的拆分方法:
而后,你要关注的就是拆分后怎么解决具体的业务问题了。
而这里,也有一个拆分 key 的典型的案例,你可以查看:Redis 数据结构:榜单问题之 zset 拆分解决方案。这个案例能够体现出拆分 key 之后额外引入的复杂度。
这里也有一些例外,比如说存储大 JSON 串的时候,可以考虑用哈希结构来优化,你可以参考这个案例:Redis JSON 串转哈希存储。核心思想也是分而治之,只不过是将存取一个完整的 JSON 串改为操作部分 key 而已。