Memcached教程FG003-Memcached命令行操作实战
本文档风哥主要介绍Memcached数据库命令行操作相关知识,包括Memcached数据库命令概述、命令语法规范、存储命令、读取命令、管理命令、批量操作、CAS操作、统计信息查看等内容,风哥教程参考Memcached官方文档Command Reference等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 Memcached数据库命令概述
Memcached提供了丰富的命令行接口,支持数据的存储、读取、删除和管理操作。更多视频教程www.fgedu.net.cn
1.1.1 协议类型
# 1. 文本协议(ASCII Protocol)
特点:
– 人类可读,便于调试
– 通过telnet直接操作
– 兼容性好,广泛支持
# 2. 二进制协议(Binary Protocol)
特点:
– 更高效,解析速度快
– 支持更多特性
– 减少网络传输
# 默认使用文本协议
# 可通过-B参数指定协议
-B auto # 自动选择(默认)
-B ascii # 仅文本协议
-B binary # 仅二进制协议
1.1.2 连接方式
# 方式1:telnet连接
$ telnet 192.168.1.100 11211
Trying 192.168.1.100…
Connected to 192.168.1.100.
Escape character is ‘^]’.
# 方式2:nc(netcat)连接
$ nc 192.168.1.100 11211
# 方式3:使用管道方式
$ echo “stats” | nc 192.168.1.100 11211
# 方式4:使用memcached-tool
$ memcached-tool 192.168.1.100:11211 stats
1.2 Memcached数据库命令语法规范
Memcached命令遵循特定的语法格式,理解这些格式对于正确使用命令至关重要。学习交流加群风哥微信: itpux-com
1.2.1 存储命令语法
\r\n
# 参数说明
[noreply] 可选,不返回响应
数据内容
# 示例
set fgedu_user 0 3600 12
Hello World!
1.2.2 读取命令语法
get
gets
# 参数说明
# 示例
get fgedu_user
gets fgedu_user fgedu_product
# 响应格式
VALUE
\r\n
END\r\n
1.2.3 删除命令语法
delete
# 参数说明
# 示例
delete fgedu_user
delete fgedu_user 10 # 10秒后删除
1.3 Memcached数据库命令分类解析
Memcached命令可以分为以下几类:
1.3.1 存储命令
# set – 存储数据(存在则覆盖)
set
# add – 添加数据(仅当key不存在时)
add
# replace – 替换数据(仅当key存在时)
replace
# append – 追加数据到现有值末尾
append
# prepend – 追加数据到现有值开头
prepend
# cas – 检查并设置(Check And Set)
cas
1.3.2 读取命令
# get – 获取数据
get
# gets – 获取数据(包含CAS标识)
gets
# 示例
get fgedu_user fgedu_product
gets fgedu_user
1.3.3 管理命令
# delete – 删除数据
delete
# incr – 数值增加
incr
# decr – 数值减少
decr
# touch – 更新过期时间
touch
# flush_all – 清空所有数据
flush_all [
# stats – 查看统计信息
stats [
# version – 查看版本
version
# verbosity – 设置日志级别
verbosity
Part02-生产环境规划与建议
2.1 Memcached数据库Key设计规范
良好的Key设计对于Memcached的性能和可维护性至关重要。学习交流加群风哥QQ113257174
2.1.1 Key命名规范
# 推荐格式
前缀:业务标识:唯一ID
# 示例
user:profile:1001 # 用户资料
user:session:abc123 # 用户会话
product:info:2001 # 商品信息
product:list:category:10 # 商品列表
order:detail:3001 # 订单详情
cache:page:index # 页面缓存
# Key长度限制
– 最大长度:250字节
– 推荐长度:50字节以内
# Key命名规则
– 只能使用ASCII字符
– 不能包含空格和控制字符
– 建议使用字母、数字、下划线、冒号、短横线
# 禁止使用的字符
– 空格
– 换行符
– 制表符
– 其他控制字符
2.1.2 Key设计原则
- 唯一性:确保Key全局唯一,避免冲突
- 可读性:便于调试和监控,使用有意义的名称
- 简洁性:减少内存占用,避免过长的Key
- 一致性:统一命名风格,便于管理
- 可扩展性:考虑未来业务扩展需求
2.2 Memcached数据库Value设计规范
2.2.1 Value大小限制
# 默认限制
– 单个Value最大:1MB
– 可通过-I参数调整(最大128MB)
# 推荐大小
– 小于1KB:最佳性能
– 1KB-10KB:良好性能
– 10KB-100KB:可接受
– 大于100KB:不推荐
# 大Value处理方案
1. 数据压缩
2. 数据分片
3. 使用其他存储(如Redis)
2.2.2 Value序列化建议
# 常用序列化格式
# JSON格式(推荐)
优点:可读性好,跨语言支持
缺点:体积较大
示例:{“name”:”fgedu”,”age”:30}
# MessagePack格式
优点:体积小,速度快
缺点:可读性差
示例:二进制格式
# Protobuf格式
优点:体积最小,速度快
缺点:需要定义schema
# 纯文本格式
优点:简单直接
缺点:仅适用于简单数据
示例:Hello World
# 序列化选择建议
– 开发测试:JSON
– 生产环境:MessagePack或Protobuf
– 简单数据:纯文本
2.3 Memcached数据库命令使用建议
2.3.1 过期时间设置建议
# 过期时间类型
# 1. 相对时间(秒数)
– 小于30天(2592000秒):表示秒数
– 示例:3600表示1小时后过期
# 2. 绝对时间(Unix时间戳)
– 大于30天:表示Unix时间戳
– 示例:1712534400表示具体时间点
# 推荐设置
– 用户会话:30分钟(1800秒)
– 用户资料:1小时(3600秒)
– 商品信息:5分钟(300秒)
– 页面缓存:1-5分钟(60-300秒)
– 配置数据:1天(86400秒)
# 注意事项
– 0表示永不过期(不推荐)
– 过期后数据惰性删除
– 内存不足时可能提前淘汰
2.3.2 Flags标志位使用建议
# Flags定义(32位整数)
# 常用Flags定义
0 – 纯文本
1 – JSON格式
2 – PHP序列化
3 – Java序列化
4 – MessagePack
5 – GZIP压缩
6 – Snappy压缩
# 组合使用
# 高4位表示序列化方式,低4位表示压缩方式
# 例如:0x11 = JSON + GZIP
# 客户端示例
# 存储JSON数据
set user:1001 1 3600 45
{“name”:”fgedu”,”email”:”fgedu@example.com”}
# 存储压缩数据
set user:1002 5 3600 32
[压缩后的二进制数据]
Part03-生产环境项目实施方案
3.1 Memcached数据库存储命令实战
3.1.1 set命令实战
$ telnet 192.168.1.100 11211
Trying 192.168.1.100…
Connected to 192.168.1.100.
Escape character is ‘^]’.
# set命令:存储数据(存在则覆盖)
# 语法:set
# 存储简单字符串
set fgedu_welcome 0 3600 12
Hello World!
STORED
# 存储JSON数据
set fgedu_user:1001 1 3600 58
{“id”:1001,”name”:”fgedu”,”email”:”fgedu@example.com”}
STORED
# 存储带过期时间的数据(10秒后过期)
set fgedu_temp 0 10 8
tempdata
STORED
# 存储后立即验证
get fgedu_welcome
VALUE fgedu_welcome 0 12
Hello World!
END
# 使用noreply选项(不返回响应)
set fgedu_noreply 0 3600 8 noreply
testdata
# 验证存储成功
get fgedu_noreply
VALUE fgedu_noreply 0 8
testdata
END
3.1.2 add命令实战
# 添加新数据
add fgedu_new 0 3600 8
newdata
STORED
# 尝试添加已存在的key
add fgedu_new 0 3600 12
another data
NOT_STORED
# 验证数据未被覆盖
get fgedu_new
VALUE fgedu_new 0 8
newdata
END
# 应用场景:分布式锁
# 尝试获取锁
add lock:fgedu_order:1001 0 30 8
locked
STORED
# 其他客户端尝试获取锁
add lock:fgedu_order:1001 0 30 8
locked
NOT_STORED
# 锁已存在,获取失败
3.1.3 replace命令实战
# 先存储数据
set fgedu_replace 0 3600 8
olddata
STORED
# 替换数据
replace fgedu_replace 0 3600 8
newdata
STORED
# 验证替换成功
get fgedu_replace
VALUE fgedu_replace 0 8
newdata
END
# 尝试替换不存在的key
replace fgedu_notexist 0 3600 8
testdata
NOT_STORED
# 应用场景:更新缓存数据
# 确保数据存在才更新
3.1.4 append和prepend命令实战
# prepend命令:追加数据到开头
# 存储初始数据
set fgedu_append 0 3600 5
Hello
STORED
# 追加数据到末尾
append fgedu_append 0 3600 7
World!
STORED
# 验证结果
get fgedu_append
VALUE fgedu_append 0 12
Hello World!
END
# 追加数据到开头
prepend fgedu_append 0 3600 6
Hi,
STORED
# 验证结果
get fgedu_append
VALUE fgedu_append 0 18
Hi, Hello World!
END
# 应用场景:构建日志、计数器
# 注意:追加后总长度不能超过限制
3.2 Memcached数据库读取命令实战
3.2.1 get命令实战
# 存储测试数据
set fgedu_user:1001 1 3600 45
{“name”:”fgedu”,”age”:30,”city”:”beijing”}
STORED
set fgedu_user:1002 1 3600 42
{“name”:”test”,”age”:25,”city”:”shanghai”}
STORED
# 获取单个key
get fgedu_user:1001
VALUE fgedu_user:1001 1 45
{“name”:”fgedu”,”age”:30,”city”:”beijing”}
END
# 获取多个key
get fgedu_user:1001 fgedu_user:1002
VALUE fgedu_user:1001 1 45
{“name”:”fgedu”,”age”:30,”city”:”beijing”}
VALUE fgedu_user:1002 1 42
{“name”:”test”,”age”:25,”city”:”shanghai”}
END
# 获取不存在的key
get fgedu_notexist
END
# 混合获取(存在和不存在的key)
get fgedu_user:1001 fgedu_notexist fgedu_user:1002
VALUE fgedu_user:1001 1 45
{“name”:”fgedu”,”age”:30,”city”:”beijing”}
VALUE fgedu_user:1002 1 42
{“name”:”test”,”age”:25,”city”:”shanghai”}
END
3.2.2 gets命令实战
# 存储数据
set fgedu_cas 0 3600 8
testdata
STORED
# 使用gets获取数据
gets fgedu_cas
VALUE fgedu_cas 0 8 123
testdata
END
# 响应格式说明
# VALUE
#
# 再次获取,CAS值可能变化
gets fgedu_cas
VALUE fgedu_cas 0 8 123
testdata
END
# 更新数据后CAS值会变化
set fgedu_cas 0 3600 11
newtestdata
STORED
gets fgedu_cas
VALUE fgedu_cas 0 11 124
newtestdata
END
# 应用场景:乐观锁实现
# 使用CAS命令确保数据一致性
3.2.3 delete命令实战
# 存储数据
set fgedu_delete 0 3600 8
testdata
STORED
# 删除数据
delete fgedu_delete
DELETED
# 验证删除成功
get fgedu_delete
END
# 删除不存在的key
delete fgedu_notexist
NOT_FOUND
# 延迟删除(10秒后删除)
set fgedu_delayed 0 3600 8
testdata
STORED
delete fgedu_delayed 10
DELETED
# 数据仍然可以获取
get fgedu_delayed
VALUE fgedu_delayed 0 8
testdata
END
# 等待10秒后再获取
get fgedu_delayed
END
3.3 Memcached数据库管理命令实战
3.3.1 incr和decr命令实战
# decr命令:数值减少
# 存储数值类型数据
set fgedu_counter 0 3600 1
0
STORED
# 增加计数
incr fgedu_counter 1
1
incr fgedu_counter 5
6
incr fgedu_counter 10
16
# 验证结果
get fgedu_counter
VALUE fgedu_counter 0 2
16
END
# 减少计数
decr fgedu_counter 5
11
decr fgedu_counter 3
8
# 验证结果
get fgedu_counter
VALUE fgedu_counter 0 1
8
END
# 注意:decr不会变成负数
decr fgedu_counter 100
0
get fgedu_counter
VALUE fgedu_counter 0 1
0
END
# 对非数值类型操作会失败
set fgedu_string 0 3600 5
hello
STORED
incr fgedu_string 1
CLIENT_ERROR cannot increment or decrement non-numeric value
# 对不存在的key操作
incr fgedu_notexist 1
NOT_FOUND
3.3.2 touch命令实战
# 存储数据(10秒过期)
set fgedu_touch 0 10 8
testdata
STORED
# 更新过期时间为1小时
touch fgedu_touch 3600
TOUCHED
# 验证数据仍存在
get fgedu_touch
VALUE fgedu_touch 0 8
testdata
END
# 对不存在的key操作
touch fgedu_notexist 3600
NOT_FOUND
# 应用场景:延长热点数据的缓存时间
# 避免热点数据过期导致缓存穿透
3.3.3 flush_all命令实战
# 存储多条数据
set fgedu_a 0 3600 8
data_a
STORED
set fgedu_b 0 3600 8
data_b
STORED
set fgedu_c 0 3600 8
data_c
STORED
# 验证数据存在
get fgedu_a fgedu_b fgedu_c
VALUE fgedu_a 0 8
data_a
VALUE fgedu_b 0 8
data_b
VALUE fgedu_c 0 8
data_c
END
# 清空所有数据
flush_all
OK
# 验证数据已被清空
get fgedu_a fgedu_b fgedu_c
END
# 延迟清空(10秒后清空)
set fgedu_delay 0 3600 8
testdata
STORED
flush_all 10
OK
# 数据仍然存在
get fgedu_delay
VALUE fgedu_delay 0 8
testdata
END
# 等待10秒后数据被清空
get fgedu_delay
END
# 注意:flush_all是危险操作
# 生产环境慎用
Part04-生产案例与实战讲解
4.1 Memcached数据库批量操作实战
在生产环境中,批量操作可以提高效率。更多学习教程公众号风哥教程itpux_com
4.1.1 批量存储数据
# 创建批量存储脚本
$ cat > /tmp/batch_set.sh << 'EOF'
#!/bin/bash
# batch_set.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
HOST="192.168.1.100"
PORT="11211"
# 批量存储用户数据
for i in {1..100}; do
echo "set fgedu_user:$i 1 3600 45"
echo "{\"id\":$i,\"name\":\"user$i\",\"age\":$((20 + i % 30))}"
done | nc $HOST $PORT
EOF
# 执行批量存储
$ chmod +x /tmp/batch_set.sh
$ /tmp/batch_set.sh
STORED
STORED
STORED
...(省略部分输出)
STORED
# 验证存储结果
$ echo "stats" | nc 192.168.1.100 11211 | grep curr_items
STAT curr_items 100
4.1.2 批量读取数据
# 方式1:使用get命令获取多个key
$ echo -e “get fgedu_user:1 fgedu_user:2 fgedu_user:3\nquit” | nc 192.168.1.100 11211
VALUE fgedu_user:1 1 45
{“id”:1,”name”:”user1″,”age”:21}
VALUE fgedu_user:2 1 45
{“id”:2,”name”:”user2″,”age”:22}
VALUE fgedu_user:3 1 45
{“id”:3,”name”:”user3″,”age”:23}
END
# 方式2:使用脚本批量读取
$ cat > /tmp/batch_get.sh << 'EOF'
#!/bin/bash
# batch_get.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
HOST="192.168.1.100"
PORT="11211"
# 构建get命令
keys=""
for i in {1..10}; do
keys="$keys fgedu_user:$i"
done
echo "get $keys" | nc $HOST $PORT
EOF
$ chmod +x /tmp/batch_get.sh
$ /tmp/batch_get.sh
VALUE fgedu_user:1 1 45
{"id":1,"name":"user1","age":21}
VALUE fgedu_user:2 1 45
{"id":2,"name":"user2","age":22}
...(省略部分输出)
END
4.1.3 批量删除数据
# 创建批量删除脚本
$ cat > /tmp/batch_delete.sh << 'EOF'
#!/bin/bash
# batch_delete.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
HOST="192.168.1.100"
PORT="11211"
# 批量删除用户数据
for i in {1..50}; do
echo "delete fgedu_user:$i"
done | nc $HOST $PORT
EOF
$ chmod +x /tmp/batch_delete.sh
$ /tmp/batch_delete.sh
DELETED
DELETED
DELETED
...(省略部分输出)
DELETED
# 验证删除结果
$ echo "stats" | nc 192.168.1.100 11211 | grep curr_items
STAT curr_items 50
4.2 Memcached数据库CAS操作实战
4.2.1 CAS操作原理
# 步骤1:获取数据和CAS标识
gets fgedu_balance:1001
VALUE fgedu_balance:1001 0 4 123
1000
END
# 步骤2:计算新值
# 假设新值为1500
# 步骤3:使用CAS更新
cas fgedu_balance:1001 0 3600 4 123
1500
STORED
# 如果CAS值不匹配(数据已被其他客户端修改)
gets fgedu_balance:1001
VALUE fgedu_balance:1001 0 4 124
1500
END
# 使用旧的CAS值更新会失败
cas fgedu_balance:1001 0 3600 4 123
2000
EXISTS
# 需要重新获取最新的CAS值
4.2.2 CAS实现乐观锁
# 连接Memcached
$ telnet 192.168.1.100 11211
Trying 192.168.1.100…
Connected to 192.168.1.100.
Escape character is ‘^]’.
# 初始化账户余额
set fgedu_account:1001 0 0 4
1000
STORED
# 模拟并发更新场景
# 客户端A:获取数据
gets fgedu_account:1001
VALUE fgedu_account:1001 0 4 125
1000
END
# 客户端B:同时获取数据
gets fgedu_account:1001
VALUE fgedu_account:1001 0 4 125
1000
END
# 客户端A:更新成功
cas fgedu_account:1001 0 0 4 125
800
STORED
# 客户端B:更新失败(CAS值已变化)
cas fgedu_account:1001 0 0 4 125
700
EXISTS
# 客户端B需要重新获取数据并重试
gets fgedu_account:1001
VALUE fgedu_account:1001 0 4 126
800
END
# 客户端B:重试更新
cas fgedu_account:1001 0 0 4 126
700
STORED
# 验证最终结果
get fgedu_account:1001
VALUE fgedu_account:1001 0 4 700
END
4.3 Memcached数据库统计信息查看实战
4.3.1 查看基本统计信息
$ echo “stats” | nc 192.168.1.100 11211
STAT pid 12345
STAT uptime 86400
STAT time 1712534400
STAT version 1.6.22
STAT libevent 2.1.12-stable
STAT pointer_size 64
STAT rusage_user 123.456789
STAT rusage_system 234.567890
STAT max_connections 4096
STAT curr_connections 10
STAT total_connections 1000
STAT connection_structures 20
STAT reserved_fds 20
STAT cmd_get 50000
STAT cmd_set 10000
STAT cmd_flush 5
STAT cmd_touch 100
STAT get_hits 45000
STAT get_misses 5000
STAT delete_misses 100
STAT delete_hits 900
STAT incr_misses 50
STAT incr_hits 150
STAT decr_misses 10
STAT decr_hits 40
STAT cas_misses 20
STAT cas_hits 180
STAT cas_badval 10
STAT touch_hits 80
STAT touch_misses 20
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 50000000
STAT bytes_written 100000000
STAT limit_maxbytes 8589934592
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 8
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT slab_reassign_running 0
STAT slab_global_page_pool 0
STAT lru_maintainer_juggles 1000
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 100000000
STAT curr_items 50000
STAT total_items 100000
STAT expired_unfetched 100
STAT evicted_unfetched 50
STAT evictions 200
STAT reclaimed 150
STAT crawler_reclaimed 100
STAT crawler_items_checked 5000
STAT lrutail_reflocked 10
STAT moves_to_cold 5000
STAT moves_to_warm 3000
STAT moves_within_lru 2000
STAT direct_reclaims 100
END
4.3.2 查看Slab统计信息
$ echo “stats slabs” | nc 192.168.1.100 11211
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 5000
STAT 1:free_chunks 5922
STAT 1:free_chunks_end 0
STAT 1:get_hits 10000
STAT 1:cmd_set 5000
STAT 1:delete_hits 100
STAT 1:incr_hits 50
STAT 1:decr_hits 20
STAT 1:cas_hits 30
STAT 1:cas_badval 5
STAT 2:chunk_size 120
STAT 2:chunks_per_page 8738
STAT 2:total_pages 1
STAT 2:total_chunks 8738
STAT 2:used_chunks 3000
STAT 2:free_chunks 5738
STAT 2:free_chunks_end 0
STAT 2:get_hits 8000
STAT 2:cmd_set 3000
STAT 2:delete_hits 50
STAT 2:incr_hits 30
STAT 2:decr_hits 10
STAT 2:cas_hits 20
STAT 2:cas_badval 2
STAT active_slabs 2
STAT total_malloced 20971520
END
# 查看Items统计信息
$ echo “stats items” | nc 192.168.1.100 11211
STAT items:1:number 5000
STAT items:1:number_hot 1000
STAT items:1:number_warm 2000
STAT items:1:number_cold 2000
STAT items:1:age 3600
STAT items:1:evicted 100
STAT items:1:evicted_nonzero 50
STAT items:1:evicted_time 1800
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 200
STAT items:1:expired_unfetched 50
STAT items:1:evicted_unfetched 30
STAT items:2:number 3000
STAT items:2:number_hot 600
STAT items:2:number_warm 1200
STAT items:2:number_cold 1200
STAT items:2:age 3600
STAT items:2:evicted 50
STAT items:2:evicted_nonzero 25
STAT items:2:evicted_time 1800
STAT items:2:outofmemory 0
STAT items:2:tailrepairs 0
STAT items:2:reclaimed 100
STAT items:2:expired_unfetched 25
STAT items:2:evicted_unfetched 15
END
4.3.3 计算缓存命中率
# 获取统计数据
$ echo “stats” | nc 192.168.1.100 11211 | grep -E “get_hits|get_misses”
STAT get_hits 45000
STAT get_misses 5000
# 计算命中率
# 命中率 = get_hits / (get_hits + get_misses) * 100%
# 命中率 = 45000 / (45000 + 5000) * 100% = 90%
# 创建命中率监控脚本
$ cat > /tmp/memcached_hit_rate.sh << 'EOF'
#!/bin/bash
# memcached_hit_rate.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
HOST="192.168.1.100"
PORT="11211"
# 获取统计数据
STATS=$(echo "stats" | nc $HOST $PORT)
get_hits=$(echo "$STATS" | grep "get_hits" | awk '{print $3}')
get_misses=$(echo "$STATS" | grep "get_misses" | awk '{print $3}')
# 计算命中率
if [ -n "$get_hits" ] && [ -n "$get_misses" ]; then
total=$((get_hits + get_misses))
if [ $total -gt 0 ]; then
hit_rate=$(echo "scale=2; $get_hits * 100 / $total" | bc)
echo "缓存命中率: ${hit_rate}%"
echo "命中次数: $get_hits"
echo "未命中次数: $get_misses"
echo "总查询次数: $total"
else
echo "暂无查询数据"
fi
else
echo "无法获取统计数据"
fi
EOF
$ chmod +x /tmp/memcached_hit_rate.sh
$ /tmp/memcached_hit_rate.sh
缓存命中率: 90.00%
命中次数: 45000
未命中次数: 5000
总查询次数: 50000
Part05-风哥经验总结与分享
5.1 Memcached数据库命令使用技巧
5.1.1 命令组合使用技巧
# 1. 使用add实现分布式锁
add lock:resource:1001 0 30 8
locked
# 如果返回STORED,获取锁成功
# 如果返回NOT_STORED,锁已被占用
# 2. 使用CAS实现乐观锁
gets data:1001
VALUE data:1001 0 10 123
old_value
END
cas data:1001 0 3600 10 123
new_value
# 如果返回STORED,更新成功
# 如果返回EXISTS,数据已被修改,需要重试
# 3. 使用incr实现计数器
set counter:page:1001 0 0 1
0
STORED
incr counter:page:1001 1
1
incr counter:page:1001 1
2
# 4. 使用append实现日志追加
set log:app:20260408 0 0 0
STORED
append log:app:20260408 0 0 20
[10:00:00] User login
STORED
append log:app:20260408 0 0 22
[10:01:00] User logout
STORED
5.1.2 性能优化技巧
- 使用noreply选项减少网络往返
- 批量操作减少连接次数
- 合理设置过期时间避免内存浪费
- 使用合适的序列化格式减少数据大小
- 避免存储过大的Value
5.2 Memcached数据库常见错误处理
5.2.1 常见错误响应
# ERROR – 命令不存在或格式错误
set fgedu_test
ERROR
# CLIENT_ERROR – 客户端错误
set fgedu_test 0 3600 abc
CLIENT_ERROR bad command line format
# SERVER_ERROR – 服务器错误
SERVER_ERROR out of memory
# NOT_FOUND – key不存在
get fgedu_notexist
END
delete fgedu_notexist
NOT_FOUND
# NOT_STORED – 存储失败
add fgedu_exist 0 3600 8
NOT_STORED
# EXISTS – CAS值不匹配
cas fgedu_test 0 3600 8 123
EXISTS
# STORED – 存储成功
set fgedu_test 0 3600 8
STORED
# DELETED – 删除成功
delete fgedu_test
DELETED
# TOUCHED – touch成功
touch fgedu_test 3600
TOUCHED
5.2.2 错误处理最佳实践
# 1. 处理NOT_FOUND
# 检查key是否存在,不存在则从数据源加载
# 2. 处理NOT_STORED
# add失败:key已存在,使用get获取现有值
# replace失败:key不存在,使用set创建
# 3. 处理EXISTS
# CAS失败:重新获取数据和CAS值,重试更新
# 4. 处理SERVER_ERROR
# 检查服务器状态,可能需要扩容或优化
# 5. 处理CLIENT_ERROR
# 检查命令格式,确保参数正确
5.3 Memcached数据库管理工具使用
5.3.1 memcached-tool使用
# 查看统计信息
$ memcached-tool 192.168.1.100:11211 stats
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
96B 3600s 1 5000 no 100 1800 0
120B 3600s 1 3000 no 50 1800 0
# 查看详细Slab信息
$ memcached-tool 192.168.1.100:11211 display
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
1 96B 3600s 1 5000 no 100 1800 0
2 120B 3600s 1 3000 no 50 1800 0
3 152B 3600s 1 2000 no 30 1800 0
4 192B 3600s 1 1500 no 20 1800 0
5 240B 3600s 1 1000 no 10 1800 0
# 导出数据
$ memcached-tool 192.168.1.100:11211 dump > /tmp/memcached_dump.txt
# 查看帮助
$ memcached-tool –help
Usage: memcached-tool
memcached-tool
memcached-tool
memcached-tool
memcached-tool
5.3.2 使用nc进行快速操作
# 快速查看统计
$ echo “stats” | nc 192.168.1.100 11211 | head -20
# 快速查看版本
$ echo “version” | nc 192.168.1.100 11211
VERSION 1.6.22
# 快速清空数据(慎用)
$ echo “flush_all” | nc 192.168.1.100 11211
OK
# 快速检查连接
$ echo “quit” | nc -w 2 192.168.1.100 11211 && echo “OK” || echo “FAIL”
OK
# 批量操作
$ cat commands.txt | nc 192.168.1.100 11211
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
