问题:
我使用Python代码向redis添加了一个值,当我尝试查询时使用的是Laravel
Redis::get('key_name')
它返回null
。Redis::keys('*')
返回使用 Laravel 而不是 Python 创建的值Redis::scan('*')
返回所有值,甚至是使用 Python 创建的值
研究:
- https://stackoverflow.com/a/56569380/9530790 ,指出这可能是数据库编号问题,但事实并非如此。由于我在 Python 代码和 Laravel 代码中使用相同的数据库,(数据库
0
) - https://stackoverflow.com/a/65278346/9530790 ,指出了与上面相同的问题。
问题:
为什么 keys('*')
不返回 key ,但 scan('*')
却返回 key ,如果 get( 'key_name')
返回 null?
Laravel:7.30.4
Python:3.8.3
Redis:6.0
最佳答案
Laravel 为所有创建的键添加前缀。该前缀在 database.php
的 redis
配置中定义。
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
我还没有查看源代码,但很可能当 Laravel 查找键时,它需要前缀并将其附加到您传递给 keys
或 get
的内容中。因此,如果您传递 keys('key_name')
它会搜索 prefix_key_name
这就是为什么 get
返回 null
并且 keys
没有返回通过 Python 创建的 key ,而不是通过 Laravel 创建的 key 。我猜 scan
的工作方式略有不同,它会返回所有键,无论其前缀如何。
如果您将前缀的默认值设置为 null ('prefix' => env('REDIS_PREFIX', null
),则将返回您的 key 。
使用 get
并附加前缀,例如 Redis::get('prefix_key_name')
不起作用。
关于python - 为什么 Laravel Redis::scan ('*' ) 返回预期的 key ,但 Redis::keys ('*' ) 没有返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66139539/