【问题标题】:Why is Laravel Redis::scan('*') returning an expected key but Redis::keys('*') is not?为什么 Laravel Redis::scan('*') 返回一个预期的键,但 Redis::keys('*') 不是?
【发布时间】:2021-05-14 07:07:37
【问题描述】:

问题:

我使用 Python 代码向 redis 添加了一个值,当我尝试查询时使用的是 Laravel

  • Redis::get('key_name') 它返回 null
  • Redis::keys('*') 返回使用 Laravel 而不是 Python 创建的值
  • Redis::scan('*') 返回所有值,即使是那些使用 Python 创建的值

研究:

问题:

为什么keys('*') 不返回密钥,但scan('*') 是,如果get('key_name') 返回空值,我如何获取值?

Laravel:7.30.4

Python:3.8.3

Redis:6.0

【问题讨论】:

    标签: python laravel redis


    【解决方案1】:

    Laravel 为所有创建的键添加前缀。该前缀在database.phpredis 配置中定义。

    'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),

    我还没有查看源代码,但很可能当 laravel 查找密钥时,它需要前缀并将其附加到您传递给 keysget 的内容中。因此,如果您通过keys('key_name'),它将搜索prefix_key_name,这就是为什么get 返回nullkeys 没有返回我通过Python 创建的密钥,而不是通过Laravel 创建的密钥。我猜scan 的工作方式有点不同,它会返回所有键而不考虑其前缀。

    如果您将前缀的默认值设置为 null ('prefix' => env('REDIS_PREFIX', null),那么您的密钥将被返回。

    使用get 并附加前缀,这样Redis::get('prefix_key_name') 不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多