Memcache命令操作
五种基本 memcached 命令执行最简单的操作:
set 、add、replace、 get、delete
前三个命令属于对键值对修改,格式如下:command < key > < flags > < expiration time > < bytes > < value >
参数 | 内容 |
---|---|
key | key 用于查找缓存值 |
flags | 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 |
expiration time | 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远) |
bytes | 在缓存中存储的字节点 |
value | 存储的值(始终位于第二行) |
发现指定bytes参数,必须设值要足额才算执行完成。
set
set 命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
set userId 0 0 5
12345
STORED
set 命令正确设定了键值对,服务器将使用单词 STORED 进行响应
add
仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
replace
仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应
最后两个基本命令是 get 和 delete
命令格式:command < key >
get
命令用于检索与之前添加的键值对相关的值,如果这个键存在于缓存中,则返回相应的值。如果不存在,则不返回任何内容。
Get可以取一个或多个键值,由空格隔开的字串 get key1 key2
set userId 0 0 5
12345
STORED
get userId
VALUE userId 0 5
12345
END
delete
delete 命令用于删除 memcached 中的任何现有值, 使用一个键调用 delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条 NOT_FOUND 消息
set userId 0 0 5
98765
STORED
delete bob
NOT_FOUND
delete userId
DELETED
incr
为特定的键增 1 或特定的值。只适用于数值 incr key value
set num 0 0 2
11
STORED
incr num 3
14
get num
VALUE num 0 2
14
END
decr
为特定的键减 1 或特定的值。只适用于数值 decr key value
set num 0 0 2
14
decr num 6
8
get num
VALUE num 0 2
8
高级 memcached 客户机命令
gets , cas , stats
stats
stats 命令的功能正如其名:转储所连接的 memcached 实例的当前统计数据。
可用stats命令查看缓存系统详情:
stats
STAT pid 5198 pid //Memcached进程ID
STAT uptime 1852 uptime //Memcached运行时间,单位:秒
STAT time 1445235207 time //Memcached当前的UNIX时间
STAT version 1.4.24 version //Memcached的版本号
STAT libevent 2.0.22-stable
STAT pointer_size 64
STAT rusage_user 0.040002 rusage_user //该进程累计的用户时间,单位:秒
STAT rusage_system 0.036002 rusage_system //该进程累计的系统时间,单位:秒
STAT curr_connections 5 curr_connections //当前连接数量
STAT total_connections 6 total_connections //Memcached运行以来接受的连接总数
STAT connection_structures 6 connection_structures //Memcache分配的连接结构的数量
STAT reserved_fds 20
STAT cmd_get 1 cmd_get //查询请求总数
STAT cmd_set 1 cmd_set //存储(添加/更新)请求总数
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0 get_hits //查询成功获取数据的总次数
STAT get_misses 1 get_misses //查询成功未获取到数据的总次数
STAT delete_misses 0
STAT delete_hits 0
STAT incr_misses 0
STAT incr_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 113 bytes_read //Memcached从网络读取到的总字节数
STAT bytes_written 114 bytes_written //Memcached向网络发送的总字节数
STAT limit_maxbytes 104857600 limit_maxbytes //Memcached在存储时被允许使用的字节总数
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT bytes 0 bytes //Memcached当前存储内容所占用的字节数
STAT curr_items 0 curr_items //Memcached当前存储的内容数量
STAT total_items 0 total_items //Memcached启动以来存储过的内容总数
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
END
stats items
列出所有key
STAT items:1:number 4
STAT items:1:age 2460
STAT items:4:number 1
STAT items:4:age 2649
…
END
Items : itemsid : number itemid中保存的key个数
stats cachedump itemid length
通过itemid获取key,基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列出
stats cachedump 1 0
ITEM mm [8 b; 1445237370 s]
ITEM key001 [15 b; 1445240439 s]
ITEM key01 [5 b; 1445237370 s]
ITEM userid [5 b; 1445237370 s]
END
stats cachedump 4 0
ITEM MemUser [87 b; 1445240439 s]
END
flush_all
flush_all 是最后一个要介绍的命令。这个最简单的命令仅用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则 flush_all 能提供很大的用处
flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行
version
返回服务器版本
version
VERSION 1.4.24
quit
命令没有参数
接收此命令后,服务器关闭连接。不过,客户端可以在不再需要时,简单地关闭连接就行,并不一定需要发送这个命令
quit
Connection closed by foreign host.
Memcache缓存性能
确定缓存效率的一种方法查看缓存的命中率(hit ratio)缓存命中率表示执行 get 的次数与错过 get 的次数的百分比, 用 get_hits 的数值除以 cmd_gets。
Memcached正确使用
memcached 并不安全
为了确保最佳性能,memcached 并未提供任何形式的安全性,没有身份验证,也没有加密。这意味着对 memcached 服务器的访问应该这么处理:一是通过将它们放到应用程序部署环境相同的私有侧,二是如果安全性是必须的,那么就使用 UNIX® socket 并只允许当前主机上的应用程序访问此 memcached 服务器。
这多少牺牲了一些灵活性和弹性,以及跨网络上的多台机器共享 RAM 缓存的能力,但这是在目前的情况下确保 memcached 数据安全性的惟一一种解决方案。
不要缓存数据库行或文件
虽然可以使用 memcached 存储加载自数据库的数据行,但这实际上是查询缓存,并且大多数数据库都提供各自的查询缓存的机制。其他的对象,比如文件系统的图像或文件的情况与此相同。很多应用程序和 web 服务器针对此类工作已经有了一些很好的解决方案。
如果在加载和格式化后,使用它来存储全部信息块,就可以从 memcached 获得更多的实用工具和性能上的改善。以博客站点为例,存储信息的最佳点是在将博客类别格式化为对象,甚至是在格式化成 HTML 后。博客页面的构造可通过从 memcached 加载各个组件(比如 blog post、category list、post history 等)并将完成的 HTML 写回至客户机实现。