当前位置: 首页 > 知识库问答 >
问题:

在Redis上存储JSON数据作为值的一个键更好,还是存储单个值的多个键更好?

薛修能
2023-03-14

为了保存数据,我将使用一个SET操作,即:

$redis->set("MyKey-UserID", '{"clicks":123,"downloads":1234,"views":123}');

然后,为了更新数据,我将使用两个操作(GET+SET),即:

$array = json_decode($redis->get("MyKey-UserID"), true);

$array['clicks']++;
$array['downloads']++;
$array['views']++;

$redis->set("MyKey-UserID", json_encode($array));

选项2:单值多键

$redis->set("MyKey-UserID-Clicks", 123);
$redis->set("MyKey-UserID-Downloads", 1234);
$redis->set("MyKey-UserID-Views", 123);
$redis->incr("MyKey-UserID-Clicks");
$redis->incr("MyKey-UserID-Downloads");
$redis->incr("MyKey-UserID-Views");

我对方案1的赞成/反对意见

备选方案1优点:

  • 更好的数据库组织,因为每个用户只有一个密钥
  • 通过一个GET操作,我将拥有所有JSON数据
  • 要更新所有JSON字段,我将只使用两个操作(GET+SET)
  • 数据库的文件大小将更小
    null

如果希望并发修改JSON负载(非原子读取-修改-写入的典型问题),选项1不是一个好主意

我们有很多并发连接,所以也许选项2是赢家。

共有1个答案

后树
2023-03-14

如果您需要更新单个字段并重新保存它,选项1并不理想,因为它不能正确处理并发写入。

您应该能够在Redis中使用hash,并使用HINCRBY增加散列中的单个键。将它与管道结合起来,在更新多个键时,您将只向Redis发出一个请求。

可以使用HGETALL获取散列中的所有键/值对。

 类似资料:
  • 每个上传类别有多个s3桶,还是一个带子文件夹的桶,还是一个链接的s3桶更好?我确信用户图像会比剖析图片多,每个桶有5TB的限制,每个账户有100个桶。我正在使用aws boto库和https://github.com/amol-/depot 我的文件夹的结构是以下哪种方式? 最后一个意味着它实际上是一个10TB的存储桶,当bucket_1中的文件超过5TB时,就会创建一个新的存储桶。但所有上传的内

  • 我正在为一个项目制作购物车脚本。购物车已经创建,但现在我正在查询购物车中的产品插入订单表的位置。但是当我这样做的时候,每个产品都有自己的,有没有可能给购物车中的每个产品相同的? 将产品插入订单表的查询: SQL查询如下: 我希望有人能给我一些建议, 提前感谢!

  • 我今天面试了,我的面试官问我如何在HashMap中存储具有相同键的多个值?她给了我这个例子—— 我在如何使用HashMap时给了她以下解决方案: 整数是字符串的长度,ArrayList将存储该特定长度的字符串。 面试官说这是使用HashMap的一种方式,但还有另一种方式我不需要ArrayList或任何其他数据结构。在面试期间,我无法想出任何解决方案,现在在谷歌搜索了足够多之后,我仍然一无所获。有人

  • 我正在为我的应用程序创建一个简单的活动流。 用户执行操作,活动直接存储在MYSQL中的“activities”表中,并返回唯一的“activity_id”。 从数据库中检索该用户的“followers”的数组,并且对于每个followers我将这个新的activity_id推入Redis中的列表。 当用户查看他们的流时,我根据他们的用户ID从redis检索活动ID的数组。然后,我执行一个简单的MY

  • 问题内容: 说我有以下内容及其对应的内容,它们代表一个。 请注意,可能是不同的(,,,引用到任何-其他对象,等等)。 将会有很多(至少> 100,000)。当所有这四个(实际上是)放在一起时,每个都会。换句话说,不存在与所有4个相同的事物。 我试图找到一个高效的数据结构,这将让我(商店)获取基于其中任何一项的时间复杂度。 例如: 的调用方式如下: 以上应该返回 以上应该返回 而且,将来我可能需要在

  • 问题内容: 我有一些产品数据需要在Redis缓存中存储多个版本。数据是JSON序列化的。获取纯(基本)数据的过程非常昂贵,将其自定义为不同版本的过程也很昂贵,因此我想缓存所有版本以尽可能进行优化。假设自定义基于单个参数,我可以将该参数用作缓存键的一部分。 我计划用来检索产品数据的过程是这样的: 一切都很好,但是我现在正在尝试找出在基础数据源发生更改时使缓存数据无效的最佳方法。如果基本产品信息发生变