System Overview
Memcached functoins as a high-performance, distributed in-memory key-value store designed to speed up dynamic web applications by alleviating database load. It stores arbitrary data consisting of key-value pairs in RAM.
Prerequisites
To begin, ensure the server daemon is running locally or remotely on port 11211. The Python client library can be installed using:
pip install python-memcached
Initialization
Connect to the daemon within the application context.
from flask import Flask
import memcache
app = Flask(__name__)
cache_conn = memcache.Client(['127.0.0.1:11211'], debug=False)
Fundamental Commands
Key-Value Storage (set / set_multi)
Use set to insert or overwrite a single entry. If the key does not exist, it creates one; otherwise, it updates the existing value.
# Insert a single record
cache_conn.set('user_001', 'alice', time=300)
# Batch insert records
batch_data = {
'config_a': 'value_1',
'config_b': 'value_2'
}
cache_conn.set_multi(batch_data, time=60)
Parameters include the key, the value, an optional expiration time in seconds (0 indicates indefinite validity until restart), and compression settings.
Retrieving Data (get / get_multi)
Fetch values based on their keys. get targets a specific entry, returning None if absent. get_multi accepts a list of keys and returns a dictionary mapping keys to values.
active_user = cache_conn.get('user_001')
print(f"Current User: {active_user}")
batch_fetch = cache_conn.get_multi(['config_a', 'config_b'])
print(batch_fetch)
Conditional Inserts (add / replace)
These methods enforce strict existence checks to prevent accidental overwrites.
add: Fails silently (returns False) if the key already exists.replace: Fails silently if the key does not exist.
# Attempt to add a key that already exists
cache_conn.set('unique_id', 'old_value', time=120)
success = cache_conn.add('unique_id', 'new_value')
if not success:
print("Key existed, add aborted.")
# Replace an existing key safely
cache_conn.replace('unique_id', 'updated_value', time=120)
Numerical Operations (incr / decr)
Increment or decrement stored integer values atomically. This is useful for counters.
# Initialize counter
cache_conn.add('visit_count', 0)
# Increase count
current = cache_conn.incr('visit_count', 1)
# Decrease count by 10
current = cache_conn.decr('visit_count', 10)
Suffix/Prefix Modifications (append / prepend)
Extend the value of an existing key rather than replacing it.
cache_conn.set('log_entry', 'Event started.')
cache_conn.append('log_entry', '; completed.')
cache_conn.prepend('log_entry', '[INFO] ')
Deletion (delete / delete_multi)
Permanently remove keys from the cache storage.
# Remove specific entry
cache_conn.delete('user_001')
# Remove multiple entries
cache_conn.delete_multi(['config_a', 'config_b'])
Note that expiration times defined in seconds allow automatic cleanup without manual deletion. The default behavior relies on the server restart policy for persistent data if no TTL is specified.