一尘不染

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

redis

我对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来获取单个帖子并遍历所有帖子?

谢谢马克西姆


阅读 246

收藏
2020-06-20

共1个答案

一尘不染

您可以结合使用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来获取所有键

2020-06-20