Skip to content

Memcached - 设置数据

Memcached 的 set 命令是最基本且使用最广泛的写入操作。它在缓存中存储一个键值对。如果键已经存在,set 将无条件地覆盖其当前值和过期时间。

当直接与 Memcached 交互时(例如,通过 telnet),其语法如下:

set key flags exptime bytes [noreply]
value
  • key:存储数据的键名。
  • flags(标志):一个 32 位整数,与值一起存储并在检索时返回。客户端库通常将其用于序列化元数据(例如,区分字符串、数字和 pickle 序列化对象)。
  • exptime(过期时间):以秒为单位的过期时间。值为 0 表示该项永不失效。如果值超过 30 天(2592000),则将其视为绝对过期时间的 Unix 时间戳。
  • bytes(字节数):value 的长度(以字节为单位)。
  • noreply(可选):指示服务器不发送响应,从而减少延迟。
  • value:要存储的数据,在新行中发送。
  • STORED(已存储)表示数据已成功存储。
  • ERROR(错误)表示存储过程中出现语法错误或其他问题。

此示例演示了设置一个键、验证它,然后用新值覆盖它的过程。

# 1. 设置键 'website:title',过期时间为 15 分钟(900 秒)。
set website:title 0 900 23
World's Largest Library
STORED
# 2. 检索该值以确认。
get website:title
VALUE website:title 0 23
World's Largest Library
END
# 3. 再次设置同一个键,使用新值。这会覆盖旧值。
set website:title 0 900 25
Modern Tech Tutorials
STORED
# 4. 验证新值已就位。
get website:title
VALUE website:title 0 25
Modern Tech Tutorials
END

在现代应用中,您会使用客户端库。以下是如何使用 Python 和 pymemcache 中的 set 命令,包括如何处理不同的数据类型。

首先,使用 pip 安装该库:

pip install pymemcache
import json
from pymemcache.client.base import Client
from 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'>
连接已关闭。
  • 主要缓存策略: 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 仅在键已存在时有效。