Memcached - 设置数据
Memcached - 使用 Set 存储数据
Section titled “Memcached - 使用 Set 存储数据”Memcached 的 set 命令是最基本且使用最广泛的写入操作。它在缓存中存储一个键值对。如果键已经存在,set 将无条件地覆盖其当前值和过期时间。
当直接与 Memcached 交互时(例如,通过 telnet),其语法如下:
set key flags exptime bytes [noreply]valuekey:存储数据的键名。flags(标志):一个 32 位整数,与值一起存储并在检索时返回。客户端库通常将其用于序列化元数据(例如,区分字符串、数字和 pickle 序列化对象)。exptime(过期时间):以秒为单位的过期时间。值为0表示该项永不失效。如果值超过 30 天(2592000),则将其视为绝对过期时间的 Unix 时间戳。bytes(字节数):value的长度(以字节为单位)。noreply(可选):指示服务器不发送响应,从而减少延迟。value:要存储的数据,在新行中发送。
STORED(已存储)表示数据已成功存储。ERROR(错误)表示存储过程中出现语法错误或其他问题。
Telnet 示例
Section titled “Telnet 示例”此示例演示了设置一个键、验证它,然后用新值覆盖它的过程。
# 1. 设置键 'website:title',过期时间为 15 分钟(900 秒)。set website:title 0 900 23World's Largest LibrarySTORED
# 2. 检索该值以确认。get website:titleVALUE website:title 0 23World's Largest LibraryEND
# 3. 再次设置同一个键,使用新值。这会覆盖旧值。set website:title 0 900 25Modern Tech TutorialsSTORED
# 4. 验证新值已就位。get website:titleVALUE website:title 0 25Modern Tech TutorialsEND现代应用:使用 Python 存储数据
Section titled “现代应用:使用 Python 存储数据”在现代应用中,您会使用客户端库。以下是如何使用 Python 和 pymemcache 中的 set 命令,包括如何处理不同的数据类型。
首先,使用 pip 安装该库:
pip install pymemcache带序列化的 Python 代码示例
Section titled “带序列化的 Python 代码示例”import jsonfrom pymemcache.client.base import Clientfrom pymemcache.serde import Serde
MEMCACHED_SERVER = ('127.0.0.1', 11211)
# 最佳实践:对非字符串数据使用序列化器。# 这确保数据以一致的方式存储和检索。json_serde = Serde( serializer=lambda k, v: (json.dumps(v).encode('utf-8'), 1), deserializer=lambda k, v, f: json.loads(v.decode('utf-8')) if f == 1 else v)
def run_set_example(): """演示在 Memcached 中设置各种数据类型。""" # 在初始化时将序列化器传递给客户端 client = Client(MEMCACHED_SERVER, serde=json_serde)
try: # --- 示例 1: 存储一个简单字符串 --- key1 = 'api:status_message' value1 = 'Service is running normally.' client.set(key1, value1, expire=300) retrieved1 = client.get(key1) print(f"设置并获取字符串: '{retrieved1}'")
# --- 示例 2: 存储一个字典(使用 JSON 序列化器/反序列化器) --- key2 = 'user:profile:42' value2 = { 'username': 'jane_doe', 'email': 'jane.doe@example.com', 'roles': ['editor', 'commenter'], 'last_login_ts': 1672531200 } client.set(key2, value2, expire=3600) retrieved2 = client.get(key2) print(f"设置并获取字典: {retrieved2}") print(f"检索到的对象类型: {type(retrieved2)}")
except Exception as e: print(f"发生意外错误: {e}") finally: client.close() print("连接已关闭。")
if __name__ == "__main__": run_set_example()设置并获取字符串: 'Service is running normally.'设置并获取字典: {'username': 'jane_doe', 'email': 'jane.doe@example.com', 'roles': ['editor', 'commenter'], 'last_login_ts': 1672531200}检索到的对象类型: <class 'dict'>连接已关闭。最佳实践与实际应用
Section titled “最佳实践与实际应用”- 主要缓存策略:
set是缓存的主力。最常见的用例是缓存昂贵的数据库查询或 API 调用的结果。Web 应用程序会首先尝试从 Memcached 中get数据。如果缓存未命中,则从数据库中获取,然后使用set将结果存储在缓存中以供后续请求使用。 - 明智地选择 TTL: 设置合适的
Time-To-Live (expire)(生存时间)至关重要。对于不经常更改的数据,较长的 TTL 是可以的。对于快速更改的数据,较短的 TTL(例如 60 秒)更适合以减少过时。永不过期的键(expire=0)应谨慎使用,因为它们可能填满缓存。 - 序列化: 对于复杂数据类型,始终使用一致的序列化方法(如 JSON)。这确保您
set的内容就是您get的内容,无论用于访问缓存的客户端库或编程语言是什么。 set、add与replace的区别: 请记住它们的区别:set总是有效(创建或更新)。add仅在键不存在时有效。replace仅在键已存在时有效。