Skip to content

Memcached - 追加数据

Memcached 的 append 命令用于将数据添加到现有值的末尾。此操作是原子的,但不如 set 或 cas 常用。它适用于需要随着时间逐步构建值(例如日志记录或跟踪)的场景,而无需首先获取整个值。

重要提示:append 仅在键已存在时才有效。它不会创建新键。

append 命令的基本语法如下:

append key flags exptime bytes [noreply]
value

flags 和 exptime 参数当前被服务器忽略,但为了语法兼容性是必需的。bytes 和 value 是您希望追加的数据。

  • STORED(已存储)表示数据已成功追加。
  • NOT_STORED(未存储)表示追加失败,最常见的原因是键不存在。
  • CLIENT_ERROR(客户端错误)表示语法错误。

此示例显示 append 在不存在的键上会失败,但在使用 set 命令创建键后会成功。

# 1. 尝试向一个不存在的键追加数据。
append activity_log 0 0 7
,start
NOT_STORED
# 2. 为该键设置一个初始值。
set activity_log 0 900 4
init
STORED
# 3. 向现有键追加数据。
append activity_log 0 900 7
,start
STORED
# 4. 检查结果。
get activity_log
VALUE activity_log 0 11
init,start
END
# 5. 再次追加。
append activity_log 0 900 5
,stop
STORED
# 6. 检查最终结果。
get activity_log
VALUE activity_log 0 16
init,start,stop
END

以下是如何在 Python 中使用 pymemcache 库的 append 功能。

确保 pymemcache 已安装:

pip install pymemcache
from pymemcache.client.base import Client
MEMCACHED_SERVER = ('127.0.0.1', 11211)
def run_append_example():
"""演示 append 操作。"""
client = Client(MEMCACHED_SERVER)
key = 'audit_trail:user:77'
# 确保我们有一个干净的环境
client.delete(key)
try:
# 1. 尝试向一个不存在的键追加数据
# 注意:追加必须是字节数据。
was_appended = client.append(key, b':login_failed')
print(f"-> APPEND 到不存在的键 '{key}'... 成功: {was_appended}")
# 2. 设置初始值
# 注意:值必须是字节、字符串或可序列化的。
client.set(key, b'2023-10-27T10:00:00Z:session_created', expire=600)
print(f"-> SET: 初始化键 '{key}'。")
# 3. 向现有键追加数据
was_appended = client.append(key, b'\n2023-10-27T10:01:00Z:profile_viewed')
print(f"-> APPEND 到现有键... 成功: {was_appended}")
# 4. 追加另一个事件
was_appended = client.append(key, b'\n2023-10-27T10:02:00Z:logged_out')
print(f"-> APPEND 再次... 成功: {was_appended}")
# 5. 检索最终连接的值
final_value = client.get(key)
if final_value:
print("\n--- 缓存中的最终值 ---")
print(final_value.decode('utf-8'))
print("--------------------------")
except Exception as e:
print(f"发生意外错误: {e}")
finally:
client.close()
if __name__ == "__main__":
run_append_example()
-> APPEND 到不存在的键 'audit_trail:user:77'... 成功: False
-> SET: 初始化键 'audit_trail:user:77'。
-> APPEND 到现有键... 成功: True
-> APPEND 再次... 成功: True
--- 缓存中的最终值 ---
2023-10-27T10:00:00Z:session_created
2023-10-27T10:01:00Z:profile_viewed
2023-10-27T10:02:00Z:logged_out
--------------------------
  • 数据格式: append 操作在字节级别进行。它不理解 JSON 或列表等数据结构。如果您存储一个序列化的 JSON 字符串并向其追加,您很可能会创建无效的 JSON。它最适用于原始文本、日志或逗号分隔的值。
  • 读-修改-写 的替代方案: append 的主要优点是避免了 get -> 连接 -> set 的循环,这减少了网络流量,并且如果您只向值的末尾添加数据,则无需使用 CAS。
  • prepend 命令: 还有一个对应的 prepend 命令,它将数据添加到值的开头。它与 append 具有相同的语法和约束。
  • 有限的用例: 在现代系统中,结构化数据(如 JSON)更常见。对于列表,通常最好使用专为数据结构设计的工具,如 Redis 列表。因此,append 在今天有更多的利基应用。