【问题标题】:Storing an array of data using Redis (from Laravel)使用 Redis 存储数据数组(来自 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 外观将其存储为关联数组而无需序列化。

标签: php laravel redis


【解决方案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

    【讨论】:

      猜你喜欢
      • 2020-04-13
      • 2018-07-07
      • 2015-08-14
      • 1970-01-01
      • 2018-02-10
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多