我抓了几个网站说site1, site2, ...., site100
。我使用代理ips列表来抓取它们,让我们说ip1, ip2, ..., ip10
。每当我从网站抓取任何页面时,请site5
我调用一个函数getProxyFor(site5)
,它给我代理ip,我应该使用site5
来请求页面。 getProxyFor
检查返回代理ip,该代理ip已用于site5
次数最少(我可以使用其他条件,例如代理的年龄或总成功请求数(对所有站点合并)有多少)发送等)。所以基本问题是
从每个都有几个属性的项目列表中,我想选择 查询一个或多个属性的项目
我可以将所有这些数据存储为rdbms,如
IP | Site | Count
ip1 | s1 | 5
ip1 | s2 | 9
ip2 | s2 | 1
并执行select ip from table order by count limit 1
之类的查询(我可以使用限制5,然后检查那些5 ips的年龄和其他东西)。但是,如果我不想使用SQL数据库呢?我应该使用什么数据结构来有效地查询这些数据
答案 0 :(得分:1)
我将redis用于此类功能。具体来说,redis有sorted sets,它可以让你获得使用IP次数最少的能力(假设你使用IP作为密钥分数的次数)。
如果您有一组更复杂的标准用于确定接下来使用哪个IP,您可以通过使其成为条件的函数来计算密钥的分数(假设函数的输出是数字) 。例如。 score = f(last_time_used, latency, number_of_times_used)
此外,redis存储在内存中,因此与SQL相比,快速。