Memcached - 追加数据
Memcached - 追加数据
Section titled “Memcached - 追加数据”Memcached 的 append 命令用于将数据添加到现有值的末尾。此操作是原子的,但不如 set 或 cas 常用。它适用于需要随着时间逐步构建值(例如日志记录或跟踪)的场景,而无需首先获取整个值。
重要提示:append 仅在键已存在时才有效。它不会创建新键。
append 命令的基本语法如下:
append key flags exptime bytes [noreply]valueflags 和 exptime 参数当前被服务器忽略,但为了语法兼容性是必需的。bytes 和 value 是您希望追加的数据。
STORED(已存储)表示数据已成功追加。NOT_STORED(未存储)表示追加失败,最常见的原因是键不存在。CLIENT_ERROR(客户端错误)表示语法错误。
Telnet 示例
Section titled “Telnet 示例”此示例显示 append 在不存在的键上会失败,但在使用 set 命令创建键后会成功。
# 1. 尝试向一个不存在的键追加数据。append activity_log 0 0 7,startNOT_STORED
# 2. 为该键设置一个初始值。set activity_log 0 900 4initSTORED
# 3. 向现有键追加数据。append activity_log 0 900 7,startSTORED
# 4. 检查结果。get activity_logVALUE activity_log 0 11init,startEND
# 5. 再次追加。append activity_log 0 900 5,stopSTORED
# 6. 检查最终结果。get activity_logVALUE activity_log 0 16init,start,stopEND现代应用:使用 Python 追加数据
Section titled “现代应用:使用 Python 追加数据”以下是如何在 Python 中使用 pymemcache 库的 append 功能。
确保 pymemcache 已安装:
pip install pymemcachePython 代码示例
Section titled “Python 代码示例”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_created2023-10-27T10:01:00Z:profile_viewed2023-10-27T10:02:00Z:logged_out--------------------------最佳实践与注意事项
Section titled “最佳实践与注意事项”- 数据格式:
append操作在字节级别进行。它不理解 JSON 或列表等数据结构。如果您存储一个序列化的 JSON 字符串并向其追加,您很可能会创建无效的 JSON。它最适用于原始文本、日志或逗号分隔的值。 - 读-修改-写 的替代方案:
append的主要优点是避免了get-> 连接 ->set的循环,这减少了网络流量,并且如果您只向值的末尾添加数据,则无需使用 CAS。 prepend命令: 还有一个对应的prepend命令,它将数据添加到值的开头。它与append具有相同的语法和约束。- 有限的用例: 在现代系统中,结构化数据(如 JSON)更常见。对于列表,通常最好使用专为数据结构设计的工具,如 Redis 列表。因此,
append在今天有更多的利基应用。