Connections
Overview
Relay treats all connections as persistent by default, meaning each PHP worker will open its own dedicated connection to Redis and it will be re-used between invocations.
Establishing connections with Relay can be done just like using PhpRedis:
$redis = new Relay;
$redis->connect('127.0.0.1', 6379);
$redis->auth('secret');
Authentication
Given that all of Relay’s connections are persistent, it has to store Redis credentials in memory. To protect against side-channel attacks, all secrets are encrypted with the XTEA block cipher, and decoded only when needed for authentication/re-authentication.
To authenticate, use the auth()
method:
$relay = new Relay;
$relay->connect('localhost', 6379);
$relay->auth('password');
// When using Redis 6 ACLs:
$relay->auth(['username', 'password']);
When using Relay’s constructor syntax, use the context
parameter:
$relay = new Relay(
host: 'localhost',
port: 6379,
context: [
'auth' => ['username', 'password']
],
);
Timeouts, retries and backoff
When establishing a new connection, the timeouts work just like PhpRedis.
- The
timeout
option is used when establishing a connection to Redis - The
read_timeout
option is used when Relay is reading from Redis Server
However, the retry_interval
option will be ignored. We suggest using a backoff algorithm and retries:
$relay = new Relay;
$relay->setOption(Relay::OPT_MAX_RETRIES, 5);
$relay->setOption(Relay::OPT_BACKOFF_BASE, 25); // 25ms, similar to `retry_interval`
$relay->setOption(Relay::OPT_BACKOFF_CAP, 1000); // 1s, like the `timeout`
$relay->setOption(Relay::OPT_BACKOFF_ALGORITHM, Relay::BACKOFF_ALGORITHM_DECORRELATED_JITTER);
$relay->connect(host: '127.0.0.1', timeout: 1.0, read_timeout: 1.0);
Client-only connections
In some cases it may be useful to disable Relay’s in-memory cache and have it just act like a faster PhpRedis, even when Relay did create a shared memory.
Use the $context
parameter on connect()
or when constructing a new instance:
$relay = new Relay(
host: 'localhost',
port: 6379,
context: ['use-cache' => false]
);
The endpointId()
will tell you whether a connection uses the in-memory cache:
$relay->endpointId(); // "tcp://default@127.0.0.1:6379?cache=1"
Secure connections
When using secure sockets, ensure that the socket timeout is set to at least one second. Setting the timeout too low can lead to numerous timeouts when the server load is high. Setting it too high can result in your application taking a long time to detect connection issues.
$relay = new Relay(
host: 'tls://...cache.amazonaws.com',
port: 19139,
timeout: 2.5,
context: [
'stream' => [
'verify_peer' => false,
'verify_peer_name' => false,
]
],
);