1. 首页 > Memcached教程 > 正文

Memcached教程FG003-Memcached命令行操作实战

本文档风哥主要介绍Memcached数据库命令行操作相关知识,包括Memcached数据库命令概述、命令语法规范、存储命令、读取命令、管理命令、批量操作、CAS操作、统计信息查看等内容,风哥教程参考Memcached官方文档Command Reference等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 Memcached数据库命令概述

Memcached提供了丰富的命令行接口,支持数据的存储、读取、删除和管理操作。更多视频教程www.fgedu.net.cn

1.1.1 协议类型

# Memcached支持两种协议

# 1. 文本协议(ASCII Protocol)
特点:
– 人类可读,便于调试
– 通过telnet直接操作
– 兼容性好,广泛支持

# 2. 二进制协议(Binary Protocol)
特点:
– 更高效,解析速度快
– 支持更多特性
– 减少网络传输

# 默认使用文本协议
# 可通过-B参数指定协议
-B auto # 自动选择(默认)
-B ascii # 仅文本协议
-B binary # 仅二进制协议

1.1.2 连接方式

# Memcached连接方式

# 方式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 存储命令语法

# 存储命令通用语法

[noreply]\r\n
\r\n

# 参数说明
命令名称:set/add/replace/append/prepend/cas
键名,最长250字节
客户端自定义标志位,32位整数
过期时间(秒),0表示永不过期
数据块字节数
[noreply] 可选,不返回响应
数据内容

# 示例
set fgedu_user 0 3600 12
Hello World!

1.2.2 读取命令语法

# 读取命令语法

get *\r\n
gets *\r\n

# 参数说明
键名,可以指定多个

# 示例
get fgedu_user
gets fgedu_user fgedu_product

# 响应格式
VALUE []\r\n
\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命名规范

# Memcached 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大小限制

# Memcached Value大小限制

# 默认限制
– 单个Value最大:1MB
– 可通过-I参数调整(最大128MB)

# 推荐大小
– 小于1KB:最佳性能
– 1KB-10KB:良好性能
– 10KB-100KB:可接受
– 大于100KB:不推荐

# 大Value处理方案
1. 数据压缩
2. 数据分片
3. 使用其他存储(如Redis)

2.2.2 Value序列化建议

# Memcached Value序列化建议

# 常用序列化格式

# JSON格式(推荐)
优点:可读性好,跨语言支持
缺点:体积较大
示例:{“name”:”fgedu”,”age”:30}

# MessagePack格式
优点:体积小,速度快
缺点:可读性差
示例:二进制格式

# Protobuf格式
优点:体积最小,速度快
缺点:需要定义schema

# 纯文本格式
优点:简单直接
缺点:仅适用于简单数据
示例:Hello World

# 序列化选择建议
– 开发测试:JSON
– 生产环境:MessagePack或Protobuf
– 简单数据:纯文本

2.3 Memcached数据库命令使用建议

2.3.1 过期时间设置建议

# Memcached过期时间设置建议

# 过期时间类型

# 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标志位使用建议

# Memcached 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命令实战

# 连接Memcached
$ 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命令:添加数据(仅当key不存在时)

# 添加新数据
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命令实战

# replace命令:替换数据(仅当key存在时)

# 先存储数据
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命令实战

# append命令:追加数据到末尾
# 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命令实战

# 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命令实战

# gets命令:获取数据(包含CAS标识)

# 存储数据
set fgedu_cas 0 3600 8
testdata
STORED

# 使用gets获取数据
gets fgedu_cas
VALUE fgedu_cas 0 8 123
testdata
END

# 响应格式说明
# VALUE
# 是一个64位的唯一标识符

# 再次获取,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命令实战

# 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命令实战

# incr命令:数值增加
# 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命令实战

# 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命令实战

# 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 批量读取数据

# 批量读取多个key

# 方式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操作原理

# CAS(Check And Set)操作原理

# 步骤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实现乐观锁

# 使用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统计信息

# 查看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 命令组合使用技巧

# Memcached命令组合使用技巧

# 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 常见错误响应

# Memcached常见错误响应

# 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 错误处理最佳实践

# Memcached错误处理最佳实践

# 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使用示例

# 查看统计信息
$ 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 [mode]
memcached-tool display
memcached-tool stats
memcached-tool dump
memcached-tool move

5.3.2 使用nc进行快速操作

# 使用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

风哥总结:Memcached命令行操作简单直观,但需要掌握正确的语法和最佳实践。生产环境中要注意Key和Value的设计规范,合理使用过期时间和Flags标志位,掌握CAS操作实现乐观锁,定期查看统计信息监控缓存性能。熟练使用memcached-tool和nc等工具可以大大提高运维效率。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息