The main point of Predis is about offering a highly customizable and extensible client for Redis, that can be easily extended by developers while still being reasonably fast. With Predis you can swap almost any class with your own custom implementation: you can have custom connection classes, new distribution strategies for client-side sharding, or handlers to replace or add Redis commands. All of this can be achieved without messing with the source code of the library and directly in your own application. Given the fast pace at which Redis is developed and adds new features, this can be a great asset since it allows developers to add new and still missing features or commands or change the standard behaviour of the library without the need to break dependencies in production code (at least to some degree).
Yes. Obviously persistent connections actually work only when using PHP configured as a persistent process reused by the web server (see PHP-FPM).
Yes. Encrypted connections are mostly useful when connecting to Redis instances exposed by various cloud hosting providers without the need to configure an SSL proxy, but you should also take into account the general performances degradation especially during the connect() operation when the TLS handshake must be performed to secure the connection. Persistent SSL-encrypted connections may help in that respect, but they are supported only when running on PHP >= 7.0.0.
When using Relay as the underlying client, several serialization and compression algorithms are supported. This slightly increases CPU usage, but significantly reduces bytes sent over the network and Redis memory usage.
Without Relay, Predis will not serialize data and will never do that by default. The reason behind this decision is that serialization is usually something that developers prefer to customize depending on their needs and can not be easily generalized when using Redis because of the many possible access patterns for your data. This does not mean that it is impossible to have such a feature since you can leverage the extensibility of this library to define your own serialization-aware commands. You can find more details about how to do that on this issue.
Explicitly connecting to Redis is usually not needed since the client initializes connections lazily
only when they are needed. Admittedly, this behavior can be inconvenient in certain scenarios when
you absolutely need to perform an upfront check to determine if the server is up and running and
eventually catch exceptions on failures. Forcing the client to open the underlying connection can be
done by invoking Predis\Client::connect():
$client = new Predis\Client();
try {
$client->connect();
} catch (Predis\Connection\ConnectionException $exception) {
// We could not connect to Redis! Your handling code goes here.
}
$client->info();The approach used to implement Redis commands is quite simple: by default each command follows the
same signature as defined on the Redis documentation which makes things
pretty easy if you already know how Redis works or you need to look up how to use certain commands.
Alternatively, variadic commands can accept an array for keys or values (depending on the command)
instead of a list of arguments. Commands such as RPUSH and
HMSET are great examples:
$client->rpush('my:list', 'value1', 'value2', 'value3'); // plain method arguments
$client->rpush('my:list', ['value1', 'value2', 'value3']); // single argument array
$client->hmset('my:hash', 'field1', 'value1', 'field2', 'value2'); // plain method arguments
$client->hmset('my:hash', ['field1'=>'value1', 'field2'=>'value2']); // single named arrayAn exception to this rule is SORT for which modifiers are passed
using a named array.
If you care about performance, always. Relay is free to use.
Predis is fast enough when Redis is located on the same machine as PHP.
PhpRedis and Relay perform significantly better when network I/O is involved, due to its ability to compress data by ~75%. Fewer bytes and received sent over the network means faster operations, and potentially cost savings when network traffic isn't free (e.g. AWS ElastiCache Inter-AZ transfer costs).