【问题标题】:Redis – Nested hashes vs. string valuesRedis – 嵌套哈希与字符串值
【发布时间】:2016-03-12 02:37:56
【问题描述】:

我需要使用 Redis 缓存访问权限。
访问权限是每个用户(应用程序的用户)、功能(用户可以做的事情)和机器(用户可以执行该功能的机器)。

例如:
UserA,编辑名称,machine1
或者UserB,删除机器,机器40

该应用程序包含大约 1000 个功能、6000 台机器和 300 个用户。
我不确定存储访问权限的最佳方法是什么。

选项 1: 将访问权限存储为单个字符串,如下所示:

redis> set userA_EditName_machine1 true
redis> set userA_EditName_machine2 false
redis> set userB_DeleteMachine_machine40 false

选项 2: 将访问权限存储为嵌套哈希:

redis> hset users:userA:EditName machine1 true
redis> hset users:userA:EditName machine2 false
redis> hset users:userB:DeleteMachine machine40 false

我的应用程序是一个 ASP.Net MVC 应用程序,我正在使用 StackExcahnge.Redis 来处理 Redis。

一种选择比另一种有什么优势吗?

编辑:

应用程序需要检查是否允许用户在某台机器上执行某项操作。 查询如下所示:

选项 1:

redis> get user0_function0_machine1

选项 2:

redis> hget users:user0:function0 machine1

【问题讨论】:

  • 请指定您需要执行的查询 - 这将确定最佳的数据存储方式。
  • @ItamarHaber 我已将查询添加到问题中
  • @thepirat000 感谢您的链接。我去看看。

标签: caching redis stackexchange.redis


【解决方案1】:

您应该考虑将 访问控制列表(附加到用户计算机的权限列表)存储为 redis 哈希。

通过这种方式,您可以查询主题的整个权限集合,或者只查询特定对象的权限。

例如,您有以下用户(主题):

  • 约翰:机器1
  • 约翰:机器2
  • 玛丽:机器1

以下特征(或对象):

  • 编辑名称
  • 删除机器

以及以下权限:

  • Y(已授予访问权限)
  • N(拒绝访问)

您可以使用 key -> field -> value 为每个主题设置一个哈希,如下所示:

ACL:{username}:{machine} -> {object} -> {permission}

因此您可以像这样查询特定对象的权限:

redis> HGET ACL:john:machine2 editname
"Y"

或者查询一个主题的整个权限集合:

redis> HGETALL ACL:john:machine2
1) "editname"
2) "Y"
3) "deletemachine"
4) "N"

当然你可以选择只存储被授予的权限,并默认假设被拒绝的权限。

【讨论】:

    猜你喜欢
    • 2016-06-13
    • 2013-04-28
    • 2018-11-27
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多