开发者社区> 问答> 正文

redis多对多模型设计

需求如下:
表 A:
ID webId industryId accountToolId status

任务表 B:
ID updateTime url

中间表:C
ID url accountToolId

表 A 为帐号表 表B 为任务表 为对多对关系

也就是A表中的一个帐号可以执行表B中的多条任务, B表中的一个url可以对应表A中的多个url;

要求 表A 中的同一个accountId只能对应表B中的同一个url链接一次,如果有多次的话,寻找新的帐号来填充这个任务;

之前使用数据库方式查询方式来做这个功能,在制定多条任务,效率过低,等待时间过长,本来优化sql,但流程在那,后来放弃了,制定好的任务是一个List,然后对list中同

一个帐号对应同一个链接任务去重,所以放弃了使用数据库查询方式去重;

目前想采用redis 的key,value 寻找新的帐号填充到任务中去;

//  10677 为accountToolId   status industry webId   这些都为帐号表的字段
        jedis.set("10677:status", "0");
        jedis.set("10677:industry", "1");
        jedis.set("10677:webId", "1");  
         
         
        jedis.set("10678:status", "1");
        jedis.set("10678:industry", "51");
        jedis.set("10678:webId", "2");  
         
        jedis.set("10679:status", "1");
        jedis.set("10679:industry", "53");
        jedis.set("10679:webId", "2");
 
 
        jedis.set("10680:status", "1");
        jedis.set("10680:industry", "53");
        jedis.set("10680:webId", "2");
         
         
        //任务链接表  weiboUrl accountToolId  updateTime
        jedis.sadd("weiboUrl:http://weibo.com/1641561812/BECe0nTOA","10677");
        jedis.sadd("weiboUrl:http://weibo.com/1708922835/BECe0nTtK","10677");
        jedis.sadd("weiboUrl:http://weibo.com/1641533697/BECdvklQr","10677");
         
        jedis.sadd("weiboUrl:http://weibo.com/1641561812/BECe0nTOA","10678");
        jedis.sadd("weiboUrl:http://weibo.com/1708922835/BECe0nTtK","10678");
        jedis.sadd("weiboUrl:http://weibo.com/1641533697/BECdvklQr","10678");
         
        jedis.sadd("weiboUrl:http://weibo.com/1641561812/BECe0nTOA","10679");
        jedis.sadd("weiboUrl:http://weibo.com/1708922835/BECe0nTtK","10679");
        jedis.sadd("weiboUrl:http://weibo.com/1641533697/BECdvklQr","10679");
         
        jedis.sadd("weiboUrl:http://weibo.com/1641561812/BECe0nTOA","10680");
        jedis.sadd("weiboUrl:http://weibo.com/1708922835/BECe0nTtK","10680");
 
 
        Set<String> nameSet = jedis.smembers("weiboUrl:http://weibo.com/1708922835/BECe0nTtK");
        Iterator<String> it = nameSet.iterator();
       /**
         * 想法是:这里可以查询出已经使用过该链接的帐号: 然后我们只需要找到not in这些帐号 就行了
         */ 
        while (it.hasNext()) {  
       String str = it.next(); 
       System.out.println(str);
        }  
        System.out.println(jedis.mget("10677:status","10677:industry","10677:webId"));

找到所有使用某一条url的帐号; 然后查询出所有的not in (这条url使用过的帐号) 在sql里是这么理解的

然后设置到任务中去,但是在redis中如何 使用类似not in之类的方法呢 还想问下 这种redis设计方式是否可行,能有比较好的设计吗?

展开
收起
a123456678 2016-06-28 18:03:55 2982 0
1 条回答
写回答
取消 提交回答
  • 多多的关系其实还是可以找到一一对应的关系,设计方案有多种。主要看你的业务场景,比如你经常要查询一个账号下的多个任务,这个是有你可以使用sotedSet结构,以账号作为key,任务id作为value(或者任务对象序列化对象),如果你要经常查询这个任务被谁执行,那么可以使用前缀+任务id作为key,账号作为value。当然,如果您的这些任务是有状态的,您可以使用hash结构。 选择数据结构,我们主要看查询的时候,能够通过支持批量操作的命令,节省连接。比如hmget、zrevange之类,这样查询的时候效率高,设置的尽量采用pipeline,省连接。

    2019-09-25 21:04:35
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
ApsaraDB for Redis——与创客同行 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载