Redis - 嵌套哈希值与字符串值

时间:2016-03-11 16:18:13

标签: caching redis stackexchange.redis

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

例如:
UserA,编辑名称,机器1 或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

1 个答案:

答案 0 :(得分:1)

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

这样,您可以查询主题的整个权限集,或只查询特定对象权限。

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

  • john:machine1
  • john:machine2
  • mary:machine1

以下功能(或对象):

  • editname
  • deletemachine

以下权限:

  • Y(获得访问权限)
  • N(拒绝访问)

您可以使用键 - >>为每个主题创建一个哈希值字段 - >值如下:

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"

当然,您可以选择仅存储已授予的权限,并默认采用拒绝权限。