使用 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 支持多种数据结构类型,如 hash、link list 和 array。
但您必须使用 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)的主要内容,如果未能解决你的问题,请参考以下文章