redis多对多模型设计

liuwangpan 发布于 2015/01/09 17:45
阅读 1K+
收藏 0
需求如下:
表 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设计方式是否可行,能有比较好的设计吗? 

加载中
0
零下三度
零下三度

1.我所在的公司主要使用redis做缓存,RDBMS不能省掉,我们用的是mysql,我觉得就算你要使用redis也还是使用RDBMS

2.redis操作中我没使用过not in 之类的操作,应该是没有的。关于命令你可以参考一下redis中文社区。

3.多多的关系其实还是可以找到一一对应的关系,设计方案有多种。主要看你的业务场景,比如你经常要查询一个账号下的多个任务,这个是有你可以使用sotedSet结构,以账号作为key,任务id作为value(或者任务对象序列化对象),如果你要经常查询这个任务被谁执行,那么可以使用前缀+任务id作为key,账号作为value。当然,如果您的这些任务是有状态的,您可以使用hash结构。

选择数据结构,我们主要看查询的时候,能够通过支持批量操作的命令,节省连接。比如hmget、zrevange之类,这样查询的时候效率高,设置的尽量采用pipeline,省连接。

希望我的回答对你有用

返回顶部
顶部