在Laravel中集成Swoole的Redis服务端自定义Hash命令
前言
之前使用Swoole中的Redis服务端实现了Hash命令的重写,现在要实现在Laravel中能够使用。
环境
php版本:7.2.6
Laravel版本:7.30.6
第一步:增加配置
.env
RD_HOST=127.0.0.1
RD_PORT=9501
config/database.php的redis配置项中新增
'rd' => [
'url' => env('RD_URL'),
'host' => env('RD_HOST', '127.0.0.1'),
'password' => env('RD_PASSWORD', null),
'port' => env('RD_PORT', '9501'),
'database' => env('RD_DB', '0'),
],
修改容器中’redis’的绑定
自定义RedisManager
<?php
namespace App\Http\Services\Lib;
use Illuminate\Redis\RedisManager as BaseManager;
class RedisManager extends BaseManager
{
const COMMAND = ['hset','hget','hgetall','hmset'];
public function __call($method, $parameters)
{
//只支持单机redis
if (isset($this->config['default']) && in_array(strtolower($method), self::COMMAND)) {
$driver_name = 'rd';
}
return $this->connection($driver_name ?? null)->{$method}(...$parameters);
}
}
新增注册的ServiceProvider
<?php
namespace App\Providers;
use App\Http\Services\Lib\RedisManager;
use Illuminate\Contracts\Support\DeferrableProvider;
use Illuminate\Support\Arr;
use Illuminate\Support\ServiceProvider;
class DeferServiceProvider extends ServiceProvider implements DeferrableProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->singleton('redis', function ($app) {
$config = $app->make('config')->get('database.redis', []);
//使用自定义RedisManager
return new RedisManager($app, Arr::pull($config, 'client', 'phpredis'), $config);
});
$this->app->bind('redis.connection', function ($app) {
return $app['redis']->connection();
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return ['redis', 'redis.connection'];
}
}
替换框架启动时运行的RedisServiceProvider,修改config/app.php
'providers' => [
/*
* Laravel Framework Service Providers...
*/
//注释旧的ServiceProvider
//Illuminate\Redis\RedisServiceProvider::class,
\App\Providers\DeferServiceProvider::class,
]
测试
终端下执行php artisan tinker
结尾
因为只适用于单机redis服务,基本不能用于生产。多做尝试,发现更多可能!
本作品采用《CC 协议》,转载必须注明作者和本文链接