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
否
普通读取
gets
是
CAS 乐观锁
# 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'}
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 # 部分命中