Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How does memcache with MySQL work?

I am trying to understand (and probably deploy) memcached in our env.

We have 4 web servers on loadbalancer running a big web app developed in PHP. We are already using APC. I want to see how memcached works? At least, may be I don't understand how caching works.

We have some complex dynamic queries that combine several tables to pull data. Each time, the data is going to be from different client databases and data keeps changing. From my understanding, if some data is stored in cache, and if the request is same next time, the same data is returned. (Or I may be completely wrong here).

How does this whole memcache (or for that matter, any caching stuff works)?

like image 370
Kevin Rave Avatar asked Apr 13 '12 04:04

Kevin Rave


People also ask

What is Memcached in MySQL?

The InnoDB memcached plugin implements memcached as a MySQL plugin daemon that accesses the InnoDB storage engine directly, bypassing the MySQL SQL layer. The following diagram illustrates how an application accesses data through the daemon_memcached plugin, compared with SQL.

How does memcache store data?

How does Memcached work? Unlike databases that store data on disk or SSDs, Memcached keeps its data in memory. By eliminating the need to access disks, in-memory key-value stores such as Memcached avoid seek time delays and can access data in microseconds.

How does memcache cluster work?

Each node in a Memcached cluster has its own endpoint. The cluster also has an endpoint called the configuration endpoint. If you enable Auto Discovery and connect to the configuration endpoint, your application automatically knows each node endpoint, even after adding or removing nodes from the cluster.

Where does memcache store data?

Memcached stores the data in the memory and when the data is needed the application checks for the data in the memcache via its daemon. Memcached has the ability to store SQL queries, that way the next time the query is ran, it can return the result from memory.


3 Answers

Cache, in general, is a very fast key/value storage engine where you can store values (usually serialized) by a predetermined key, so you can retrieve the stored values by the same key.

In relation to MySQL, you would write your application code in such a way, that you would check for the presence of data in cache, before issuing a request to the database. If a match was found (matching key exists), you would then have access to the data associated to the key. The goal is to not issue a request to the more costly database if it can be avoided.

An example (demonstrative only):

$cache = new Memcached();  $cache->addServer('servername', 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);      $cache->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)); 

Check out PHP docs on memcached for more info, there are some good examples and comments.

like image 129
Mike Purcell Avatar answered Sep 29 '22 06:09

Mike Purcell


There are several examples on how memcache works. Here is one of the links.

Secondly, Memcache can work with or without MySQL.

It caches your objects which are in PHP, now whether it comes from MySQL, or anywhere else, if its an PHP Object, it can be stored in MemCache.

APC gives you some more functionality than Memcache. Other than storing/caching PHP objects, it also caches PHP-executable-machine-readable-opcodes so that your PHP files won't go through the processes of loading in memory-> Being Comiled, rather, it directly runs the already compiled opcode from the memory.

like image 42
linuxeasy Avatar answered Sep 29 '22 05:09

linuxeasy


If your data keeps changing(between requests) then caching is futile, because that data is going to be stale. But most of the times(I bet even in your cache) multiple requests to database result in same data set in which case a cache(in memory) is very useful.

P.S: I did a quick google search and found this video about memcached which has rather good quality => http://www.bestechvideos.com/2009/03/21/railslab-scaling-rails-episode-8-memcached. The only problem could be that it talks about Ruby On Rails(which I also don't use that much, but is very easy to understand). Hopefully it is going to help you grasp the concept a little better.

like image 21
Alfred Avatar answered Sep 29 '22 06:09

Alfred