分布式缓存系统 Memcached 基本配置与命令
为了方便测试,给出一个C客户端libmemcached链接:https://launchpad.net/libmemcached/
以及memcacheclient-2.0 : http://code.jellycan.com/files/memcacheclient-2.0.zip(已生成 sln,在windows下直接用VS打开,编译成功)
在Memcached启动时,有很多配置参数可以选择,以下参数对应memcached1.4.15,现给出这些参数的具体含义:
"a:" //unix socket的权限位信息,unix socket的权限位信息和普通文件的权限位信息一样
"p:" //memcached监听的TCP端口值,默认是11211
"s:" //unix socket监听的socket文件路径
"U:" //memcached监听的UDP端口值,默认是11211
"m:" //memcached使用的最大内存值,默认是64M
"M" //当memcached的内存使用完时,不进行LRU淘汰数据,直接返回错误,该选项就是关闭LRU
"c:" //memcached的最大连接数,如果不指定,按系统的最大值进行
"k" //是否锁定memcached所持有的内存,如果锁定了内存,其他业务持有的内存就会减小
"hi" //帮助信息
"r" //core文件的大小,如果不指定,按系统的最大值进行
"v" //调试信息
"d" //设定以daemon方式运行
"l:" //绑定的ip信息,如果服务器有多个ip,可以在多个ip上面启动多个Memcached实例,注意:这个不是可接收的IP地址
"u:" //memcached运行的用户,如果以root启动,需要指定用户,否则程序错误,退出。
"P:" //memcached以daemon方式运行时,保存pid的文件路径信息
"f:" //内存的扩容因子,这个关系到Memcached内部初始化空间时的一个变化,后面详细说明
"n:" //chunk的最小大小(byte),后续的增长都是该值*factor来进行增长的
"t:" //内部worker线程的个数,默认是4个,最大值推荐不超过64个
"D:" //内部数据存储时的分割符
"L" //指定内存页的大小,默认内存页大小为4K,页最大不超过2M,调大页的大小,可有效减小页表的大小,提高内存访问的效率
"R:" //单个worker的最大请求个数
"C" //禁用业务的cas,即compare and set
"b:" //listen操作缓存连接个数
"B:" //memcached内部使用的协议,支持二进制协议和文本协议,早期只有文本协议,二进制协议是后续加上的
"I:" //单个item的最大值,默认是1M,可以修改,修改的最小值为1k,最大值不能超过128M
"S" //打开sasl安全协议
"o:" //有四个参数项可以设置:
maxconns_fast(如果连接数超过最大连接数,立即关闭新的连接)
hashpower(hash表的大小的指数值,是按1<<hashpower来创建hash表的,默认的hashpower为16,配置值建议不超过64)
slab_reassign(是否调整/平衡各个slab所占的内存)
slab_automove(是否自动移动各个slab,如果该选项打开,会有专门的线程来进行slab的调整)
memcached协议
旧版:http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
新版:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
一、协议
memcached的客户端使用TCP连接同memcached进行交互,memcached服务器监听指定的端口(默认端口是11211)。Client连接到memcached服务器,发送指令,获取数据,然后关闭连接。
通常没有必要发送任何命令来关闭某个会话。客户端可以在任何时候关闭不需要的连接。然而,通常鼓励客户端缓存这些连接,因为memcached服务器本身就被设计成为一个可以支持成百上千个连接的服务器,而客户端缓存了连接后,就可以避免重复的建立连接的开销。
memcached协议中包含两部分数据,文本行和非结构化数据。前者是来自客户端的命令或来自服务器端的响应,后者代表客户端存取的数据。命令以\r\n结尾,数据可以是\r,\n或者\r\n结尾来标识各自部分的结束。
二、键
memcached一般通过key来存储,一个key的长度一般不能超过250字符。key不能包含控制字符或空白字符
三、命令
有三种类型的命令:
1、存储命令:set、add、replace、append、prepend、cas
2、读取命令:get、gets
3、第三种命令,不涉及到非结构化数据。客户端发出这样的命令,服务端会返回响应结果
1、过期时间
过期时间的取值,有两种:一种是Unix时间(自1970.1.1开始到现在的秒数),另一种是相对当前时间的秒数。如果过期时间的秒数大于60*60*24*30(即30天),则服务端认为是Unix时间。
2、错误设置
客户端发出的每个命令,服务端可能会返回错误提示字符。错误提示字符有如下三种:
1) ERROR\r\n :表示客户端发送的命令不存在
2) CLIENT_ERROR <error>\r\n :表示客户端的输入有错误
3) SERVER_ERROR <error>\r\n :服务器端的错误
3、存储命令:
命令格式:<command name> <key><flags> <exptime> <bytes> [noreply]\r\n
命令名:如set、add、replace、append、prepend
命令名称 |
作用 |
set |
存储这个数据 |
add |
存储这个数据,当且仅当这个key不存在的时候 |
replace |
存储这个数据,当且仅当这个key存在 |
append |
将数据存放在已存在的key对应的内容的后面,忽略<flags>和<exptime> |
prepend |
将数据存放在已存在的key对应的内容的前面,忽略<flags>和<exptime> |
cas |
存储这个数据,当且仅当该数据自从最后被获取到现在没有被更新 |
flags:一个任意的32位(旧版本是16位)无符号整数
exptime:过期时间,如果为0,表示永不过期。单位秒
bytes:表示将要存储的数据的字节数,可以为0。要存储的内容的字节数,必须等于该值,不能大于也不能小于。
例子:将一个整数12,存放到memcache中,key为var,flags为1,过期时间为1000,字节数为2
用telnet连接memcached服务器端:
输入命令如下:set var 1 1000 2,然后按回车,之后输入要存储是数据:12,按回车,服务器返回STORED,如下:
通过get命令查看刚才存储的内容:
4、获取命令
格式:
get <key>*\r\n
gets <key>*\r\n
<key>*,表示可以有多个key,各个key之间用空格隔开。
执行该命令,服务器返回0个或多个item,每个item的格式如下:
VALUE <key> <flags><bytes> [<cas unique>]\r\n
<data block>\r\n
bytes为数据内容的长度,data block为key对应的数据内容
例子:
5、删除命令
格式: delete <key> [noreply]\r\n
noreply参数,告诉服务器不用发送响应
该命令的返回结果,可能是:
DELETE\r\n 表示删除成功
NOT_FOUND\r\n 没有对应的key
例子:
6、增加/减少命令
命令格式:
incr <key> <value> [noreply]\r\n 或 decr <key> <value> [noreply]\r\n
value为要增加或减少的值。
操作成功,服务器返回操作之后的值。
对于decr操作,如果操作之后的值小于0,则置为0
不能直接使用incr和decr,必须先set或者add后再使用,而且值为数字类型,在增加时,存储的区域会扩展。
例子:
7、touch
该命令用来更新已存在的item的过期时间,格式如下:(低版本不支持该命令)
touch <key> <exptime> [noreply]\r\n
执行该命令后,如果返回”TOUCHED\r\n”,则执行成功
8、统计命令
命令格式:
1) stats\r\n 查看通用的统计信息
2) stats <args>\r\n
通用统计信息,例子:
具体含义:
名称 |
类型 |
含义 |
pid |
32u (32位无符号整数) |
memcached server的pid |
uptime |
32u |
memcached server自启动到现在的时间(秒) |
time |
32u |
当前UNIX的时间 |
version |
string |
memcached server的版本号 |
pointer_size |
32 |
操作系统默认的指针大小 |
curr_items |
32u |
当前存储的item数目 |
total_items |
32u |
server从启动到现在,总共累计存储的item数目 |
bytes |
64u |
当前存储item所花费的字节数 |
curr_connections |
32u |
当前的客户端连接数 |
total_connections |
32u |
server从启动到现在,累计的客户端连接数 |
connection_structures |
32u |
server分配的连接结构数 |
cmd_get |
64u |
get的次数 |
cmd_set |
64u |
set的次数 |
get_hits |
64u |
get命中的次数 |
get_misses |
64u |
get没有命中,miss的次数 |
evictions |
64u |
为新的item释放内存空间而被移除的有效item的数目。如果cache的size比较小,则淘汰策略经常发生 |
bytes_read |
64u |
从cache中读取的总字节数 |
bytes_written |
64u |
写入cache的总字节数 |
limit_maxbytes |
32u |
该memcached server分配的最大内存数量 |
9、item统计信息
stats命令后面带上参数:items。 返回存储在每个slab的item信息,格式如下:
STAT items:<slabclass>:<stat><value>\r\n
例子:
10、itemsize统计信息
stats命令后面带上参数sizes,返回存储在cache中的总体大小及item数目。
注意:该命令会锁住cache,它会遍历每个item并计算大小,在此之间,我们是无法访问server的,因此要慎重使用该命令。
返回结果的格式如下:
<size> <count>\r\n
其中:
'size' is an approximate size of the item,within 32 bytes.
'count' is the amount of items that existwithin that 32-byte range.
例子:
11、slab统计信息
stats命令带上参数slabs,返回memcached运行期间创建的每个slab的信息。
数据格式:STAT <slabclass>:<stat> <value>\r\n
例子:
名称 |
含义 |
chunk_size |
每个块的大小。一个item使用一个大小适当的块。 |
chunks_per_page |
一页的块数,一页的默认大小小于等于1M,,chunks_per_page * chunk_size = 1MB。 slab按页分配,每页划分成不同的块 |
total_pages |
分配给slab的页数 |
total_chunks |
分配给slab的块数 |
used_chunks |
已分配给item的块数 |
free_chunks |
未分配给item的块数 |
free_chunks_end |
目前可以使用的块数 |
mem_requested |
请求存储在该slab的字节数 |
active_slabs |
已经分配的slab数量 |
total_malloced |
已经分配给slab的字节数 |
item存放在slab中,该slab的大小大于或等于该item的大小。mem_requested表示一个slab中所有item的大小。
total_chunks * chunk_size – mem_requested,表示一个slab中所浪费的内存大小。如果有很多浪费,则需要考虑调整slab因子
12、其他命令
1) flush_all :执行该命令,将导致memcache中所存在的所有item都失效。也可以指定在一段时间之后失效。例子:
2) version : 查看memcache的版本号
3)quit :关闭连接
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-01/112507.htm
分布式缓存系统 Memcached 基本配置与命令的更多相关文章
- 分布式缓存系统 Memcached 整体架构
分布式缓存系统 Memcached整体架构 Memcached经验分享[架构方向] Memcached 及 Redis 架构分析和比较
- 分布式缓存系统Memcached简介与实践
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- (转)C# 中使用分布式缓存系统Memcached
转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...
- 分布式缓存系统Memcached简介与以及在.net下的实践(转)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- .NET下实现分布式缓存系统Memcached (转自网络)
Memcached在.NET中的应用 一.Memcached服务器端的安装(此处将其作为系统服务安装) 下载文件:memcached 1.2.1 for Win32 binaries (Dec 23, ...
- 分布式缓存系统Memcached简介与实践(.NET memcached client library)
缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是不够灵 ...
- [Memcached]分布式缓存系统Memcached在Asp.net下的应用
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- 分布式缓存系统Memcached在Asp.net下的应用
Memcached 是一个高性能的分布式内存对象缓存系统.用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来降低读取数据库的次数,从而提高动态.数据库驱动站点的速度. Memcache ...
- php分布式缓存系统 Memcached 入门
Memcached 是一个分布式的缓存系统, 但是 Memcachd 到底是什么意思,有什么作用呢?缓存一般用来保存一些经常被存取的数据和资源(例如:浏览器会将访问过的网页会话缓存起来),因为通过缓存 ...
随机推荐
- mssqlserver,mysql,oracle分页查询
分页查询语句是sql语句编程中很长见的一个典型应用,用sql语句来分页比一些分页控件的速度要快,所以sql语句的分页在实际编程应用中还是非常广泛的. 今天给大家分享几条不同数据库编程用的分页查询语句. ...
- gitlab 卸载
gitlab 卸载 清理命令 sudo gitlab-ctl uninstall sudo gitlab-ctl cleanse sudo gitlab-ctl remove-accounts 停止g ...
- Shell 运算符 if
Shell 支持多种运算符,包括: 算术运算符 原生bash不支持简单的数学运算,可以使用 expr,let 关系运算符 布尔运算符 字符串运算符 文件运算符 算术运算符 包括加减乘除,取余(%).赋 ...
- yii2:如果获取config/web.php配置的值?
return [ 'version' => '1.0.1', 'category-map' => [ 1 => '样式1', 2 => '样式2', 3 => '样式3' ...
- C++(二十二) — 指针变量、函数指针、void指针
1.指针变量 (1)指针变量必须在初始化后才可以正常使用,初始化就是给他分配一个有效的数据地址. 先初始化,后使用. (2)指针可以进行加减运算,++ 或者 --:将指针的位置向前或者向后移动一个数据 ...
- UVA 1626 区间dp、打印路径
uva 紫书例题,这个区间dp最容易错的应该是(S)这种匹配情况,如果不是题目中给了提示我就忽略了,只想着左右分割忘记了这种特殊的例子. dp[i][j]=MIN{dp[i+1][j-1] | if( ...
- day5-time & datetime模块
1.概述 程序设计开发过程中,往往存在很多场景,需要把时间和日期以某种特定形式格式化输出,在python中我们需要借助time & datetime模块来实现,今天就来一探这两大模块的究竟. ...
- LeetCode OJ:Merge Sorted Array(合并排序的数组)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
- 2017.11.18 IAP下载(STM8,PIC,STM32)
客户要求用IAP下载,mark一下,客户还给了stm32的引导码.仅供参考. 1 PIC单片机的IAP 2 STm32 IAP https://www.cnblogs.com/WeyneChen/p ...
- 【git】git知识梳理(二):服务器
(四) 远程仓库通常只是一个裸仓库(bare repository):.git子目录 四种协议:本地传输, SSH, GIT, HTTP, 除了http,均需要在服务器端安装运行git. SSH:SS ...