sql >> Databasteknik >  >> NoSQL >> Redis

Hur man får Laravel att fungera med Redis kluster på AWS

efter sökning och felsökning är det detta som fick det att fungera:

'redis' => [
    'client' => 'predis',
    'cluster' => true,
    'options' => [
        'cluster' => 'redis',
        'parameters' => [
            'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_DEFAULT_PORT', 6379),
            'database' => 0,
            ],
        ],
    'clusters' => [
         'default' => [
            'host' => env('REDIS_DEFAULT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_DEFAULT_PORT', 6379),
            'database' => 0,
        ],
        'jobs' => [
            'host' => env('REDIS_JOBS_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_JOBS_PORT', 6379),
            'database' => 0,
        ],
        'content' => [
            'host' => env('REDIS_CONTENT_HOST', '127.0.01'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_CONTENT_PORT', 6379),
            'database' => 0,
        ],
        'options' => [
            'cluster' => 'redis'
        ],
    ]
]

notera:ett uppenbart misstag i min konfiguration i ovanstående fråga var att jag kombinerade värden och porten, vilket jag fixade här. så här ser min .env-fil ut:

REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1

REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002

Obs:Jag skapade klustret med hjälp av instruktionerna här:https://redis.io/topics/cluster-tutorial#creating-the-cluster

Forskningsmetodik

På grund av det faktum att:1. Laravel/predis-dokumentationen om detta saknas2. De flesta av svaren på stack overflow är enligt följande:efter att ha googlat och sökt... det här är vad som löste sig för mig utan mycket förklaring av vad som händer

Jag tänkte att jag kan hjälpa till lite genom att visa hur Jag hittade mitt svar på ovanstående.

1) Lösa felproblemet

För att lösa detta fel

local.ERROR:Symfony\Component\Debug\Exception\FatalThrowableError:Typfel:Argument 1 skickas till Predis\Connection\Parameters::__construct() måste vara av typen array,heltal givet, anropat in/Users/Shared/dev/php /toters-api/vendor/predis/predis/src/Connection/Factory.phpon linje 164 in/Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Connection/Parameters.php:34Stackspårning :

Jag insåg att mitt config/database.php-format helt enkelt var fel. Att googla överallt gav mig ingen tydlig bild, så jag bestämde mig för att använda xdebug och dyka in i koden. Notera:Jag lät skriva ut felstackspårningen (visas i frågan ovan) i ett dokument, och jag använde det som ett fågelperspektiv för att guida mig genom felsökningsstegen (dvs. att gå över/in/ut osv medan jag alltid skrev ut utdata i ett separat dokument och jämför det med min config/database.php som en förnuftskontroll/felsökningskompass).

Efter att ha grävt och skrivit ut kom jag på detta:

[ *Locals ] [ Superglobals ] [ User defined constants ]

- Locals at /Users/Shared/dev/php/toters-api/vendor/predis/predis/src/Client.php:55

 ▾ $options = (array [1])
  \
   ⬦ $options["cluster"] = (string [5]) `redis`
  /
 ▾ $parameters = (array [4])
  \
   ⬦ $parameters[0] = (string [14]) `127.0.0.1:7000`
   |
   ⬦ $parameters[1] = (null)
   |
   ⬦ $parameters[2] = (int) 6379
   |
   ⬦ $parameters[3] = (int) 0
  /
 ▾ $this = (Predis\Client [3])
  \
   ⬦ $this->connection = (null)
   |
   ⬦ $this->options = (null)
   |
   ⬦ $this->profile = (null)
  /

Jag jämförde detta med innehållet i min .env-fil:

REDIS_DEFAULT_HOST=127.0.0.1:7000
REDIS_JOBS_HOST=127.0.0.1:7001
REDIS_CONTENT_HOST=127.0.0.1:7002

och jag insåg att formatet var fel, jag borde inte lägga värden OCH porten i samma env-variabel.. så jag satte det så istället:

REDIS_DEFAULT_HOST=127.0.0.1
REDIS_JOBS_HOST=127.0.0.1
REDIS_CONTENT_HOST=127.0.0.1

REDIS_DEFAULT_PORT=7000
REDIS_JOBS_PORT=7001
REDIS_CONTENT_PORT=7002

och det löste mitt första problem.

2) lösa de andra problemen

efter att ovanstående fixats fick jag detta

CLUSTERDOWN Hash-plats har inte serverats

det här var ganska enkelt, det var bara en fråga om att googla felmeddelandet (eftersom felmeddelandet uppenbarligen var ett inbyggt redis-felmeddelande, snarare än något kryptiskt biblioteksomslag som predis-felmeddelande).. och jag hittade det här svaret.

Resten var lätt.




  1. Varför får jag denna föråldrade varning?! MongoDB

  2. Bästa modellen för att representera många till många relationer med attribut i MongoDB

  3. Uppdatera MongoDB-samlingen med $toLower

  4. Ska jag alltid använda pipelining när det finns mer än 1 kommando i Redis?