我正在尝试建立一个系统,在该系统中,用户发布并被他们的关注者点击的所有链接都存储在 redis 中,以满足以下要求:
能够在一个时间范围内(可以是今天、本周、所有时间或自定义)获得(例如,10%)点击次数最多的链接。
能够查询发布相同链接的所有用户。
由于我们已经使用了很多键,理想情况是我们将所有这些存储在一个 Redis 键中。
如果需要,可以将值编码为 JSON。
这是我到目前为止的想法:
-我使用单个 Redis 哈希,每个字段都是一个小时,因此在一天内,该哈希将包含 24 个字段。
-在每个字段中,我存储一个从数组编码的 JSON,格式为:
array("timestamp1" => array($url1, $url2, ...)
, "timestamp2" => array($url3, $url4, ...)
, ..., ...);
-完整的结构是这个hash:
[01/01/2010 00:00] => JSON(...),
[01/01/2010 01:00] => JSON(...),
....
这样,我可以获得任何时间范围内对任何 URL 的所有点击。
但是,我似乎无法重复使用此散列来获取发布该 URL 的所有用户。
问题是:有没有更好的办法呢?
2011 年 7 月 30 日更新:我目前将分钟、小时、天、周、月和年存储在同一个哈希中。
因此,一次点击会同时存储在多个字段中: - 在现场一分钟(格式 YmdHi) - 在现场工作一小时(格式 YmdH) - 在当天的现场(格式 Ymd) - 本周在外地(格式 YW) - 在月份字段中(格式 Ym) - 在当年的领域(格式 Y)。
就是这样,在尝试获取特定时间范围时,我只能访问必要的字段,而不会循环访问小时数。
比如我需要从07/26/2011 20:00到07/28/2011 02:00的点击,我只需要查询7个字段:1个字段为07/27/2011全天, 07/26 的 20:00 到 23:00 的时间有 4 个字段,然后 07/28 的 00:00 到 01:00 的时间还有 2 个字段
最佳答案
如果你放弃第三个要求,事情就会变得容易得多。许多人似乎认为您应该始终使用散列而不是键,但这源于对一篇关于在特定的有限情况下使用散列来提高性能的帖子的误解。
要获得点击次数最多的链接,请为每小时或每天创建一个排序集,值是链接,分数是使用 ZINCRBY 设置的点击次数。使用 ZCARD 和 ZREVRANGEBYSCORE 获得前 10%。如果集合包含系统中的所有链接,这是最简单的,尽管如有必要,您可以使用一些策略从集合中删除不太受欢迎的项目。
要让所有用户都发布链接,请为每个链接存储一组用户。您可以使用 JSON 和存储链接详细信息的键或散列来执行此操作,但集合使更新和查询更容易。
关于data-structures - Redis 数据结构存储所有链接的所有点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6827788/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_