Redis – 嵌套哈希与字符串值

Redis – Nested hashes vs. string values

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

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

该应用程序包含大约 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

您应该考虑将访问控制列表(附加到用户计算机的权限列表)存储为 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"

当然你也可以选择只存储授予的权限,默认为拒绝的权限。