【问题标题】:How to remove an item from Redis set using a property as determination?如何使用属性作为确定从 Redis 集中删除项目?
【发布时间】:2015-09-07 13:48:59
【问题描述】:

当我们使用 servicestack 类型的客户端从 Redis Set 中删除项目时

redisset = typedclient.Sets["setkey"];
redisset.remove(object1);

它通常会检查object1的每个属性,我们如何定义object1的类来检查哪个属性是否相等?

例如,object1 具有这些属性

session_key:"somekey"
session_name:"a name"
author:"Harry"
...

当我们尝试从集合中删除它时,我们只希望它检查 session_key 是否匹配并忽略其他属性。

我以为我曾经在某个地方看到过它,但我再也找不到它了。

【问题讨论】:

    标签: redis servicestack


    【解决方案1】:

    Sets 中的复杂类型被标记为 JSON。所有 Redis 操作都不适用于对 Redis 不透明的 blobbed 值。您需要在客户端检查 Set 中的每个项目,即将其反序列化回一个对象,检查会话密钥,然后删除匹配的条目。

    在服务器上执行此操作的唯一选择是使用自定义服务器端 lua 脚本将 json 解析为 Lua 对象并以这种方式检查属性。

    【讨论】:

    • 感谢您的评论。但为了确保,我的意思是当我尝试使用类型化客户端 set1.remove(item1) 从集合中删除某个项目时,我假设 remove 方法会将 item1 的每个属性与集合成员项目匹配,并且当它找到匹配项时,它将删除它。我要问的是是否有办法让我可以告诉 remove 方法只寻找某个属性的匹配项,而不是所有这些
    • 我还记得在某处看到它,当我定义项目的类时,我可以覆盖一些名为 Equal-something 的方法
    • @shawhu 你在这里混淆了不相关的概念,每件事都需要相同,因为 Redis 正在比较 2 个不透明的 JSON 字符串是否相等。不要与 .NET 类中的重写相等成员混淆,后者只能应用于 .NET 程序,即不能在 Redis 服务器上。
    • 谢谢,知道了!所以你真正要说的是,不管是什么客户端,输入与否,它仍然会将对象序列化为字符串并将其作为字符串值发送到redis服务器以执行SREM。
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多