Redis Hash 应用的一个查询问题,请各位前辈指点。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Neagle
V2EX    Redis

Redis Hash 应用的一个查询问题,请各位前辈指点。

  •  
  •   Neagle 2016-01-13 22:32:24 +08:00 5065 次点击
    这是一个创建于 3560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前刚接触 Redis ,客户端用的 Python ,用于爬虫爬取的数据储存。
    我准备在 redis 中用 hash 数据类型储存爬取的文章,主要结构为 artical:id 作为 key , 文章 title 文章链接 ulr 文章加入时间等作为 field 字段。
    我在新插入文章的时候需要判断已有的文章里面是否已经有这篇文章了,通常通过 url 或者 title 来判断,但是我目前除了逐个遍历 key 然后逐个遍历其 title 字段来判断感觉很不合理,请问有没有其他操作方式,谢谢。

    5 条回复    2016-01-14 12:19:15 +08:00
    MiskoLee
        1
    MiskoLee  
       2016-01-14 09:37:22 +08:00   1
    首先,你得有索引的概念。

    通常的,在你的设计中, url 与 title 的概念其实对应的是数据库理论中的唯一键,我们都知道 MYSQL 要做到某个字段唯一,那么需要添加 unique index 索引。

    redis 作为一个非完全的数据库,是没有完整的数据库理论中的这些概念,这就要求我们自己来实现。

    redis 实现一个索引也是简单的。按照题主的需求,我们完全可以构建这样的索引:

    artical:index:url:${url} id url 索引
    artical:index:title:${title} id title 索引

    aritical:index 为索引前缀
    :url :title 为索引名
    ${url} ${title} 为索引值
    id 对应 artical:id 的值

    然后我们可以用 url > title 的优先级顺序来做索引查询。


    在 redis 这个特例中,为了解决原子性的问题,我们需要使用 pipeline 模式来模拟事务。
    xiamingchong
        2
    xiamingchong  
       2016-01-14 09:40:50 +08:00
    将所有的标题放到 set 里,用 SISMEMBER 来判断是否存在
    Zuckonit
        3
    Zuckonit  
       2016-01-14 09:42:21 +08:00
    楼上说的很详细。简单说一下: nosql 里面查询必然没有 mysql 灵活, nosql 查询只认一个东西 key 。把查询条件映射到 key 即可。
    MiskoLee
        4
    MiskoLee  
       2016-01-14 10:04:11 +08:00
    @xiamingchong 能够满足需求,但是有信息丢失,比如系统需要扩展一下功能:

    在 URL 冲突的时候,我想获取下冲突时间,犹豫 artical:id 这个属性的信息丢失,没法方便的计算。
    xiamingchong
        5
    xiamingchong  
       2016-01-14 12:19:15 +08:00
    @MiskoLee 那就用一楼的方法好了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5496 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 07:34 PVG 15:34 LAX 00:34 JFK 03:34
    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