Memcached 是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,通过在内存中缓存数据和对象来加速动态 Web 应用,其命令行工具提供了丰富的操作指令,set 命令是最基础也是最常用的命令之一,用于向 Memcached 中存储一个键值对,本文将详细介绍 set 命令的使用方法、参数选项、实际应用场景及注意事项。

set 命令的基本语法
set 命令的基本语法结构如下:
set key flags exptime bytes [noreply]
value
各参数的具体含义如下:
| 参数 | 说明 | 示例 |
|---|---|---|
| key | 要存储的键名,必须是唯一的字符串,用于后续检索数据 | set user:1001 0 360 10 |
| flags | 32 位无符号整数,服务器与客户端之间用于传递额外的信息,通常用于标识数据类型(如序列化方式),客户端可自行解释其含义 | set session:abc 123 60 5 |
| exptime | 过期时间(秒),0 表示永不过期;如果大于 30 天(2592000 秒),Memcached 会将其视为 Unix 时间戳(从 1970 年 1 月 1 日开始的秒数) | set cache:page 0 300 20(5分钟后过期) |
| bytes | 数据值的字节数,不包括换行符,后续输入的数据长度必须与此值严格匹配 | set data:json 0 0 15(数据长度为15字节) |
| noreply | 可选参数,如果指定,服务器不会返回任何响应,适用于批量写入且不需要立即确认的场景 | set log:entry 1 60 8 noreply |
| value | 实际存储的数据内容,需单独一行输入,且长度必须与 bytes 参数一致 |
hello world(对应上述bytes=15的示例) |
set 命令的参数详解
-
key 的命名规范
key 是 Memcached 中数据的唯一标识,建议采用具有业务语义的命名方式(如user:1001:profile),避免使用特殊字符,且长度不超过 250 字节,重复的 key 会覆盖原有数据。 -
flags 的使用场景
flags 本身不存储业务数据,而是作为客户端的“元数据标记”,客户端可以约定flags=1表示数据是 JSON 序列化后的字符串,flags=2表示数据是 PHP 序列化格式,读取时根据 flags 选择反序列化方式。
(图片来源网络,侵删) -
exptime 的过期策略
- 相对时间:设置正整数(如
360表示 360 秒后过期),适用于临时缓存(如验证码、会话数据)。 - 绝对时间:设置大于 2592000 的整数(如
1735689600表示 2025 年 1 月 1 日 0 点),适用于定时失效的数据(如每日新闻缓存)。 - 永不过期:设置为
0,但需注意 Memcached 可能因内存不足淘汰数据(LRU 策略)。
- 相对时间:设置正整数(如
-
bytes 的注意事项
bytes必须准确匹配实际数据的字节数,若输入数据长度不足,服务器会以\0填充;若超出,则命令失败。set test 0 0 3后输入abc成功,输入abcd会报错。 -
noreply 的性能优化
在批量写入数据时(如初始化缓存),使用noreply可以减少网络往返时间,提高写入效率,但需确保写入逻辑正确,因为服务器不会返回错误信息。
set 命令的实际应用示例
示例 1:存储用户会话信息

set session:abc123 1 180 25
{"user_id":1001,"login_time":1634567890}
解释:存储一个 JSON 格式的会话数据,flags=1 表示 JSON 类型,180 秒后过期,数据长度为 25 字节。
示例 2:永不过期的配置缓存
set app:config 0 0 42
{"theme":"dark","lang":"zh-CN"}
解释:存储应用配置,不设置过期时间,依赖 Memcached 内存管理。
示例 3:使用 noreply 批量写入
set cache:page1 0 300 20 noreply HTML content... set cache:page2 0 300 25 noreply HTML content...
解释:批量写入两个页面缓存,忽略服务器响应,提高写入效率。
set 命令的注意事项
- 覆盖行为:
set命令会直接覆盖已存在的 key,若需避免覆盖,可先用gets命令检查 key 是否存在。 - 内存限制:Memcached 不会因单个
set命令超过剩余内存而失败,但可能导致后续操作因内存不足被拒绝。 - 数据类型:Memcached 仅支持存储字符串类型,复杂对象需客户端序列化后再存储。
- 网络延迟:在高并发场景下,
set命令的响应时间可能受网络影响,建议结合cas(Check-And-Set)命令处理并发写入。
相关问答FAQs
Q1:set 命令与 add、replace 命令有什么区别?
A:set 命令会无条件覆盖已存在的 key;add 命令仅在 key 不存在时执行写入,若 key 已存在则失败;replace 命令仅在 key 已存在时执行写入,若 key 不存在则失败,三者均用于存储数据,但语义不同,需根据业务场景选择。
Q2:如何验证 set 命令是否成功执行?
A:若未使用 noreply 参数,set 命令成功时服务器会返回 STORED,失败时返回 CLIENT_ERROR(参数错误)或 NOT_STORED(如 add 命令中 key 已存在),可通过 get key 命令检查数据是否正确存储,或使用 stats 命令查看服务器状态(如 cmd_set 计数器)。
