阿里面试, redis 里存有 10 亿键值对,找出一个指定前缀的所有键,说出实现原理。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
linxiaoziruo
V2EX    Java

阿里面试, redis 里存有 10 亿键值对,找出一个指定前缀的所有键,说出实现原理。

  •  
  •   linxiaoziruo 2020-07-25 19:37:50 +08:00 5027 次点击
    这是一个创建于 1907 天前的主题,其中的信息可能已经有所发展或是发生改变。
    18 条回复    2020-07-7 11:33:31 +08:00
    ruanimal
        1
    ruanimal  
       2020-07-25 21:24:27 +08:00
    前缀树?不然只能遍历吧
    wangyzj
        2
    wangyzj  
       2020-07-26 00:44:35 +08:00
    他是让你造 java 代码的火箭
    还是让你造 redis 内部数据结构的火箭啊?
    izzy27
        3
    izzy27  
       2020-07-26 09:19:08 +08:00
    倒排?
    SingeeKing
        4
    SingeeKing  
    PRO
       2020-07-26 10:39:19 +08:00
    官方做法就是遍历所有键
    https://redis.io/commands/keys
    https://github.com/redis/redis/blob/unstable/src/db.c#L630

    自己实现的话,之前我遇到这个需求时做法是用另一个键存。比如存了 a::b::c 和 a::b::d,就在 a::b 中存储 c 和 d
    linxiaoziruo
        5
    linxiaoziruo  
    OP
       2020-07-26 11:49:52 +08:00 via Android
    @SingeeKing 有个 scan 命令
    jeffh
        6
    jeffh  
       2020-07-26 14:01:05 +08:00
    scan 遍历吧,具体 scan 内部是不是遍历就不清楚了
    useben
        7
    useben  
       2020-07-26 17:12:01 +08:00
    前面的在答什么。。。
    gabon
        8
    gabon  
       2020-07-26 21:09:15 +08:00 via Android
    scan,之前有个 Redis key 迁移的场景就是用的 scan,axxx-》 bxxx
    hangszhang
        9
    hangszhang  
       2020-07-26 21:40:40 +08:00
    这还能怎么办?sacn 啊
    linxiaoziruo
        10
    linxiaoziruo  
    OP
       2020-07-27 09:11:35 +08:00 via Android
    scan 都知道,关键是 scan 怎么实现大数据查找的,面试官想问 scan 的原理,本质是想知道我有没有看过 scan 的源码。
    BlackwithBrown
        11
    BlackwithBrown  
       2020-07-27 09:47:38 +08:00
    scan 0 MATCH X* COUNT 1000
    遗憾的是 redis 的底层也是先根据游标遍历再根据 match 筛选的
    Aresxue
        12
    Aresxue  
       2020-07-27 10:45:15 +08:00
    自己设计结构的话仿照 mysql 的索引使用 B+树去处理,多层 hash,这样速度会有提升,但索引本身是一份冗余数据,相当于空间换时间了
    palmers
        13
    palmers  
       2020-07-27 10:53:41 +08:00
    我觉得这道题就是简单的考察 redis 命令 scan 以及 scan 大致的原理 就是利用游标什么的 就是具体怎么使用的 这样基本应该可以及格了 深层次应该不会是主要考察点 否则就是不是应用了 但答对了 肯定是加分不少
    linxiaoziruo
        14
    linxiaoziruo  
    OP
       2020-07-27 10:55:24 +08:00
    @palmers 只是考察 scan 的话就没必要特意加上 10 亿数据这个前提,还着重跟我确认 10 亿数据。
    palmers
        15
    palmers  
       2020-07-27 11:08:12 +08:00
    @linxiaoziruo 对啊 数量级大 是应该用 scan 啊 否则 keys 会阻塞 业务会受影响
    acainiao
        16
    acainiao  
       2020-07-27 11:19:05 +08:00 via iPhone
    n 叉树,每个节点最多 26 个字节点,可以确保常数事件
    IMXT
        17
    IMXT  
       2020-07-27 11:31:21 +08:00 via Android
    tire
    portlet
        18
    portlet  
       2020-07-27 11:33:31 +08:00
    字典树
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     908 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 21:11 PVG 05:11 LAX 14:11 JFK 17:11
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86