我有2个对象 - 用户和文件。
用户可以是管理员或基本用户。文件可以与用户手动共享,管理员用户无论如何都可以查看所有文件。
我想保留“用户可以查看哪些文件”和“哪些用户可以查看文件x”的缓存。
问题是如果user23是管理员,并且您将该用户更改为基本用户,他们将无法访问某些文件 - 但如果文件也已手动与user23共享,则应保持访问权限。
那么这样的结构怎么样:
user:23:files:admin => [1,2,3]
user:23:files:shared => [2]
file:1:users:admin => [23]
file:2:users:admin => [23]
file:3:users:admin => [23]
file:1:users:shared => []
file:2:users:shared => [23]
file:3:users:shared => []
所以用户: userid :files: reason-why-user-can-view-files 和file: fileid :users:< EM>原因-为什么用户灿视图文件
因此,当用户删除了管理员权限时,我会删除user:23:files:admin
密钥并更新3个文件密钥以删除该用户ID。
我需要支持数十万个文件,所以有没有一种有效的方法可以从redis中的文件列表中删除用户ID?
或者有更好的方法来构建数据吗?
在上面的示例中,user23仍然可以访问file2,因为它已经与他手动共享。这将是结果:
user:23:files:admin => []
user:23:files:shared => [2]
file:1:users:admin => []
file:2:users:admin => []
file:3:users:admin => []
file:1:users:shared => []
file:2:users:shared => [23]
file:3:users:shared => []
答案 0 :(得分:0)
如果您认为查询数据库非常耗时并且可以处理这些应用服务器崩溃(维护状态),那么请使用此解决方案。
为文件列表维护一个单独的集合
Sadd files 1 2
为管理员用户维护一个单独的设置
Sadd admin_users 1 2
每个文件的集合,包含共享用户ID
Sadd File:1 1 3
Sadd File:2 1 4
和每个用户的集合,包括与他们共享的文件。
Sadd User:1 1 2
Sadd User:3 1
Sadd User:4 2
此处第二个用户没有条目,因为没有文件共享给他。
如果用户请求文件,如果他在管理员设置允许或者查找文件集。
向用户显示可访问文件,如果他在管理员集中,则显示所有文件,或者从用户集中获取该文件。
如果文件有更新,请说它是新用户共享的,或者删除了用户需要在用户设置和文件集中处理它们。
如果有人被提升为管理员或被删除,请在管理员设置中处理它。
通过这种方式,您可以通过1次或2次点击来实现所有操作。
编辑:关于内存透视。除非直到文件被共享给用户,否则不会成为该集合中的条目。在数十万个文件中,将向超过1000个用户共享的数字文件将非常小。类似地,共享超过1000个文件的用户也将更少。
因此,您将要使用的大部分集合将占用更少的内存。只有存储所有文件名的集合才会占用更多。对N个用户和m个文件进行一点测试。
您还可以对文件集和用户集使用位级操作。使用setbit操作并为该文件中的每个用户ID设置位。这样您就可以将集合简化为一个简单的字符串。哪会减少你的记忆力。