使用Redis(来自Laravel)存储数据数组

32

我已经开始使用 Laravel 进行开发。使用 Laravel 是非常有趣的。我已经开始使用 Laravel 的一些特性,并在我的系统中安装了 Redis 服务器,并在 app/config/database.php 文件中更改了 Redis 的配置。通过使用 set 命令,Redis 已经可以正常地设置单个变量,例如:

$redis = Redis::connection();

$redis->set('name', 'Test');

我可以通过以下方式获取值:

$redis->get('name');

但我想使用set函数来设置数组。如果我尝试这样做会得到以下错误:

 strlen() expects parameter 1 to be string, array given 

我已经尝试使用以下代码。

$redis->set('name', array(5, 10));

$values = $redis->lrange('names', array(5, 10));
如果我使用

$values = $redis->command('lrange', array(5, 10));

出现以下错误

 'command' is not a registered Redis command 

有人能够解释一下这个问题吗?并且 redis 能够实现吗?...我们可以使用 redis 设置数组的值吗?


5
Redis不熟悉PHP中的非标量数据类型,如数组,但是一种简单粗暴的选择是$redis->set('name', serialize(array(5, 10)));$redis->set('name', json_encode(array(5, 10)));,然后在获取时进行反序列化或json解码。 - Mark Baker
那么我们必须对其进行编码,没有其他选择可以直接设置为数组吗? - Kalaiyarasan
1
PHP数组是PHP特有的数据类型,Redis是语言无关的,因此不知道如何处理它...我个人使用带有igbinary和自动序列化的Redis。 - Mark Baker
好的,谢谢你的解释 Mark。 - Kalaiyarasan
@Kalai:你可以使用我在答案中提到的Laravel Facade将其存储为关联数组而无需序列化。 - Abilogos
3个回答

78

评论中已经回答了这个问题,但为了让将来访问的人更清楚地了解答案。

Redis是与语言无关的,因此不会识别PHP或其他语言特定的任何数据类型。最简单的方法是在设置时对数据进行序列化/json_encode,然后在获取时进行反序列化/json_decode

使用json_encode存储数据的示例:

use Illuminate\Support\Facades\Redis;

$redis = Redis::connection();

$redis->set('user_details', json_encode([
        'first_name' => 'Alex', 
        'last_name' => 'Richards'
    ])
);

使用json_decode检索数据的示例:

use Illuminate\Support\Facades\Redis;

$redis    = Redis::connection();
$response = $redis->get('user_details');

$response = json_decode($response);

1
正确的答案。MsgPack也是一种很好的(语言无关的)编码格式。顺便提一下,这也适用于服务器端的Lua脚本。请参见此处 - Tw Bert
1
你知道解码和编码所有内容需要多长时间吗? - DaAmidza
@DaAmidza 这个已经四年前的代码了……现在可能有更高效的实现方式。此外,这个答案让问题发布者(和其他人)尽可能地理解简单。 - ajtrichards
@ajtrichards..我尝试了,但是出现了无效参数错误。127.0.0.1:6379> set('user_details', json_encode(array('first_name' => 'Alex', 'last_name' => 'Richards')));无效的参数。 - Techdive
请在文件顶部添加"use Redis;"。 - Akash lal

15

Redis支持多种数据结构类型,如哈希链表数组

但是您必须使用以下方法中的适当方法来自Laravel Redis门面

// set user_details --redis_key-- and --redis_value-- as array of key_values 
Redis::hmset('user_details',["firstName" => "Foo", "lastName" => "Bar"]);

// get all as an associative array
Redis::hgetall('user_details');

// get just the keys as an array
Redis::hkeys('user_details');

更多信息: https://redis.io/commands#hash


0
在你的控制器中,你可以添加这样的函数:
use Illuminate\Support\Facades\Redis;
private function getUsers() {
    if ($users = Redis::get('users.all')) {
        return json_decode($users);
    }
    $users = User::all();
    Redis::set('users.all', $users);
    return $users;
}

然后在你的index方法(或其他方法)中,你可以这样做:

public function index(Request $request) {
    $users = $this->getUsers();
}

来源:被接受的答案和this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接