草庐IT

redis - Phi 系数用例的键值存储 (Redis)

coder 2023-11-07 原文

我想构建一个应用程序,用户可以在其中将多个标签(字符串)分配给一个日期(YYYY-MM-DD 字符串)。主要用例是计算 Phi coefficient对于两个标签(A 和 B)的组合,需要将每个日期放入以下类别之一:

  1. 都没有分配标签
  2. 分配了标签 A,但未分配标签 B
  3. 分配了标签 B 但未分配标签 A
  4. 已分配标签 A 和标签 B

关键信息是属于每个类别的多少日期,而不是什么日期。

问题是,如何持久保存该数据,以便可以快速查找它以进行上述分类。

使用键值存储(例如 Redis),将标签作为键存储集合,将每个标签的日期作为值存储,这将是一个选项,可以轻松地用新信息填充存储。对于查找,A 和 B 的交集 (SINTER) 将形成第四类,A 和 B 之间以及 B 和 A 之间的差异 (SDIFF) 将分别形成第二类和第三类。

问题仍然存在,如何计算第一类:日期数,标签 A 和 B 均不适用。我想到的唯一选择是通过遍历所有键来读出日期,并从日期总数中减去类别 2、3 和 4 的数量。是否有更优雅、更高效的方式来实现这一目标?还是我最好为该用例使用 SQL 数据库?

编辑:另一个想法是不仅按标签存储日期,而且以冗余方式按日期存储标签,以便更容易检索所有日期。

最佳答案

这里有两种基本方法:以单一规范形式存储数据,并根据需要使用它来计算派生数据;或预先以多种方式存储信息以优化查找速度。

到目前为止,您已经采用了第一种方法。这很好,因为将信息存储在一个地方可以使很多事情变得更简单,并且消除了数据不一致的风险。缺点是计算派生值可能很慢。在您的情况下,您在最好的情况下谈论 O(n) 操作,在最坏的情况下迭代所有键。尽管在使事情变得更复杂之前进行性能测试总是值得的,但我的直觉是您的担心是对的。

将派生数据与规范数据分开存储可让您优化查找性能。你的最后一段建议以多种方式存储相同的信息,但只要你这样做,你还不如存储实际需要的派生值,而不是保留现有的按标签日期的数据结构。

具体来说,我的建议是按日期存储标签,同时单独存储类别 1-4 的计数。每次您记录一个新的(或更改的或删除的)输入值时,您都会更新您的规范数据结构并更新您的计数。您可能可以使用相当简单的 Lua script 以原子方式执行此操作.然后,您可以在 O(1) 时间内访问所需的计数,并确信它们准确地反射(reflect)了基础数据。

关于redis - Phi 系数用例的键值存储 (Redis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57748485/

有关redis - Phi 系数用例的键值存储 (Redis)的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用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

  2. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  3. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  4. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  5. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  6. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  7. ruby - 如何在 Ruby 中获取多维哈希中的键? - 2

    因此,对于普通哈希,您可以使用它来获取key:hash.keys如何获取如下所示的多维哈希的第二维键:{""=>{"first_name"=>"test","last_name"=>"test_l","username"=>"test_user","title"=>"SalesManager","office"=>"test","email"=>"test@test.com"}}每个项目都是唯一的。所以我想从上面得到的键是:first_name,last_name,username,title,officeandemail 最佳答案

  8. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  9. ruby-on-rails - 数组到 ruby​​ 中键值对的散列 - 2

    从一个返回表中所有值的模型中,我如何将其转换为名称值对的散列{column_value=>column_value}例如[{:id=>1,:name=>'first'},{:id=>2,:name=>'second'},{:id=>3,:name=>'third'}]到(指定:id和:name){'first'=>1,'second'=>2,'third'=>3} 最佳答案 你可以用inject在一行中完成:a=[{:id=>1,:name=>'first'},{:id=>2,:name=>'second'},{:id=>3,:na

  10. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

随机推荐