fbpx
Wikipedia

Memcached

Memcached (pronounced variously mem-cash-dee or mem-cashed) is a general-purpose distributed memory-caching system. It is often used to speed up dynamic database-driven websites by caching data and objects in RAM to reduce the number of times an external data source (such as a database or API) must be read. Memcached is free and open-source software, licensed under the Revised BSD license.[1] Memcached runs on Unix-like operating systems (Linux and macOS) and on Microsoft Windows. It depends on the libevent library.

Memcached
Developer(s)Danga Interactive
Initial releaseMay 22, 2003 (2003-05-22)
Stable release
1.6.27  / 6 May 2024; 17 days ago (6 May 2024)
Repository
  • github.com/memcached/memcached
Written inC
Operating systemCross-platform
Typedistributed memory caching system
LicenseRevised BSD license[1]
Websitememcached.org 

Memcached's APIs provide a very large hash table distributed across multiple machines. When the table is full, subsequent inserts cause older data to be purged in least recently used (LRU) order.[2][3] Applications using Memcached typically layer requests and additions into RAM before falling back on a slower backing store, such as a database.

Memcached has no internal mechanism to track misses which may happen. However, some third party utilities provide this functionality.

Memcached was first developed by Brad Fitzpatrick for his website LiveJournal, on May 22, 2003.[4][5] It was originally written in Perl, then later rewritten in C by Anatoly Vorobey, then employed by LiveJournal.[6] Memcached is now used by many other systems, including YouTube,[7] Reddit,[8] Facebook,[9][10] Pinterest,[11][12] Twitter,[13] Wikipedia,[14] and Method Studios.[15] Google App Engine, Google Cloud Platform, Microsoft Azure, IBM Bluemix and Amazon Web Services also offer a Memcached service through an API.[16][17][18][19]

Software architecture edit

The system uses a client–server architecture. The servers maintain a key–value associative array; the clients populate this array and query it by key. Keys are up to 250 bytes long and values can be at most 1 megabyte in size.

Clients use client-side libraries to contact the servers which, by default, expose their service at port 11211. Both TCP and UDP are supported. Each client knows all servers; the servers do not communicate with each other. If a client wishes to set or read the value corresponding to a certain key, the client's library first computes a hash of the key to determine which server to use. This gives a simple form of sharding and scalable shared-nothing architecture across the servers. The server computes a second hash of the key to determine where to store or read the corresponding value. The servers keep the values in RAM; if a server runs out of RAM, it discards the oldest values. Therefore, clients must treat Memcached as a transitory cache; they cannot assume that data stored in Memcached is still there when they need it. Other databases, such as MemcacheDB, Couchbase Server, provide persistent storage while maintaining Memcached protocol compatibility.

If all client libraries use the same hashing algorithm to determine servers, then clients can read each other's cached data.

A typical deployment has several servers and many clients. However, it is possible to use Memcached on a single computer, acting simultaneously as client and server. The size of its hash table is often very large. It is limited to available memory across all the servers in the cluster of servers in a data center. Where high-volume, wide-audience Web publishing requires it, this may stretch to many gigabytes. Memcached can be equally valuable for situations where either the number of requests for content is high, or the cost of generating a particular piece of content is high.

Security edit

Most deployments of Memcached are within trusted networks where clients may freely connect to any server. However, sometimes Memcached is deployed in untrusted networks or where administrators want to exercise control over the clients that are connecting. For this purpose Memcached can be compiled with optional SASL authentication support. The SASL support requires the binary protocol.

A presentation at BlackHat USA 2010 revealed that a number of large public websites had left Memcached open to inspection, analysis, retrieval, and modification of data.[20]

Even within a trusted organisation, the flat trust model of memcached may have security implications. For efficient simplicity, all Memcached operations are treated equally. Clients with a valid need for access to low-security entries within the cache gain access to all entries within the cache, even when these are higher-security and that client has no justifiable need for them. If the cache key can be either predicted, guessed or found by exhaustive searching, its cache entry may be retrieved.

Some attempt to isolate setting and reading data may be made in situations such as high volume web publishing. A farm of outward-facing content servers have read access to memcached containing published pages or page components, but no write access. Where new content is published (and is not yet in memcached), a request is instead sent to content generation servers that are not publicly accessible to create the content unit and add it to memcached. The content server then retries to retrieve it and serve it outwards.

Used as a DDoS attack vector edit

In February 2018, CloudFlare reported that misconfigured memcached servers were used to launch DDoS attacks in large scale.[21] The memcached protocol over UDP has a huge amplification factor, of more than 51000.[22] Victims of the DDoS attacks include GitHub, which was flooded with 1.35 Tbit/s peak incoming traffic.[23]

This issue was mitigated in Memcached version 1.5.6, which disabled UDP protocol by default.[24]

Example code edit

Note that all functions described on this page are pseudocode only. Memcached calls and programming languages may vary based on the API used.

Converting database or object creation queries to use Memcached is simple. Typically, when using straight database queries, example code would be as follows:

 function get_foo(int userid)  data = db_select("SELECT * FROM users WHERE userid = ?", userid)  return data 

After conversion to Memcached, the same call might look like the following

 function get_foo(int userid)  /* first try the cache */  data = memcached_fetch("userrow:" + userid)  if not data  /* not found : request database */  data = db_select("SELECT * FROM users WHERE userid = ?", userid)  /* then store in cache until next get */  memcached_add("userrow:" + userid, data)  end  return data 

The client would first check whether a Memcached value with the unique key "userrow:userid" exists, where userid is some number. If the result does not exist, it would select from the database as usual, and set the unique key using the Memcached API add function call.

However, if only this API call were modified, the server would end up fetching incorrect data following any database update actions: the Memcached "view" of the data would become out of date. Therefore, in addition to creating an "add" call, an update call would also be needed using the Memcached set function.

 function update_foo(int userid, string dbUpdateString)  /* first update database */  result = db_execute(dbUpdateString)  if result  /* database update successful : fetch data to be stored in cache */  data = db_select("SELECT * FROM users WHERE userid = ?", userid)  /* the previous line could also look like data = createDataFromDBString(dbUpdateString) */  /* then store in cache until next get */  memcached_set("userrow:" + userid, data) 

This call would update the currently cached data to match the new data in the database, assuming the database query succeeds. An alternative approach would be to invalidate the cache with the Memcached delete function, so that subsequent fetches result in a cache miss. Similar action would need to be taken when database records were deleted, to maintain either a correct or incomplete cache.

An alternate cache-invalidation strategy is to store a random number in an agreed-upon cache entry and to incorporate this number into all keys that are used to store a particular kind of entry. To invalidate all such entries at once, change the random number. Existing entries (which were stored using the old number) will no longer be referenced and so will eventually expire or be recycled.

 function store_xyz_entry(int key, string value)  /* Retrieve the random number - use zero if none exists yet.  * The key-name used here is arbitrary. */   seed = memcached_fetch(":xyz_seed:")  if not seed  seed = 0  /* Build the key used to store the entry and store it.  * The key-name used here is also arbitrary. Notice that the "seed" and the user's "key"  * are stored as separate parts of the constructed hashKey string: ":xyz_data:(seed):(key)."   * This is not mandatory, but is recommended. */  string hashKey = sprintf(":xyz_data:%d:%d", seed, key)  memcached_set(hashKey, value)  /* "fetch_entry," not shown, follows identical logic to the above. */  function invalidate_xyz_cache()  existing_seed = memcached_fetch(":xyz_seed:")  /* Coin a different random seed */  do  seed = rand()  until seed != existing_seed  /* Now store it in the agreed-upon place. All future requests will use this number.   * Therefore, all existing entries become un-referenced and will eventually expire. */  memcached_set(":xyz_seed:", seed) 

Usage edit

See also edit

References edit

  1. ^ a b "Memcached license". GitHub. Retrieved 2014-06-27.
  2. ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". Code.google.com. Retrieved 2017-06-25.
  3. ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". Code.google.com. Retrieved 2017-06-25.
  4. ^ [1]. Community.livejournal.com (2003-05-22). Retrieved on 2013-09-18.
  5. ^ [2]. Community.livejournal.com (2003-05-27). Retrieved on 2013-09-18.
  6. ^ . 2013-02-25. Archived from the original on 2013-02-25. Retrieved 2017-06-25.
  7. ^ Cuong Do Cuong (Engineering manager at YouTube/Google) (June 23, 2007). Seattle Conference on Scalability: YouTube Scalability (Online Video - 26th minute). Seattle: Google Tech Talks.
  8. ^ Whitaker, Keir (2010-05-17). . Archived from the original on 2010-05-17. Retrieved 2017-06-25.
  9. ^ "Scaling memcached at Facebook". Facebook.com. 2008-12-12. Retrieved 2017-06-25.
  10. ^ Scaling Memcache at Facebook. USENIX. 2002. ISBN 9781931971003. Retrieved 2017-06-25.
  11. ^ "Building Pinterest in the cloud". Pinterest Careers. 2013-06-19. Retrieved 2018-03-09.
  12. ^ "A comprehensive, fast, pure-Python memcached client". Github.com. 2018-01-08. Retrieved 2018-03-09.
  13. ^ "It's Not Rocket Science, But It's Our Work". Blog.twitter.com. 2008-06-01. Retrieved 2017-06-25.
  14. ^ "memcached". MediaWiki. Retrieved 2017-06-25.
  15. ^ Rez BoF, SIGGRAPH 2019, archived from the original on 2021-12-12, retrieved 2019-08-09
  16. ^ "Memcache Examples | App Engine standard environment for Python | Google Cloud Platform". Code.google.com. 2017-03-22. Retrieved 2017-06-25.
  17. ^ "About In-Role Cache for Azure Cache". Msdn.microsoft.com. 2015-08-25. Retrieved 2017-06-25.
  18. ^ Verge, Jason (2014-09-23). "Redis Labs: We Have 3,000 Paying Cloud In-Memory NoSQL Customers". Data Center Knowledge. Retrieved 2016-09-10.
  19. ^ "AWS | Amazon ElastiCache – in-memory data store and cache". Aws.amazon.com. Retrieved 2017-06-25.
  20. ^ . Archived from the original on 2018-12-21. Retrieved 2016-09-02.
  21. ^ "Memcrashed - Major amplification attacks from UDP port 11211". CloudFlare. 27 Feb 2018. Retrieved 3 March 2018.
  22. ^ Jeffrey, Cal (Mar 1, 2018). "GitHub falls victim to largest DDoS attack ever recorded".
  23. ^ "February 28th DDoS Incident Report". March 1, 2018. Retrieved 3 March 2018.
  24. ^ "Memcached 1.5.6 Release Notes". GitHub. 2018-02-27. Retrieved 3 March 2018.
  25. ^ "Speedy MySQL 5.6 takes aim at NoSQL, MariaDB". Theregister.co.uk. Retrieved 2017-06-25.
  26. ^ David Felcey (2014-08-13). . Blogs.oracle.com. Archived from the original on 2017-02-23. Retrieved 2017-06-25.
  27. ^ "Using the Memcached protocol endpoint with Infinispan". infinispan.org. Retrieved 2022-04-19.

External links edit

  • Official website  

memcached, pronounced, variously, cash, cashed, general, purpose, distributed, memory, caching, system, often, used, speed, dynamic, database, driven, websites, caching, data, objects, reduce, number, times, external, data, source, such, database, must, read, . Memcached pronounced variously mem cash dee or mem cashed is a general purpose distributed memory caching system It is often used to speed up dynamic database driven websites by caching data and objects in RAM to reduce the number of times an external data source such as a database or API must be read Memcached is free and open source software licensed under the Revised BSD license 1 Memcached runs on Unix like operating systems Linux and macOS and on Microsoft Windows It depends on the libevent library MemcachedDeveloper s Danga InteractiveInitial releaseMay 22 2003 2003 05 22 Stable release1 6 27 6 May 2024 17 days ago 6 May 2024 Repositorygithub wbr com wbr memcached wbr memcachedWritten inCOperating systemCross platformTypedistributed memory caching systemLicenseRevised BSD license 1 Websitememcached wbr org Memcached s APIs provide a very large hash table distributed across multiple machines When the table is full subsequent inserts cause older data to be purged in least recently used LRU order 2 3 Applications using Memcached typically layer requests and additions into RAM before falling back on a slower backing store such as a database Memcached has no internal mechanism to track misses which may happen However some third party utilities provide this functionality Memcached was first developed by Brad Fitzpatrick for his website LiveJournal on May 22 2003 4 5 It was originally written in Perl then later rewritten in C by Anatoly Vorobey then employed by LiveJournal 6 Memcached is now used by many other systems including YouTube 7 Reddit 8 Facebook 9 10 Pinterest 11 12 Twitter 13 Wikipedia 14 and Method Studios 15 Google App Engine Google Cloud Platform Microsoft Azure IBM Bluemix and Amazon Web Services also offer a Memcached service through an API 16 17 18 19 Contents 1 Software architecture 1 1 Security 1 1 1 Used as a DDoS attack vector 2 Example code 3 Usage 4 See also 5 References 6 External linksSoftware architecture editThis section does not cite any sources Please help improve this section by adding citations to reliable sources Unsourced material may be challenged and removed June 2013 Learn how and when to remove this message The system uses a client server architecture The servers maintain a key value associative array the clients populate this array and query it by key Keys are up to 250 bytes long and values can be at most 1 megabyte in size Clients use client side libraries to contact the servers which by default expose their service at port 11211 Both TCP and UDP are supported Each client knows all servers the servers do not communicate with each other If a client wishes to set or read the value corresponding to a certain key the client s library first computes a hash of the key to determine which server to use This gives a simple form of sharding and scalable shared nothing architecture across the servers The server computes a second hash of the key to determine where to store or read the corresponding value The servers keep the values in RAM if a server runs out of RAM it discards the oldest values Therefore clients must treat Memcached as a transitory cache they cannot assume that data stored in Memcached is still there when they need it Other databases such as MemcacheDB Couchbase Server provide persistent storage while maintaining Memcached protocol compatibility If all client libraries use the same hashing algorithm to determine servers then clients can read each other s cached data A typical deployment has several servers and many clients However it is possible to use Memcached on a single computer acting simultaneously as client and server The size of its hash table is often very large It is limited to available memory across all the servers in the cluster of servers in a data center Where high volume wide audience Web publishing requires it this may stretch to many gigabytes Memcached can be equally valuable for situations where either the number of requests for content is high or the cost of generating a particular piece of content is high Security edit Most deployments of Memcached are within trusted networks where clients may freely connect to any server However sometimes Memcached is deployed in untrusted networks or where administrators want to exercise control over the clients that are connecting For this purpose Memcached can be compiled with optional SASL authentication support The SASL support requires the binary protocol A presentation at BlackHat USA 2010 revealed that a number of large public websites had left Memcached open to inspection analysis retrieval and modification of data 20 Even within a trusted organisation the flat trust model of memcached may have security implications For efficient simplicity all Memcached operations are treated equally Clients with a valid need for access to low security entries within the cache gain access to all entries within the cache even when these are higher security and that client has no justifiable need for them If the cache key can be either predicted guessed or found by exhaustive searching its cache entry may be retrieved Some attempt to isolate setting and reading data may be made in situations such as high volume web publishing A farm of outward facing content servers have read access to memcached containing published pages or page components but no write access Where new content is published and is not yet in memcached a request is instead sent to content generation servers that are not publicly accessible to create the content unit and add it to memcached The content server then retries to retrieve it and serve it outwards Used as a DDoS attack vector edit In February 2018 CloudFlare reported that misconfigured memcached servers were used to launch DDoS attacks in large scale 21 The memcached protocol over UDP has a huge amplification factor of more than 51000 22 Victims of the DDoS attacks include GitHub which was flooded with 1 35 Tbit s peak incoming traffic 23 This issue was mitigated in Memcached version 1 5 6 which disabled UDP protocol by default 24 Example code editNote that all functions described on this page are pseudocode only Memcached calls and programming languages may vary based on the API used Converting database or object creation queries to use Memcached is simple Typically when using straight database queries example code would be as follows function get foo int userid data db select SELECT FROM users WHERE userid userid return data After conversion to Memcached the same call might look like the following function get foo int userid first try the cache data memcached fetch userrow userid if not data not found request database data db select SELECT FROM users WHERE userid userid then store in cache until next get memcached add userrow userid data end return data The client would first check whether a Memcached value with the unique key userrow userid exists where userid is some number If the result does not exist it would select from the database as usual and set the unique key using the Memcached API add function call However if only this API call were modified the server would end up fetching incorrect data following any database update actions the Memcached view of the data would become out of date Therefore in addition to creating an add call an update call would also be needed using the Memcached set function function update foo int userid string dbUpdateString first update database result db execute dbUpdateString if result database update successful fetch data to be stored in cache data db select SELECT FROM users WHERE userid userid the previous line could also look like data createDataFromDBString dbUpdateString then store in cache until next get memcached set userrow userid data This call would update the currently cached data to match the new data in the database assuming the database query succeeds An alternative approach would be to invalidate the cache with the Memcached delete function so that subsequent fetches result in a cache miss Similar action would need to be taken when database records were deleted to maintain either a correct or incomplete cache An alternate cache invalidation strategy is to store a random number in an agreed upon cache entry and to incorporate this number into all keys that are used to store a particular kind of entry To invalidate all such entries at once change the random number Existing entries which were stored using the old number will no longer be referenced and so will eventually expire or be recycled function store xyz entry int key string value Retrieve the random number use zero if none exists yet The key name used here is arbitrary seed memcached fetch xyz seed if not seed seed 0 Build the key used to store the entry and store it The key name used here is also arbitrary Notice that the seed and the user s key are stored as separate parts of the constructed hashKey string xyz data seed key This is not mandatory but is recommended string hashKey sprintf xyz data d d seed key memcached set hashKey value fetch entry not shown follows identical logic to the above function invalidate xyz cache existing seed memcached fetch xyz seed Coin a different random seed do seed rand until seed existing seed Now store it in the agreed upon place All future requests will use this number Therefore all existing entries become un referenced and will eventually expire memcached set xyz seed seed Usage editMySQL directly supports the Memcached API as of version 5 6 25 Oracle Coherence directly supports the Memcached API as of version 12 1 3 26 Infinispan directly supports Memcached 27 See also edit nbsp Free and open source software portal Amazon ElastiCache Aerospike Couchbase Server Redis Mnesia MemcacheDB Hazelcast Cassandra ScyllaDB Tarantool Ehcache InfinispanReferences edit a b Memcached license GitHub Retrieved 2014 06 27 Google Code Archive Long term storage for Google Code Project Hosting Code google com Retrieved 2017 06 25 Google Code Archive Long term storage for Google Code Project Hosting Code google com Retrieved 2017 06 25 1 Community livejournal com 2003 05 22 Retrieved on 2013 09 18 2 Community livejournal com 2003 05 27 Retrieved on 2013 09 18 lj dev memcached 2013 02 25 Archived from the original on 2013 02 25 Retrieved 2017 06 25 Cuong Do Cuong Engineering manager at YouTube Google June 23 2007 Seattle Conference on Scalability YouTube Scalability Online Video 26th minute Seattle Google Tech Talks Whitaker Keir 2010 05 17 Steve Huffman on Lessons Learned at Reddit Carsonified Archived from the original on 2010 05 17 Retrieved 2017 06 25 Scaling memcached at Facebook Facebook com 2008 12 12 Retrieved 2017 06 25 Scaling Memcache at Facebook USENIX 2002 ISBN 9781931971003 Retrieved 2017 06 25 Building Pinterest in the cloud Pinterest Careers 2013 06 19 Retrieved 2018 03 09 A comprehensive fast pure Python memcached client Github com 2018 01 08 Retrieved 2018 03 09 It s Not Rocket Science But It s Our Work Blog twitter com 2008 06 01 Retrieved 2017 06 25 memcached MediaWiki Retrieved 2017 06 25 Rez BoF SIGGRAPH 2019 archived from the original on 2021 12 12 retrieved 2019 08 09 Memcache Examples App Engine standard environment for Python Google Cloud Platform Code google com 2017 03 22 Retrieved 2017 06 25 About In Role Cache for Azure Cache Msdn microsoft com 2015 08 25 Retrieved 2017 06 25 Verge Jason 2014 09 23 Redis Labs We Have 3 000 Paying Cloud In Memory NoSQL Customers Data Center Knowledge Retrieved 2016 09 10 AWS Amazon ElastiCache in memory data store and cache Aws amazon com Retrieved 2017 06 25 SensePost Blackhat write up Go derper and mining memcaches Archived from the original on 2018 12 21 Retrieved 2016 09 02 Memcrashed Major amplification attacks from UDP port 11211 CloudFlare 27 Feb 2018 Retrieved 3 March 2018 Jeffrey Cal Mar 1 2018 GitHub falls victim to largest DDoS attack ever recorded February 28th DDoS Incident Report March 1 2018 Retrieved 3 March 2018 Memcached 1 5 6 Release Notes GitHub 2018 02 27 Retrieved 3 March 2018 Speedy MySQL 5 6 takes aim at NoSQL MariaDB Theregister co uk Retrieved 2017 06 25 David Felcey 2014 08 13 Getting Started With The Coherence Memcached Adaptor Oracle Coherence Blog Blogs oracle com Archived from the original on 2017 02 23 Retrieved 2017 06 25 Using the Memcached protocol endpoint with Infinispan infinispan org Retrieved 2022 04 19 External links editOfficial website nbsp Retrieved from https en wikipedia org w index php title Memcached amp oldid 1220783823, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.