Json 在redis中存储用户配置文件的更好的数据结构是什么?
我想在redis中存储用户配置文件,因为我必须经常阅读多个用户配置文件。。目前有两种选择: 选项1:-为每个用户的配置文件存储单独的哈希键Json 在redis中存储用户配置文件的更好的数据结构是什么?,json,hash,redis,paging,Json,Hash,Redis,Paging,我想在redis中存储用户配置文件,因为我必须经常阅读多个用户配置文件。。目前有两种选择: 选项1:-为每个用户的配置文件存储单独的哈希键 [hash]-u1配置文件{id:u1,名称:user1,电子邮件:user1@domain.com,照片:url} [哈希]-u2配置文件{id:u2,名称:user2,电子邮件:user2@domain.com,照片:url} 其中,每个用户的id都是哈希键和配置文件字段,以及JSON序列化配置文件对象的值。(或代替json用户字段值对) 选项2:-
- [hash]-u1配置文件{id:u1,名称:user1,电子邮件:user1@domain.com,照片:url}
- [哈希]-u2配置文件{id:u2,名称:user2,电子邮件:user2@domain.com,照片:url}
- 其中,每个用户的id都是哈希键和配置文件字段,以及JSON序列化配置文件对象的值。(或代替json用户字段值对)
- [哈希]-用户配置文件u1{id:u1,名称:user1,电子邮件:user1@domain.com,照片:url}
- [哈希]-用户配置文件u2{id:u2,名称:user2,电子邮件:user2@domain.com,照片:url}
- 其中,在用户配置文件散列键中,用户的ID字段和JSON序列化配置文件对象的值
- 性能:通常取决于您的用例,但假设您想要读取特定用户(登录/注销、授权目的等)。使用选项#1,您只需计算用户哈希并获得用户配置文件。使用选项#2,您需要获取所有用户配置文件并解析json(尽管您可以提高效率,但它永远不会像选项#1那样高效和简单)李>
- 内存利用率:您可以使选项1和选项2在redis中具有相同的大小(在选项1上,您可以避免将散列/用户id存储为json的一部分)。但是,选择相同的示例来加载特定用户,您只需要在代码/内存中加载单个用户配置文件json,而不是包含一组用户配置文件的更大的json
- 读取多个用户的配置文件-对于批处理,我应该能够在同一时间读取1-100101-200个用户的配置文件:对于这一点,正如通常使用关系数据库所做的那样,您需要进行分页。但是使用a是一种在一组用户上迭代的简单方法
- 更大的数据集-如果有数百万用户配置文件会怎么样
如果您“无法拥有比内存更大的数据集”,您可以将其视为。在Redis常见问题解答中,您还可以检查其他指标,如“单个Redis实例可以容纳的最大密钥数”或“Redis内存占用”正如Sergio Tulentsev指出的那样,以任何方式将所有用户数据(尤其是数据集庞大的情况下)存储在一个散列中都是不好的 如果您正在寻找本节中指出的内存优化,那么也不希望将用户数据存储为单个键 使用分页机制读取用户数据需要使用数据库,而不是像redis这样的简单缓存系统。因此,建议为此使用NoSQL数据库,如mongoDB 但是每次从数据库读取数据都是一项代价高昂的操作,尤其是在读取大量记录的情况下 因此,最好的解决方案是在redis中缓存最活跃用户的数据,以消除数据库获取开销 我建议你调查一下 它基本上遵循以下模式:
@cache.cached(timeout=expiry_in_secs)
def function_name(param1, param2, ...., param_n):
# perform database fetch
# return user data
这可以确保经常访问或请求的用户数据在redis中,并且函数会自动从redis返回值,而不是进行数据库调用。此外,如果长时间未访问,则密钥将过期
您可以按如下方式进行设置:
from walrus import *
db = Database(host='localhost', port=6379, db=0)
其中主机可以获取远程运行的redis群集的域名
希望这有帮助。选项1的优点
(但不要使用散列,使用单键。如设置配置文件:4d094f58c96767d7a0099d49{…}
)
- 迭代键的速度略快于迭代散列。(这也是为什么您应该修改选项1以使用
,而不是SET
)HSET
- 检索键值略快于检索哈希字段
- 使用
,您可以在一次呼叫中获得所有用户,但前提是您的用户群不是很大。否则,服务器很难为您提供结果HMGET
- 您可以在一个命令中刷新所有用户。如果您有后台数据库,则非常有用
HSET profiles:<bucket> <id> {json object}
HGET profiles:<bucket> <id>
HMGET profiles:<bucket>
HSET配置文件:{json object}
HGET配置文件:
HMGET配置文件:
最后一个得到一整桶资料的。建议总容量不要超过1mb。可以很好地处理顺序ID,但不能很好地处理哈希,因为它们会增长太多。如果您将其与哈希一起使用,并且其增长过快,从而减慢了Redis的速度,您可以回退到HSCAN
(如选项2)或使用新的哈希函数将对象重新分发到更多的存储桶中
- 更快的批量加载
- 略慢的单对象存储/加载
如果我没有弄错你的情况,我的建议是使用顺序ID范围为100的第三个选项。如果您的目标是大量数据,从第一天开始计划群集从任何标准来看,对所有用户进行一次哈希都不是一个好的解决方案。@SergioTulentsev,感谢您的回复。您对如何按范围/分页读取多个用户配置文件键有何建议?我使用nodejs作为客户端应用程序。扫描+HMGET并以流水线方式发送它们。您需要添加更多详细信息:1)您希望在配置文件中存储多少信息2)w