Redis + Laravel: Storing and retrieving objects
Is well know the usage of Redis as Cache. Several developers use it as a modern alternative to Memcached but still using Redis the Memcached way. Truth is that Redis has a lot of features besides only storing key-value pairs like Memcached.
One of this features is the support of several data types:
- Strings. (the only data type supported by Memcached)
- Lists. (list of strings, comparable with an array).
- Sets. (Same as List but with out order)
- Hashes. (maps between string fields and string values).
Hashes are the best way to store objects (Or string key arrays). Lets see how to do this using Laravel.
Laravel has a good implementation of Redis as part of the core, we will only need to install a couple of things in order to use it. The documentation is pretty clear about how to do it. You can take a look if you want.
Redis has a few commands to handle Hashes. You can see a full list here.
First, in order to keep the things in order, lets create a class named Client that will represent a client of an imaginary company.
[cc lang=”php” width=”100%”]
id = $id;
$this->name = $name;
$this->email = $email;
$this->address = $address
}
}
[/cc]
This class will force that in the declaration of a new instance we provide all the client data.
In order to Store a new Hash we will implement a method called store() where will use the Redis command HMSET in order to store a new objet with a key:
[cc lang=”php” width=”100%”]
//app/Client.php
…
public function store()
{
Redis::hmset(‘client:’ . $this->id, [
‘id’ => $this->id,
‘name’ => $this->name,
’email’ => $this->email,
‘address’ => $this->address
]);
}
…
[/cc]
This simple method stores an instance of the class Client in Redis. For example if the id of the user is 1 the key of the hash will be ‘client:1’.
In order to Retrieve a particular instance by ID will be need to implement a class method named find, and we’ll use the the Redis command HGETALL in order to return a new instance of the class.
[cc lang=”php” width=”100%”]
//app/Client.php
…
public static function find($id)
{
$key = ‘client:’ . $id;
$stored = Redis::hgetall($key);
if (!empty($stored)) {
return new Client($stored[‘id’], $stored[‘name’], $stored[’email’], $stored[‘address’]);
}
return false;
}
…
[/cc]
The method Redis::hgetAll($key) will return an associative array with all the hash data. In case we only need to get the “email” of the user 1 we need to use HGET”
[cc lang=”php” width=”100%”]
$client = new Client(1, ‘Homer Simpson’, ‘[email protected]’,’742 Evergreen Terrace’);
$email = Redis::hget(‘client:1’, email);
echo $email;
//will print: “[email protected]”
[/cc]
Redis has a command KEYS that retrieves all keys for a given pattern, and we will use it in order to retrieve all Clients objects.
[cc lang=”php” width=”100%”]
//app/Client.php
…
public static function getAll()
{
$keys = Redis::keys(‘client:*’);
$clients = [];
foreach ($keys as $key) {
$stored = Redis::hgetall($key);
$client = new Client($stored[‘id’], $stored[‘name’], $stored[’email’], $stored[‘address’]);
$clients[] = $client;
}
return $clients;
}
…
[/cc]
This way we return all Clients stored in Redis. We do this because Redis has no a way to retrieve all hashes for a specific key pattern so we must implement this kind of method.
Laravel implements all Redis commands as dynamic method so every Redis command is a static method of the class Redis.
Thats it, now you are ready to implement your Redis models in your Laravel application.