除了知道它的实际值之外,还有其他方法可以删除列表中的元素吗?

时间:2014-08-22 04:33:26

标签: ruby redis

底部的值编辑。

我更喜欢更强大的解决方案。以下是一种非常黑客的方法。

假设以下内容:

Redis.rpush("list_of_objs", ['{"value": 1, "id: 3}', '{"value": 2, "id": 9}', 
'{"value": 8, "id": 1}', '{"value": 9, "id": 99}', '{"value": 10, "id": 1252}', 
'{"value": 0, "id": 99999}']). 

我现在有一个只有value和id属性的简单json对象列表。

如果你有点好奇,

Redis.lrange("list_of_objs", 0, -1)
#=> ['{"value": 1, "id: 3}', '{"value": 2, "id": 9}', '{"value": 8, "id": 1}', '{"value": 9, "id": 99}', '{"value": 10, "id": 1252}', '{"value": 0, "id": 99999}']

真棒。现在,让我们假设我们要删除'{"value": 8, "id": 1}'。这是通过以下命令实现的:

Redis.lrem("list_of_objs", 1, '{"value": 8, "id": 1}')

如果您再次致电Redis.lrange("list_of_objs", 0, -1),您现在会看到我们已成功删除该元素。

这在某些情况下 ,但事实是,在许多情况下,这并不足够。我不能保证我要删除的内容与我将其放入列表时完全相同。在我决定删除之前,有人可能会选择将'{"value": 8, "id": 1}'更改为'{"value": 22, "id": 1}'。但是,如果我现在尝试删除它,我就搞砸了。同样的命令不起作用。现在,如果我们使用一些Ruby逻辑,我们可以轻松地对其进行排序,但如果你问我,解决方案会变得相当 hacky

现在,这种解决方案的假设是对象中的某个元素(在我们的例子中是id)在对象的整个生命周期内保持不变。

现在,解决方案:

Redis.multi do
  array = Redis.lrange("list_of_objs", 0, -1)
  index_of_element_to_be_destroyed = array.index { |el| JSON.parse(el)["id"] == 1 }
  element = Redis.lindex("list_of_objs", index_of_element_to_be_destroyed)
  Redis.lrem("list_of_objs", 1, element)
end

删除1个元素似乎有些麻烦。我非常确定在multi中执行此操作,我可以安全地从索引中通过某些内容进行更改。

编辑1:实际上,我很确定上述内容可能无法正常工作。我不确定是否允许我在array.index区块中执行Redis.multi之类的红宝石。

编辑2:也许我在Ruby中删除,然后只重新rpush数组?我想避免这种情况。

编辑3:This question似乎包含有价值的信息,但如果我真的希望使用loopwatch,那么我认为这比我预料到了。

话虽如此,是否有更好的方法根据某些条件删除列表中的元素?

0 个答案:

没有答案