gpt4 book ai didi

caching - 在 Redis 中构建这样的数据是否可行且经济?

转载 作者:可可西里 更新时间:2023-11-01 11:34:14 25 4
gpt4 key购买 nike

我有 2 个对象 - 用户和文件。

用户可以是管理员或基本用户。文件可以手动与用户共享,管理员用户无论如何都可以查看所有文件。

我想保留“用户 x 可以查看哪些文件”和“哪些用户可以查看文件 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 => []

所以 user:userid:files:reason-why-user-can-view-files 和 file:fileid:users:< em>用户可以查看文件的原因

因此,当用户删除了他们的管理员访问权限时,我将删除 user:23:files:admin key 并更新 3 个文件 key 以删除该用户 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 => []

最佳答案

如果您认为查询数据库很耗时,并且您可以处理那些应用服务器崩溃(保持状态),那么请使用此解决方案。

为文件列表维护一个单独的集合

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次命中redis的所有 Action 。

编辑:关于内存的观点。除非文件共享给用户,否则集合中不会有条目。在数十万个文件中,将共享给 1000 多个用户的文件数量将非常少。同样,共享超过 1000 个文件的用户也会更少。

因此,您将要使用的大部分集合将占用更少的内存。只有存储所有文件名的集合会占用更多。对 N 个用户和 m 个文件进行一些测试。

您还可以对文件集和用户集使用位级操作。使用 setbit 操作并为该文件中的每个用户 ID 设置位。这样您就可以将集合缩减为一个简单的字符串。这会减少你的一些内存。

关于caching - 在 Redis 中构建这样的数据是否可行且经济?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37632717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com