当前位置: 首页 > 面试题库 >

Redis如何存储关联数组?设置还是散列还是列表?

岳阳飙
2023-03-14
问题内容

我对Redis的所有可用存储选项有些困惑。我想做一些简单的事情,我不想过度设计。我正在与phpredis和合作Redis v2.8.6

我有一个需要存储的简单关联数组。我还需要能够通过其键检索一个项目并遍历所有项目。

$a = array(
    '12345' => array(
        'name' => 'Post A',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    ),
    '54321' => array(
        'name' => 'Post B',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    ),
    '998877' => array(
        'name' => 'Post C',
        'val2' => 'blah blah',
        'val3' => 'blah blah blah',
    )
);

所以到目前为止,我一直在使用hashtype。像这样存储我的数组:

foreach ($a as $key => $value) {
    $this->redis->hSet('posts', $key, json_encode($value));
}

这样,我可以像这样轻松访问密钥:

public function getPost($postId)
{
    return json_decode($this->redis->hGet('posts', $postId), true);
}

// This is returning the information of Post A
$post = getPost(12345);

但是现在我需要遍历所有我不知道如何做的帖子,以及是否可以使用我当前的结构来完成。我不知道是否需要将所有内容存储post_id在另一个列表中才能遍历所有帖子?

所以我的问题是我应该使用哪种数据类型来存储我的帖子列表,从而允许我通过ID来获取单个帖子并遍历所有帖子?

谢谢马克西姆


问题答案:

您可以结合使用SET,Hash和SORT

redis 127.0.0.1:6379> HMSET TEST_12345 name "Post A" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_54321 name "Post B" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> HMSET TEST_998877 name "Post C" val2 "Blah Blah" val3 "Blah Blah Blah"
OK
redis 127.0.0.1:6379> SADD All_keys TEST_12345 TEST_54321 TEST_998877
(integer) 3
redis 127.0.0.1:6379> HGETALL TEST_12345

获取一个哈希:

redis 127.0.0.1:6379> HGETALL TEST_12345
1) "name"
2) "Post A"
3) "val2"
4) "Blah Blah"
5) "val3"
6) "Blah Blah Blah"

获取所有哈希

redis 127.0.0.1:6379> SORT All_keys BY nosort GET *->name GET *->val2 GET *->val3
1) "Post A"
2) "Blah Blah"
3) "Blah Blah Blah"
4) "Post B"
5) "Blah Blah"
6) "Blah Blah Blah"
7) "Post C"
8) "Blah Blah"
9) "Blah Blah Blah"

如果您不想使用排序,则可以使用 SMEMBERS 从SET中获取所有键名,然后使用Redis Pipeline来获取所有键



 类似资料:
  • 问题内容: PHP将所有数组视为关联数组,因此没有任何内置函数。谁能推荐一种相当有效的方法来检查数组是否仅包含数字键? 基本上,我希望能够区分以下两者: 和这个: 问题答案: 您问了两个不完全相同的问题: 首先,如何确定数组是否只有数字键 其次,如何确定数组是否具有从0开始的 连续 数字键 考虑您实际上需要哪种行为。(这也许可以满足您的目的。) 对于第二个问题(检查数组是否为零索引和顺序索引),可

  • 我需要你的一些建议。我试图用redis和哈希(redis类型)存储一些非常有效的内存数据。有一些随机字符串列表(在rfc中平均大小是40个字符,但最大可能是255个字符)--它是文件id,例如我们有100kk的file_id列表。我们还需要每个ID的轨道2参数:download_count(int,incremented)和server_id--tiny int,redis config添加了:

  • 问题内容: RDBMS(或数据库理论)中“关系”与“关系”的定义是什么? 更新: 对我的问题的评论让我有些困惑: “关系是表的同义词,因此在计算机中存储的模式方面具有非常精确的含义” Update2: 如果我以关系数据库管理系统(RDBMS)的方式错误地回答了该问题,则该关系已写成一侧方向单数连接-依赖关系, 即从一个表到另一表,而关系暗示(不一定明确地)在一个表中有多个链接一个方向(从一张桌子到

  • 其更适合于以下环境: < li >坚持不是强迫。 < li >多个服务器(对于Ehcache,必须要求一些缓存同步)。 < li >非频繁写入和频繁读取。 < li >相对较小的数据库(内存需求非常少)。 我会倾吐我现在的想法。关于这些,我可能是错的。 我知道Redis需要一个单独的服务器(?)Ehcache提供本地缓存,因此它必须更快,但会跨服务器复制缓存(?)。使用Ehcache,可以在一个缓

  • 我正在编写一个PHP API,它服务于AWS中托管的移动应用程序。这个应用程序是基于图像的,就像Instagram一样。所有图像都上传到AWS Bucket中,并使用GET url请求,例如。我的问题是:为这些图像服务的最佳方式是什么?使用AWS Bucket还是CloudFront? 谢谢!

  • 问题内容: 我正在通过简单的界面在我的Rails 3应用程序中使用memcached进行一些缓存,现在我想使用redis和resque进行一些后台作业处理。 我认为它们的区别足以保证两者都使用。但是在heroku上,使用memcached和Redis需另外付费。两者都使用是否有意义,还是应该只使用Redis迁移? 我喜欢使用memcached进行缓存,因为最近最少使用的键会自动从缓存中推出,并且我