底部的值编辑。
我更喜欢更强大的解决方案。以下是一种非常黑客的方法。
假设以下内容:
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似乎包含有价值的信息,但如果我真的希望使用loop
和watch
,那么我认为这比我预料到了。
话虽如此,是否有更好的方法根据某些条件删除列表中的元素?