【问题标题】:Is there a way to make a folder-like hierarchy in redis cache?有没有办法在 redis 缓存中创建类似文件夹的层次结构?
【发布时间】:2018-09-29 18:45:38
【问题描述】:

所以我在我的 c# webapi 中使用了 redis 缓存,并且能够实现类似的层次结构将使我的生活更轻松(像这样:

a-> key1
    b-> c ->key2
            key3
        d ->...

)

我的另一种选择是使用键创建树状方法,其中 a 会给我另外 2 个键,一个用于键,另一个用于 b,所以一个(但会一团糟)

【问题讨论】:

  • 我们在这里讨论的是什么类型的音量?或者换一种说法:仅仅存储一个 JSON clob 就足够了吗?您需要执行哪些操作?
  • @MarcGravell 我想为每个客户端设置一个缓存,但每个客户端都有多个租户,所以我希望有类似tenantusers> t1users> jsons 用户列表之类的东西。编辑:请记住,我有一些比租户更高级别的客户信息(所有租户通用)
  • 并且通过“jsons 用户列表”评论,我的 ReJSON 答案看起来更合适:)

标签: c# caching asp.net-web-api redis


【解决方案1】:

如果你使用 redis command 查看你的缓存,你可以使用以冒号分隔的键,例如 set1:subset:subset:key。它不是真正的层次结构,但它在指挥官视图中显示为文件夹。

【讨论】:

    【解决方案2】:

    Redis 支持多种数据类型。对于您的情况,您可以使用Hashes,因为散列中可以有另一个嵌套散列。

    由于 Redis 不支持嵌套数据结构,您可以通过将内部哈希引用存储在外部哈希中来存储它,这样在检索数据时会遇到困难。否则,您可以将分层对象结构创建为 JSON(或者,如果您已经有一个)并将该序列化对象存储在 Redis 中。

    Storing nested objects in Redis

    【讨论】:

    • 是的,我想这将是最接近我需要的。谢谢!
    • “因为一个哈希可以有另一个嵌套的哈希”——不,它不能;哈希严格来说是名称/值,这里的“值”是一个 clob/blob。这将不允许您创建层次结构。
    • @MarcGravell 我的意思是你可以存储另一个哈希的引用
    • @Rahul 你可以存储 key,当然;但是然后a:您需要一种在键和值(叶节点与分支节点)之间消除歧义的方法,并且b:您需要一种导航迭代层次结构的方法,这两个都不是很明显/在这里很容易
    【解决方案3】:

    您在这里尝试做的事情有点超出了redis 想要您做的事情。您可以伪造在键中嵌套键(可能通过散列),但是真的很难使用

    但是!这可能非常适合 redis“模块”(需要 redis 4.*)。特别是,我想知道ReJSON 是否合适。这是为 JSON 使用而设计的,但坦率地说:JSON 是一种分层嵌套的键/值数据类型 - 正是您想要的。只需忽略 JSON 部分 :)

    特别是,ReJSON 允许您通过曾经使用过 XPath 的语法来查询、访问和操作任意节点。

    如何访问 ReJSON 取决于您使用的客户端库。如果您使用的是 SE.Redis,您可能想要使用 db.Execute(command, args) 方法(因为我没有原生公开 ReJSON 绑定)。如果您使用的是“集群”拓扑,请确保 key 作为 RedisKey(而不是 string)传递,以便它知道如何路由它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 2012-09-24
      相关资源
      最近更新 更多