Json 在redis中存储用户配置文件的更好的数据结构是什么?

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:-

我想在redis中存储用户配置文件,因为我必须经常阅读多个用户配置文件。。目前有两种选择:

选项1:-为每个用户的配置文件存储单独的哈希键

  • [hash]-u1配置文件{id:u1,名称:user1,电子邮件:user1@domain.com,照片:url}
  • [哈希]-u2配置文件{id:u2,名称:user2,电子邮件:user2@domain.com,照片:url}
  • 其中,每个用户的id都是哈希键和配置文件字段,以及JSON序列化配置文件对象的值。(或代替json用户字段值对)
选项2:-使用单个哈希键存储所有用户配置文件

  • [哈希]-用户配置文件u1{id:u1,名称:user1,电子邮件:user1@domain.com,照片:url}
  • [哈希]-用户配置文件u2{id:u2,名称:user2,电子邮件:user2@domain.com,照片:url}
  • 其中,在用户配置文件散列键中,用户的ID字段和JSON序列化配置文件对象的值
请告诉我,考虑以下因素,哪种选择是最好的:

  • 演出
  • 内存利用率
  • 读取多个用户的配置文件-对于批处理,我应该能够同时读取1-100101-200个用户的配置文件
  • 更大的数据集-如果有数百万用户,该怎么办
  • 选项1

    • 性能:通常取决于您的用例,但假设您想要读取特定用户(登录/注销、授权目的等)。使用选项#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
    • 检索键值略快于检索哈希字段
    方案2的优点
    • 使用
      HMGET
      ,您可以在一次呼叫中获得所有用户,但前提是您的用户群不是很大。否则,服务器很难为您提供结果
    • 您可以在一个命令中刷新所有用户。如果您有后台数据库,则非常有用
    方案3的优点 选项3是将用户数据拆分为散列桶,散列桶由用户id的散列值确定。如果您有许多用户,并且经常进行批处理,则效果很好。像这样:

    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