Memcached get 命令

Memcached get 命令详解(2025 版)

get 是 Memcached 最核心的读命令,用于 获取一个或多个 key 的值,是 缓存命中率的核心指标


1. 基本语法

get <key> [<key> ...]\r\n
参数说明
<key>键名(≤ 250 字节)
多个 key空格分隔,一次最多 100 个(建议 ≤ 50)

响应格式(每条):

VALUE <key> <flags> <bytes> [<cas_token>]\r\n
<value>\r\n

结束标志:END\r\n


2. telnet 基础示例

telnet 127.0.0.1 11211
# 1. 写入数据
set user:1001 8 3600 13
{"name":"张三"}
STORED

# 2. get 读取
get user:1001
VALUE user:1001 8 13
{"name":"张三"}
END

# 3. 多个 key
get user:1001 user:1002 config:db
VALUE user:1001 8 13
{"name":"张三"}
VALUE config:db 0 9
127.0.0.1
END

user:1002 不存在 → 不会返回,直接跳过


3. get vs gets(带 CAS)

命令是否返回 cas_token用途
get普通读取
getsCAS 乐观锁
# gets 示例
gets user:1001
VALUE user:1001 8 13 1
{"name":"张三"}
END

4. 客户端使用 get

Python(pymemcache)【推荐】

from pymemcache.client.base import Client

client = Client(('127.0.0.1', 11211))

# 单个 get
value = client.get('user:1001')
print(value)  # b'{"name":"张三"}'

# 批量 get(返回 dict)
data = client.get_many(['user:1001', 'user:1002', 'config:db'])
print(data)
# {b'user:1001': b'{"name":"张三"}', b'config:db': b'127.0.0.1'}

PHP

$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);

// 单个
$value = $mc->get('user:1001');

// 批量
$keys = ['user:1001', 'user:1002', 'config:db'];
$result = $mc->getMulti($keys);
print_r($result);

Java(XMemcached)

String v1 = client.get("user:1001");
Map<String, String> map = client.get(Arrays.asList("user:1001", "config:db"));

5. 响应字段详解

字段说明示例
VALUE命中标识VALUE key 0 5
<key>原始 keyuser:1001
<flags>客户端设置8(表示 JSON)
<bytes>value 字节数13
[<cas_token>]gets 才有1
<value>实际数据{"name":"张三"}
END结束标志END

6. 经典应用场景

场景推荐方式
用户资料缓存get user:{uid}
配置中心get config:* 批量
热点商品get product:hot:123
会话缓存get session:{token}
防穿透get → miss → DB → set

防缓存穿透(Python)

def get_user(uid):
    key = f'user:{uid}'
    data = client.get(key)
    if data is not None:
        return json.loads(data)

    # 缓存未命中
    data = db.query(uid)
    if data:
        client.set(key, json.dumps(data), expire=3600)
    else:
        # 防穿透:缓存空值
        client.set(key, 'null', expire=60)
    return data

7. 批量 get 最佳实践

建议说明
一次 ≤ 50 个 key避免单次请求过大
key 长度一致提高命中率
使用 pipeline部分客户端支持
失败重试网络抖动
# Python 批量 + 重试
def safe_get_many(keys, retries=2):
    for _ in range(retries):
        result = client.get_many(keys)
        if len(result) == len(keys):
            return result
        time.sleep(0.01)
    return result  # 部分命中

8. 性能与监控

关键指标

echo "stats" | nc 127.0.0.1 11211
指标说明
cmd_getget 次数
get_hits命中次数
get_misses未命中次数
命中率get_hits / cmd_get

目标命中率 > 90%

实时监控

watch -n 1 "echo 'stats' | nc 127.0.0.1 11211 | grep -E 'cmd_get|get_hits|get_misses'"

9. 常见问题

问题原因解决
END 直接返回key 不存在正常,需 DB 回源
数据乱码存储时未序列化json.dumps
超时网络/连接池增加 timeout
部分 key 缺失批量 get 中间失效重试或分批

10. 小结:get 命令速查

get key1 [key2 ...]
└─> VALUE key flags bytes [cas]
    <value>
    END
项目推荐
单次 key 数≤ 50
命中率目标> 90%
未命中处理DB + set
序列化JSON / Pickle

练习建议

  1. 用 telnet 实现 用户登录缓存
  2. 用 Python 实现 批量获取 100 个用户
  3. 实现 缓存预热脚本(启动时 set 热点数据)
  4. 监控 1 分钟内 get_hits 变化

需要 delete 命令、incr/decr 计数器、flush_all 清理?继续问我!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部