or software component that stores data so future requests for that data can be served faster; the data stored in a cache might be the result of an earlier computation, or the duplicate of data stored elsewhere.[1] “ “ [1] https://en.wikipedia.org/wiki/Cache_(computing)
use with PHP: ➤ Caching content We can cache content in PHP by saving the final output of a specific script into the filesystem then simply serving it like a static file for a specific period of time instead of executing the original script.
use with PHP: ➤ Caching content We can cache content in PHP by saving the final output of a specific script into the filesystem then simply serving it like a static file for a specific period of time instead of executing the original script. ➤ Database Cache Caching the caching is done by the database server itself. This works by caching the results of the query so the query is only parsed the first time it runs and in the succeeding requests it won’t be parsed since the results from the specific query is already cached by the database server.
use with PHP: ➤ Caching content We can cache content in PHP by saving the final output of a specific script into the filesystem then simply serving it like a static file for a specific period of time instead of executing the original script. ➤ Database Cache Caching the caching is done by the database server itself. This works by caching the results of the query so the query is only parsed the first time it runs and in the succeeding requests it won’t be parsed since the results from the specific query is already cached by the database server. ➤ Memory Cache Memory caching techniques are widely used; they use the volatile memory data and are a lot more faster than caching in the file system.
the volatile memory data and are a lot more faster than caching in the file system. ➤ APCU [2] Alternative PHP Cache User Cache (APCU) provides a full backwards compatible API to the shared memory userland cache provided by APC. [2] http://php.net/manual/en/intro.apcu.php
the volatile memory data and are a lot more faster than caching in the file system. ➤ APCU [2] Alternative PHP Cache User Cache (APCU) provides a full backwards compatible API to the shared memory userland cache provided by APC. ➤ MEMCACHED [3] Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering. [2] http://php.net/manual/en/intro.apcu.php [3] https://memcached.org/
the volatile memory data and are a lot more faster than caching in the file system. ➤ APCU [2] Alternative PHP Cache User Cache (APCU) provides a full backwards compatible API to the shared memory userland cache provided by APC. ➤ MEMCACHED [3] Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering. ➤ REDIS [4] Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. [2] http://php.net/manual/en/intro.apcu.php [3] https://memcached.org/ [4] https://redis.io/
caching. The first APCu codebase was versioned 4.0.0, it was forked from the head of the APC master branch at the time. PHP 7 support is available as of APCu 5.0.0. APCu can provide a compatibility mode, such that it can provide a drop in replacement for the applicable parts of APC.
= apcu_fetch($myCacheKey); if (!$row) { // Issue painful query to mysql $sql = "SELECT * FROM table WHERE id = :id"; $dbo->prepare($sql); $stmt->bindValue(':id', $someId, PDO::PARAM_INT); $row = $stmt->fetch(PDO::FETCH_OBJ); apcu_store($myCacheKey, serialize($row)); } // Now I have access to $row, where I can do what I need to // And for subsequent calls, the data will be pulled from cache and skip // the query altogether var_dump(unserialize($row));
objects, and is widely used in dynamic web applications to relieve the load on the database, making it possible to serve some of the data to which access is most frequent, directly from RAM memory .
objects, and is widely used in dynamic web applications to relieve the load on the database, making it possible to serve some of the data to which access is most frequent, directly from RAM memory . Memcached was created in 2003 by the company operating LiveJournal, Danga Interactive, which had to handle more than 20 million exponential dynamic daily requests. The adoption of this innovative caching system has made it possible to drastically reduce the load on database servers and significantly improve site performance.
objects, and is widely used in dynamic web applications to relieve the load on the database, making it possible to serve some of the data to which access is most frequent, directly from RAM memory . Memcached was created in 2003 by the company operating LiveJournal, Danga Interactive, which had to handle more than 20 million exponential dynamic daily requests. The adoption of this innovative caching system has made it possible to drastically reduce the load on database servers and significantly improve site performance. The software was then publicly released under the BSD license that allowed it to be implemented by other web giants and the inevitable addition of many features and constant performance enhancement. Among the most famous memcached users we find informatics giants such as WordPress, Wikipedia, Flickr, Twitter, YouTube, Digg and Facebook.
\Memcached(); $memcached->addServer('localhost', 11211); // Set a value $memcached->set('foo', 'bar', 7200); $memcached->set('integer', 12345678, 7200); $memcached->set('boolean', true, 7200); $memcached->set('array', ['apple', 'banana', 'pear'], 7200); $memcached->set('object', serialize(new MyAwesomeClass()), 7200); // Get a value $memcached->get(‘foo'); // Update a value $memcached->replace('foo', 'barbar', 10200); // Change TTL $memcached->touch('foo', 29000); // Delete a value $memcached->delete('foo'); // Flush the cache $memcached->flush();
$memcached->addServer('localhost', 11211); $myCacheKey = 'my_cache_key'; $row = $cache->get($myCacheKey); if (!$row) { // Issue painful query to mysql $sql = "SELECT * FROM table WHERE id = :id"; $dbo->prepare($sql); $stmt->bindValue(':id', $someId, PDO::PARAM_INT); $row = $stmt->fetch(PDO::FETCH_OBJ); $memcached->set($myCacheKey, serialize($row)); } // Now I have access to $row, where I can do what I need to // And for subsequent calls, the data will be pulled from cache and skip // the query altogether var_dump(unserialize($row));
by Redis Labs. It is networked, in-memory, and stores keys with optional durability. The name Redis means REmote DIctionary Server. Salvatore Sanfilippo, the original developer of Redis, was hired by VMware in March, 2010. In May, 2013, Redis was sponsored by Pivotal Software (a VMware spin-off). In June 2015, development became sponsored by Redis Labs.
by Redis Labs. It is networked, in-memory, and stores keys with optional durability. The name Redis means REmote DIctionary Server. Salvatore Sanfilippo, the original developer of Redis, was hired by VMware in March, 2010. In May, 2013, Redis was sponsored by Pivotal Software (a VMware spin-off). In June 2015, development became sponsored by Redis Labs. According to monthly rankings by DB-Engines.com, Redis is often ranked the most popular key-value database. Redis has also been ranked the #4 NoSQL database in user satisfaction and market presence based on user reviews, the most popular NoSQL database in containers, and the #1 NoSQL database among Top 50 Developer Tools & Services.
by Redis Labs. It is networked, in-memory, and stores keys with optional durability. The name Redis means REmote DIctionary Server. Salvatore Sanfilippo, the original developer of Redis, was hired by VMware in March, 2010. In May, 2013, Redis was sponsored by Pivotal Software (a VMware spin-off). In June 2015, development became sponsored by Redis Labs. According to monthly rankings by DB-Engines.com, Redis is often ranked the most popular key-value database. Redis has also been ranked the #4 NoSQL database in user satisfaction and market presence based on user reviews, the most popular NoSQL database in containers, and the #1 NoSQL database among Top 50 Developer Tools & Services. Someone defines Redis as “Memcached on Steroids”.
simplest type of value you can associate with a Redis key. It is the only data type in Memcached, so it is also very natural for newcomers to use it in Redis.
simplest type of value you can associate with a Redis key. It is the only data type in Memcached, so it is also very natural for newcomers to use it in Redis. If you don’t provide a ttl, the element will be persisted permanenty. <?php // Get Connection $client = new PRedis\Client(); // Set a string $client->set('foo', 'bar', 7200); $client->set('integer', 12345678, 7200); $client->set('boolean', true, 7200); $client->set('array', ['apple', 'banana', 'pear'], 7200); $client->set('object', serialize(new MyAwesomeClass()), 7200); // delete a value $client->del(‘foo’); // Get a string value $client->get(‘foo');
elements sorted according to the order of insertion. They are basically linked lists. <?php // Set a hash $client->lpush(’buylist’, ’apple'); $client->lpush(’buylist’, ’pie’); $client->rpush(’buylist’, ’pineapple’); // Get a string value $client->lrange(‘buylist’, 0, -1); // [‘pie’, ‘apple’, ‘pineapple’] // Remove the last two occurrences of ‘apple’ in the list $client->lrem,(‘buylist’, -2, ’apple');
unsorted string elements. <?php // Create ‘tag:user:1’ a set $client->sadd(’tags:user:1’, ’apple'); $client->sadd(’tags:user:1’, ’pie'); $client->sadd(’tags:user:1’, ’pineapple’); // Get a set value $client->smembers(‘tags:user:1’); // [‘apple’, ‘pie’, ’pineapple’] $client->srem(’tags:user:1’, ’pineapple’); // removes ‘pineapple’ key <?php // Create some set $client->sadd(’car:make:ford’, ’fiesta'); $client->sadd(’car:make:ford’, ’focus'); $client->sadd(’car:make:maserati’, ’quattroporte’); // Retrieve all ford molds $client->smembers(‘car:make:ford’); // [‘fiesta’, ‘focus’] CREATE AN INDEX
every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements
every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements <?php // Create fruits sorted set $client->zadd(’fruits’, 1, ’apple’); $client->zadd(’fruits’, 2, ’pie’); $client->zadd(’fruits’, 2.2, ’pineapple’); // get fruits sorted set $client->zrange(‘fruits’, 0, 1, [‘withscores’ => true]); $client->zrem(’fruits’, ’pineapple’); // removes ‘pineapple’ key
every string element is associated to a floating number value, called score. The elements are always taken sorted by their score, so unlike Sets it is possible to retrieve a range of elements <?php // Create fruits sorted set $client->zadd(’fruits’, 1, ’apple’); $client->zadd(’fruits’, 2, ’pie’); $client->zadd(’fruits’, 2.2, ’pineapple’); // get fruits sorted set $client->zrange(‘fruits’, 0, 1, [‘withscores’ => true]); $client->zrem(’fruits’, ’pineapple’); // removes ‘pineapple’ key <?php // Create fruits sorted set $client->zadd(’fruits’, 0, ’apple’); $client->zadd(’fruits’, 0, ’pie’); $client->zadd(’fruits’, 0, ’pineapple’); // Get all fruits sorted set with scores $client->zrangebylex(‘fruits’, 0, -1, [‘limit’ => [20, 5]]); LEXICOGRAPHICAL SORTING
fields associated with values. Both the field and the value are strings While hashes are handy to represent objects, actually the number of fields you can put inside a hash has no practical limits (other than available memory), so you can use hashes in many different ways inside your application.
fields associated with values. Both the field and the value are strings While hashes are handy to represent objects, actually the number of fields you can put inside a hash has no practical limits (other than available memory), so you can use hashes in many different ways inside your application. <?php // Set a hash $client->hset(’user:1’, ’name’, ‘Mauro'); $client->hset(’user:1’, ’surname’, ‘Cassani'); $client->hset(’user:1’, ’email’, ‘[email protected]’); // Get a string value $client->hget(‘user:1’, ’name’); // Mauro // Delete hash $client->hdel(‘user:1’, ’name’); // deletes Mauro // Get a string value $client->hgetall(‘user:1’); // full array
matching pattern. ➤ SCAN - iterates the set of keys in the currently selected Redis database. ➤ SSCAN - iterates elements of Sets types. ➤ HSCAN - iterates fields of Hash types and their associated values.
matching pattern. ➤ SCAN - iterates the set of keys in the currently selected Redis database. ➤ SSCAN - iterates elements of Sets types. ➤ HSCAN - iterates fields of Hash types and their associated values. ➤ ZSCAN - iterates elements of Sorted Set types and their associated scores.
keys starting by user foreach (new Iterator\Keyspace($client, 'predis:*') as $key) { // SCAN } foreach (new Iterator\SetKey($client, 'predis:set') as $member) { // SSCAN } foreach (new Iterator\SortedSetKey($client, 'predis:zset') as $member => $rank) { // ZSCAN } foreach (new Iterator\HashKey($client, 'predis:hset') as $field => $value) { // HSCAN } ➤ KEYS - returns all keys matching pattern. ➤ SCAN - iterates the set of keys in the currently selected Redis database. ➤ SSCAN - iterates elements of Sets types. ➤ HSCAN - iterates fields of Hash types and their associated values. ➤ ZSCAN - iterates elements of Sorted Set types and their associated scores.
✓ replication ✓ key length 256 bytes 512 Mb max value size 1 Mb 1 Mb 512 Mb data volume max size 3.5 TiB 4.7 TiB+ read/write +++ +++ ++ storage type in memory in memory disk + in memory cli ✓ ✓
some lists coming from your database or your API; ➤ You want to perform some queries on your lists; ➤ For example, imagine you want to display hundred of POIs in Google Maps, and allow the user to make some query via a dropdown menu, or maybe you want to allow your users to perform a simple text search on your list;
some lists coming from your database or your API; ➤ You want to perform some queries on your lists; ➤ For example, imagine you want to display hundred of POIs in Google Maps, and allow the user to make some query via a dropdown menu, or maybe you want to allow your users to perform a simple text search on your list; ➤ You want your site is super-fast (so you won’t to make more queries on you db);
some lists coming from your database or your API; ➤ You want to perform some queries on your lists; ➤ For example, imagine you want to display hundred of POIs in Google Maps, and allow the user to make some query via a dropdown menu, or maybe you want to allow your users to perform a simple text search on your list; ➤ You want your site is super-fast (so you won’t to make more queries on you db); ➤ Of course, you need to cache your data!
some lists coming from your database or your API; ➤ You want to perform some queries on your lists; ➤ For example, imagine you want to display hundred of POIs in Google Maps, and allow the user to make some query via a dropdown menu, or maybe you want to allow your users to perform a simple text search on your list; ➤ You want your site is super-fast (so you won’t to make more queries on you db); ➤ Of course, you need to cache your data! HOW TO ACHIEVE IT?
allows you to create and store in memory your lists, and then quickly retrieve and perform queries on it. [6] https://github.com/mauretto78/in-memory-list
new Client(); $collection = $client->create($array); foreach ($collection as $element){ $item = $client->item($element); // ... } Now you can iterate over all elements:
InMemoryList\Application\Client; $client = new Client('apcu'); // Apcu $client = new Client('memcached', $memcached_params); // Memcached You can use APCU, Memcached or Redis:
can provide to it a parameters array. The allowed keys are: <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list ➤ element-uuid - uuid for the list elements <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list ➤ element-uuid - uuid for the list elements ➤ headers - headers array for the list <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list ➤ element-uuid - uuid for the list elements ➤ headers - headers array for the list ➤ index - add the list elements to cache index or not <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list ➤ element-uuid - uuid for the list elements ➤ headers - headers array for the list ➤ index - add the list elements to cache index or not ➤ chunk-size - the chunks size in which the array will be splitted (integer) <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);
can provide to it a parameters array. The allowed keys are: ➤ uuid - uuid of list ➤ element-uuid - uuid for the list elements ➤ headers - headers array for the list ➤ index - add the list elements to cache index or not ➤ chunk-size - the chunks size in which the array will be splitted (integer) ➤ ttl - time to live of the list (in seconds) <?php use InMemoryList\Application\Client; $array = [...]; $client = new Client(); $collection = $client->create($array, $parameters);