jjzjj

redis - 过滤 Redis 哈希条目 - 从哈希或集合中删除条目

coder 2023-11-07 原文

我想制作一个系统,根据源站点和国家/地区重定向 http 客户端。 为了决定将它们重定向到哪里,我有一个规则列表。一条规则可能如下所示:

"id":               1,
"sourceSites":      [ 1, 2, 3, 4 ],
"countries":        [ "US", "UK", "DE" ],
"amount":           1000,
"url":              "http://www.buyer2-url1.com"

这样的规则可能有数百条。

为了存储每条规则,我打算使用 Redis 哈希: rule: 金额url

当访问者进入系统时,我想按 sourceSite 和访问者所在的国家/地区过滤规则。 为了实现过滤器,我计划使用 Redis Sets 创建 sourceSites 和国家的索引:

sourceSite:<sourceSiteID> rule:<id1> rule:<id2> ...
country:<countryCode> rule:<id1> rule:<id2> ...

当我有一个来自 country=UK 和 sourceSiteID=5 的访问者时,我只是做两个集合的交集:

SINTER sourceSite:5 country:UK

我不明白的是,当我需要删除规则时(例如,当流量超过规则所需的数量时),我该怎么办?

我是否应该重新创建我所有的集合来创建一个新的 sourceSites 和国家索引?但是,如果访问者在索引尚未准备就绪时来了怎么办?

或者我需要为每个规则存储另外两个集合,其中包含 sourceSites 列表和国家列表,这样我就可以找到索引的所有集合并从中删除规则?

最佳答案

我可能会实现第二个选项并通过使用 Redis 事务来保证一致性。

添加一条规则是:

MULTI
HMSET rule:1 id 1 amount 1000 url http://www.buyer2-url1.com
SADD rule:1:sourceSites 1 2 3 4
SADD rule:1:countries US UK DE
SADD sourceSite:1 1
SADD sourceSite:2 1
SADD sourceSite:3 1
SADD sourceSite:4 1
SADD country:US 1
SADD country:UK 1
SADD country:DE 1
EXEC

删除规则将是:

WATCH rule:1
HGETALL rule:1
SMEMBERS rule:1:sourceSites
SMEMBERS rule:1:countries
MULTI
... sanity check depending on the content of the rule ...
For all source sites S (in rule:1:sourceSites):
   SREM sourceSite:S 1
For all country codes C (in rule:1:countries):
   SREM country:C 1
DEL rule:1:countries
DEL rule:1:sourceSites
DEL rule:1
EXEC

最好只在集合中使用整数(不要用规则给它们加前缀:),这样 Redis 就可以应用内存优化。此外,考虑使用流水线来减少所需的往返次数。

关于redis - 过滤 Redis 哈希条目 - 从哈希或集合中删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13442279/

有关redis - 过滤 Redis 哈希条目 - 从哈希或集合中删除条目的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  3. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  4. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  5. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  6. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  7. 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([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  8. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  9. ruby-on-rails - 标准化文件名的字符串,删除重音和特殊字符 - 2

    我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐