【问题标题】:How should I store JSON in redis?我应该如何将 JSON 存储在 redis 中?
【发布时间】:2021-11-09 16:23:51
【问题描述】:

我有 JSON (

设置

var images = JSON.parse(data);          // data is already JSON, is this needed?
callback(images);                       // sends result to the user
r.set('images:' + req.query, images);   // saving the object

获取

callback(images);

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    您可以将 JSON 作为专用键(或集合/列表的成员/值)或 hash 结构中的纯字符串存储在 redis 中。如果您查看node_redis docs into Friendlier hash commands 部分,您会发现它为您提供了一些有用的方法来处理基于 JSON 的数据。这种方法的优点是它允许您仅获取/设置原始对象的一部分,并且与纯字符串相比,它还可以consume less memory

    【讨论】:

    • 谢谢!看起来哈希结构的缺点是检索要慢得多,因为您必须遍历每个字段才能重建原始字段。
    • 您可以使用 HGETALL 命令检索整个哈希,虽然它的时间复杂度是 O(n),但我认为只有大量的字段/值对才会明显影响性能。
    • 如果我剥离所有 json 键并将值存储为 csv 纯字符串会发生什么,这不是最快的方法,例如而不是存储 {name: "John", age: 42}以字符串化格式,我存储“John,42”
    【解决方案2】:

    RedisJSON 模块允许从 Redis 键存储、更新和获取 JSON 值。

    它向 Redis 添加了新的 JSON 数据类型和命令,可以像访问任何其他 Redis 本机命令一样访问它们。

    例如

    > JSON.SET user1 $ '{"name":"Ron Dan", "lastSeen":1478476800, "loggedOut": true}'
    OK
    
    > JSON.GET user1 $.name
    "[\"Ron Dan\"]"
    
    > JSON.NUMINCRBY user1 $.lastSeen 100
    "[1478476900]"
    

    【讨论】:

      【解决方案3】:

      你可以使用这个库redis-json

      示例用法示例:

      import Redis from 'ioredis';
      import JSONCache from 'redis-json';
      
      const redis = new Redis();
      
      const jsonCache = new JSONCache(redis)
      
      const user = {
        name: "test",
        age: 21,
        gender: "male"
      }
      await jsonCache.set('123', user)
      
      const result = await jsonCache.get('123')
      

      这个库将 json 存储在 Hash 集中。

      它还支持单个或一组键的检索,即

      await jsonCache.get('123', "age", "name")
      

      【讨论】:

      • 好像出了点问题(node:63245) UnhandledPromiseRejectionWarning: TypeError: redis_json_1.default is not a constructor
      • 我已经用 redis-json 搞砸了 3 天,现在把它扔掉了。无法摆脱 redis_json_1.default 不是构造函数问题。该库还可以使用巨大的 json(5MB 机场列表)来减慢速度,因为它会使数据变平。可以使用redis对象直接存储和获取数据。只需编写 await redis.set('key',JSON.stringify(data)) 来存储数据并 await redis.get('key') 再次检索 json 字符串。就这么简单。
      【解决方案4】:

      这就是我在redis缓存中存储json的方式

       Models.Student.findAll({
              where: {
                  id : req.params.id
              }
          }).then(doc => {
              client.setex(req.params.id, 3600, doc);
              res.send(200, doc);
          }).catch(err =>{
              console.log(err);
              res.send(400, err);
          });
      

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 2017-12-07
        • 2020-02-16
        • 1970-01-01
        • 2016-12-11
        • 2015-09-16
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多