Skip to main content

A high performance asynchronous Python client for Memcached with full batteries included

Project description

A high performance asynchronous Python client for Memcached with full batteries included

https://readthedocs.org/projects/emcache/badge/?version=latest https://github.com/emcache/emcache/workflows/CI/badge.svg https://github.com/emcache/emcache/workflows/PyPi%20release/badge.svg

Emcache stands on the giant’s shoulders and implements most of the characteristics that are desired for a Memcached client based on the experience of other Memcached clients, providing the following main characteristics:

  • Support for many Memcached hosts, distributing traffic around them by using the Rendezvous hashing algorithm.

  • Support for different commands and different flag behaviors like noreply, exptime or flags.

  • Support for SSL/TLS protocol.

  • Support for SASL authentication by ASCII protocol.

  • Support for autodiscovery, which should work with AWS and GCP memcached clusters.

  • Adaptative connection pool, which increases the number of connections per Memcache host depending on the traffic.

  • Node healthiness traceability and an optional flag for disabling unhealthy for participating in the commands.

  • Metrics for operations and connections, send them to your favourite TS database for knowing how the Emcache driver is behaving.

  • Listen to the most significant cluster events, for example for knowing when a node has been marked as unhealthy.

  • Speed, Emcache is fast. See the benchmark section.

Usage

For installing

pip install emcache

The following snippet shows the minimal stuff that would be needed for creating a new client and saving a new key and retrieving later the value.

import asyncio
import emcache
async def main():
    client = await emcache.create_client([emcache.MemcachedHostAddress('localhost', 11211)])
    await client.set(b'key', b'value')
    item = await client.get(b'key')
    print(item.value)
    await client.close()
asyncio.run(main())

Emcache has currently support, among many of them, for the following commands:

  • get Used for retrieving a specific key.

  • gets Cas version that returns also the case token of a specific key.

  • get_many Many keys get version.

  • gets_many Many keys + case token gets version.

  • gat Used retrieving a specific key if exists and update expiration time(Get and Touch).

  • gats Cas version that retrieving a specific key if exists and update expiration time(Get and Touch with Cas).

  • gat_many Many keys gat version.

  • gats_many Many keys + case token gats version.

  • set Set a new key and value

  • add Add a new key and value, if and only if it does not exist.

  • replace Update a value of a key, if and only if the key does exist.

  • append Append a value to the current one for a specific key, if and only if the key does exist.

  • prepend Prepend a value to the current one for a specific key, if and only if the key does exist.

  • cas Update a value for a key if and only if token as provided matches with the ones stored in the Memcached server.

  • version Version string of this server.

  • flush_all Its effect is to invalidate all existing items immediately (by default) or after the expiration specified.

  • delete The command allows for explicit deletion of items.

  • touch The command is used to update the expiration time of an existing item without fetching it.

  • increment/decrement Commands are used to change data for some item in-place, incrementing or decrementing it.

  • cache_memlimit This command allow set in runtime cache memory limit.

  • stats Show a list of required statistics about the server, depending on the arguments.

  • verbosity Command control STDOUT/STDERR info, choose level and look logging memcached.

Take a look at the documentation for getting a list of all of the operations that are currently supported.

Some of the commands have support for the following behavior flags:

  • noreply for storage commands like set we do not wait for an explicit response from the Memcached server. Sacrifice the explicit ack from the Memcached server for speed.

  • flags for storage we can save an int16 value that can be retrieved later on by fetch commands.

  • exptime for storage commands this provides a way of configuring an expiration time, once that time is reached keys will be automatically evicted by the Memcached server

For more information about usage, read the docs.

Benchmarks

The following table shows how fast - operations per second - Emcache can be compared to the other two Memcached Python clients, aiomcache and pymemcache. For that specific benchmark two nodes were used, one for the client and one for the Memcached server, using 32 TCP connections and using 32 concurrent Asyncio tasks - threads for the use case of Pymemcache. For Emcache and Aiomcache uvloop was used as a default loop.

In the first part of the benchmark, the client tried to run as mucha set operations it could, and in a second step the same was done but using get operations.

Client

Concurrency

Sets opS/sec

Sets latency AVG

Gets opS/sec

Gets latency AVG

aiomcache

32

33872

0.00094

34183

0.00093

pymemcache

32

32792

0.00097

32961

0.00096

emcache

32

49410

0.00064

49212

0.00064

emcache (autobatching)

32

49410

0.00064

89052

0.00035

Emcache performed better than the other two implementations reaching almost 50K ops/sec for get and set operations. One autobatching is used it can boost the throughtput x2 (more info about autobatching below)

Another benchmark was performed for comparing how each implementation will behave in case of having to deal with more than 1 node, a new benchmark was performed with different cluster sizes but using the same methodology as the previous test by first, performing as many set operations it could and later as many get operations it could. For this specific use test with Aiomemcahce could not be used since it does not support multiple nodes.

Client

Concurrency

Memcahed Nodes

Sets opS/sec

Sets latency AVG

Gets opS/sec

Gets latency AVG

pymemcache

32

2

21260

0.00150

21583

0.00148

emcache

32

2

42245

0.00075

48079

0.00066

pymemcache

32

4

15334

0.00208

15458

0.00207

emcache

32

4

39786

0.00080

47603

0.00067

pymemcache

32

8

9903

0.00323

9970

0.00322

emcache

32

8

42167

0.00075

46472

0.00068

The addition of new nodes did not add almost degradation for Emcache, in the last test with 8 nodes Emcache reached 42K get ops/sec and 46K set ops/sec. On the other hand, Pymemcached suffered substantial degradation making Emcache ~x5 times. faster.

Autobatching

Autobatching provides you a way for fetching multiple keys using a single command, batching happens transparently behind the scenes without bothering the caller.

For start using the autobatching feature you must provide the parameter autobatching as True, hereby all usages of the get and gets command will send batched requests behind the scenes.

Get´s are piled up until the next loop iteration. Once the next loop iteration is reached all get´s are transmitted using the same Memcached operation.

Autobatching can boost up the throughput of your application x2/x3.

Development

Clone the repository and its murmur3 submodule

git clone --recursive git@github.com:emcache/emcache

Compile murmur3

pushd vendor/murmur3
make static
popd

Install emcache with dev dependencies

make install-dev

Testing

Run docker containers, add read write privileges

docker compose up -d
docker exec memcached_unix1 sh -c "chmod a+rw /tmp/emcache.test1.sock"
docker exec memcached_unix2 sh -c "chmod a+rw /tmp/emcache.test2.sock"

Run tests

make test

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

emcache-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (271.5 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

emcache-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (275.1 kB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

emcache-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (269.4 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

emcache-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (266.0 kB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

emcache-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (72.3 kB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

emcache-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl (73.9 kB view details)

Uploaded CPython 3.11 macOS 10.9+ x86-64

emcache-1.3.0-cp311-cp311-macosx_10_9_universal2.whl (112.1 kB view details)

Uploaded CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64)

emcache-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (243.8 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

emcache-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (245.1 kB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

emcache-1.3.0-cp310-cp310-macosx_11_0_arm64.whl (72.1 kB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

emcache-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl (73.5 kB view details)

Uploaded CPython 3.10 macOS 10.9+ x86-64

emcache-1.3.0-cp310-cp310-macosx_10_9_universal2.whl (111.5 kB view details)

Uploaded CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64)

emcache-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (246.7 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

emcache-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (248.1 kB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

emcache-1.3.0-cp39-cp39-macosx_11_0_arm64.whl (72.6 kB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

emcache-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl (74.1 kB view details)

Uploaded CPython 3.9 macOS 10.9+ x86-64

emcache-1.3.0-cp39-cp39-macosx_10_9_universal2.whl (112.6 kB view details)

Uploaded CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64)

emcache-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (244.5 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

emcache-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl (244.4 kB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64 manylinux: glibc 2.28+ ARM64

emcache-1.3.0-cp38-cp38-macosx_11_0_arm64.whl (73.3 kB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

emcache-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl (75.0 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

emcache-1.3.0-cp38-cp38-macosx_10_9_universal2.whl (114.1 kB view details)

Uploaded CPython 3.8 macOS 10.9+ universal2 (ARM64, x86-64)

File details

Details for the file emcache-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0993e9b762089522accbc217af757a6ddfe2407a6926c4d765ad5e03e2ba4408
MD5 478d561f46e34f336821526ed91e517c
BLAKE2b-256 27f595c0ff566bd1386cacdc4b34983da2d3ff4aaa5352761f9b601ef305d1e1

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e594391d61a99705f4b6d907759853008c76440144c4f9ac627663e6c73a5e34
MD5 b2be6c5e789067de036612cb77b11e75
BLAKE2b-256 225670d928f3126f88256d05d0080049cbec13c469e37b1c47e8541be174d71f

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 492b05fb2d3944ac0c90daa7e61e8100392eb8e21322738aaae27d1f05727a52
MD5 43cf7e3e28f4387a6a51973310bb5149
BLAKE2b-256 f315401b8cf24ea77a848d119c85197c55eaa6075a5512e1d6d953878a693d18

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ea25219ed739142a4adcaaa38e96654094eea8e8ff0d189283d76099fd2e095d
MD5 b26f54f13bf8ccca23b32a18d59ee644
BLAKE2b-256 71965a8c04d5adfc28d8ab604091d956f5c07a0cb04986dda40c0e8c61212201

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d87467ad8aceec0ac86072edad19d77826f3cb30a46b8076acc07fde5da8c273
MD5 93cf7d6c600b4ea25d48b5283fe64109
BLAKE2b-256 c2e32addcf231237997880b703a3fca4055bff5b2f033d66ecacb7fdb6a9e1d4

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 500d2ec4b05491d77497438e5f924965ecbb3e5482e9d3299685d895f9695f2d
MD5 3a542e51e50514c8248a8432bafe9bf8
BLAKE2b-256 e21aa1daef8fb802d3db521e2390faeff44f4b6f0fc8fd1bbf6a28549d3ee6d9

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp311-cp311-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp311-cp311-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 6e4df115ff7c18f61e6b7afe6afad653b92ce7dc5e14e9974505058cbbbb56f1
MD5 538e352898b96ba97e3fa39139792790
BLAKE2b-256 a3725d2efefc115b366d71e69a4a4f7a78ffeb9958c18ba7e1801c2a8b62fb0a

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84906ee5eb5d628cddcaf5739bf917e4e324bc6500d5bfeb6a6a6963156df5b8
MD5 bdb678bf80dc9e554d49438cf86cc75d
BLAKE2b-256 01f8e2110e3ecc88370181af3223d7e327bdc62af15146a8e9aacab2f8d9d3d8

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1214b8ea3a6e91b89baf885f5816a02d9546cb58d0ea5cabc259b9a30cda2881
MD5 3caea35925b80b1508bd98c25fb0296a
BLAKE2b-256 e37129d5a67e64e30e779df8464f2c62625a42f5458f38706e9b3df7b13e8234

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 04d85fc7a65a2963e082a9ab0a27a37b853909a32c05c6664d8ea0ca0ca12d74
MD5 e8d252a63fff5b9d53fb576279109229
BLAKE2b-256 81f773d7a6e5b645348b1346b0dfa2ba6a2285f93451f5abd379be40d0148b76

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1bb6738ba17b045f69768cfe09baa61dbd1b0553ac106a2508dc95d92d7f4fc0
MD5 91f479543e24992700fa38adae86d1de
BLAKE2b-256 dbf392750a5ce4aabe30418c51a9e0483b301d7fedc5f6b8beed8def487ad4ab

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp310-cp310-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp310-cp310-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 ab39d404ea3619b95c37e9a57d463f5f4e571a45637eba526e2e246e7afb6ad7
MD5 451ceb9c3d05a53826cfc9d88c7dabcc
BLAKE2b-256 171ee1f13c24ca32c1ba79a6231522a3bab9581aaab82b2ca55d410a60ec540f

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6c7c9f0855a879d59db6e9c12a792c6fc1e4d0473dd4a5edcc7d38b3662ff016
MD5 2b93fbade694352d76650092dfd06313
BLAKE2b-256 55916b14fac65d8ddb71b6cd24e0accce932a451452f3d18e4cb737b8e9fd1b0

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 cfb1f70a2a5bd4fc29c048bb3084f0e76d8d3c40411b7eb66e485dae9bb9e843
MD5 9c1deabfdb04654f53652578c4d4dc1c
BLAKE2b-256 03e3d9381eca3dc9d0b77fcbe526348a92b741056b2d67f384b3e81008b6163e

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6ddb0a6aa9a3c9fa75010496c85d0bd9d2b5b4b325849e008e762b9e58950d6e
MD5 8e562db305173f4837c2e0982e9755d6
BLAKE2b-256 fde9c0dc293f60523af7a5726031a76ac90d21c698c0fdbbd4c44dd64a73cf0c

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 fefbadeafa710fc963e68f5980d4b4e2951362dacfe3ba89c629367f220519cb
MD5 7b225b617d44f00c61de7e51c7c6dc2a
BLAKE2b-256 4edb2a5cf2eea68695efddc1d2dfcfdd4d6b8185e618ceb7a3150714f5b998f5

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp39-cp39-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp39-cp39-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 7966d59f52ae82ed2dcc924d92edd94e8858862da013aebb484e3b545d410dd3
MD5 8dbb2cea3dfc771776bd2c0c07ee0da0
BLAKE2b-256 501d111ff145bce09b01967474193a53a36f0eda45dfaa1ef4cb0259f10a901a

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e310dffce8ed046f8125348b97e521dd368aea0e0e1e9694217f8e7138d28ad
MD5 18610981f42fa2489f9e3bf8ad4f9688
BLAKE2b-256 ca8832454209eea4a05045d87f350e39cf215afdb8694bb0e2a8aa2f5328636a

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 241704f95421bf5cd85411902ce4a8b85ac86cb4a636645769be4248f0996a96
MD5 612f15c0c7eef2a5cf7938655b63b488
BLAKE2b-256 2d83de0e7c2e40a22f3b06e7ea7675d46a1234b2d8f7547d6359dd77384a7f59

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8110848a995abacae2bcacd6e58349a1af83d93cfd520adb628a102377e3fe3e
MD5 91a590fd0364ab6993ca7238112dfa93
BLAKE2b-256 91e7c46f9c60a7370d9711329f8b796714fdaa6b87f00c88f0f5b8528cffc8a3

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 6bce7b95b3878cb27c4d28e00187933e3f927c55e2ccc9b62ef1dc94fef0d45a
MD5 a01dbc5ab9590c1738e343d03bbc4233
BLAKE2b-256 80920b508156dbe77d7b8cb495b17262d50cfede087ef24310e96e65e48a6f94

See more details on using hashes here.

File details

Details for the file emcache-1.3.0-cp38-cp38-macosx_10_9_universal2.whl.

File metadata

File hashes

Hashes for emcache-1.3.0-cp38-cp38-macosx_10_9_universal2.whl
Algorithm Hash digest
SHA256 d061591c094f22d1a800f1a450597243f9cb52e0e8cd48e2be0ee7703ecf91a0
MD5 2dfb095dee697c0464bf6459a10399ec
BLAKE2b-256 95e7efe54140fac7b473b01c53dc6fa0fd00935e62de3a7ebfcde69c0994c1de

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page