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

Posted

技术标签:

【中文标题】使用 Redis 存储数据数组(来自 Laravel)【英文标题】:Storing an array of data using Redis (from Laravel) 【发布时间】:2014-05-08 06:33:33 【问题描述】:

我已经开始使用 laravel。工作很有趣。我已经开始使用 laravel 的功能了。我已经开始使用redis,通过在我的系统中安装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 设置数组值?

【问题讨论】:

Redis 不熟悉 PHP 非标量数据类型,如数组,但快速而肮脏的选项是 $redis->set('name', serialize(array(5, 10)));$redis->set('name', json_encode(array(5, 10)));,然后在获取时取消序列化或 json_decode 所以我们必须对其进行编码而不是其他选择直接设置为数组? PHP 数组是一种特定于 PHP 的数据类型,redis 与语言无关,所以它不知道如何处理它......我个人使用 Redis 与 igbinary 和自动序列化 好的,谢谢你的解释标记 @Kalai :您可以使用我在回答中提到的 laravel 外观将其存储为关联数组而无需序列化。 【参考方案1】:

这个问题已经在 cmets 中得到了解答,但为了让以后访问的人更清楚。

Redis 与语言无关,因此它不会识别特定于 PHP 或任何其他语言的任何数据类型。最简单的方法是 serialise / json_encode 设置数据,然后 unserialise/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);

【讨论】:

正确答案。 MsgPack 也是一种很好的(与语言无关的)编码格式。作为旁注,这也适用于服务器端 Lua 脚本。见here。 您知道解码和编码所有内容需要多少时间吗? @DaAmidza 现在已经四岁了......可能有一种性能更高的方法来做到这一点。此外,这个答案使 OP(和其他人理解)尽可能简单 @ajtrichards .. 我试过但我收到无效参数错误。 127.0.0.1:6379> set('user_details', json_encode(array('first_name' => 'Alex', 'last_name' => 'Richards')));无效参数 使用 Redis;在文件的顶部。【参考方案2】:

Redis 支持多种数据结构类型,如 hashlink listarray

但您必须使用 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

【讨论】:

【参考方案3】:

在你的控制器中,你可以添加这样的功能:

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。

【讨论】:

以上是关于使用 Redis 存储数据数组(来自 Laravel)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Redis 中存储对象数组?

redis 如何存一个PHP数组 代码怎么写呢

优雅的处理Redis访问超时

Redis hash

redis常用数据类型对应的数据结构

14 list 相关操作