深入memcached之应用篇

本文详细解析Memcached的工作原理,包括其配置参数、协议要点、命令使用及典型用例,同时提供了一些使用技巧,帮助开发者更高效地利用Memcached进行缓存管理。

参数列表

-p <num> TCP port number to listen on (default: 11211) 监听的TCP端口号
-U <num> UDP port number to listen on (default: 0, off) UDP端口号
-s <file> unix socket path to listen on (disables network support) socket文件,一旦指定,关闭网络模式
-a <mask> access mask for unix socket, in octal (default 0700) socket文件访问权限
-l <ip_addr> interface to listen on, default is INDRR_ANY 监听的地址,指定的话只响应该地址请求
-d run as a daemon 后台进程模式
-r maximize core file limit dump core file 的大小限制
-u <username> assume identity of <username> (only when run as root)  
-m <num> max memory to use for items in megabytes, default is 64 MB  
-M return error on memory exhausted (rather than removing items) 没有逐出,内存用完就不能再往里加
-c <num> max simultaneous connections, default is 1024 最大链接数
-k lock down all paged memory. Note that there is a 
limit on how much memory you may lock. Trying to 
allocate more than that would fail, so be sure you 
set the limit correctly for the user you started 
the daemon with (not for -u <username> user; 
under sh this is done with 'ulimit -S -l NUM_KB').
锁定内存使之不会被swap到虚存,保证性能
-v verbose (print errors/warnings while in event loop)  
-vv very verbose (also print client commands/reponses) 调试时很有用
-h print this help and exit  
-i print memcached and libevent license  
-b run a managed instanced (mnemonic: buckets) ??
-P <file> save PID in <file>, only used with -d option 指定进程号存放文件
-f <factor> chunk size growth factor, default 1.25 chunk大小增长系数
-n <bytes> minimum space allocated for key+value+flags, default 48 第一个chunk的大小(不含item结构)

协议要点(针对文本协议)

  • 建议客户端缓存TCP链接以节省创建的开销
  • 协议中有两种类型的数据:文本和非结构化数据,前者用来表示命令或服务端客户端交互,后者用来表示被缓存的数据。所以服务端不去管客户端存进来的是什么,当客户端来取时,只是以字节流的形式原样返还。
  • 上述两种数据类型都会以'\r\n'结束,由于被缓存的对象里也有可能含有\r\n,所以客户端应该以数据长度作为对象结束的依据,而不是\r\n
  • key用来标识存进memcached的对象,key是一个长度小于250的字串,且不能含有控制字符或空格
  • 一些命令中可以有过期时间,这个时间是一个整数值,如果大于60*60*24*30(30天),它将被作为一个Unix时间
  • 错误代码一共有三种
    1. "ERROR\r\n" 表示客户端发送了一个不存在的命令
    2. "CLIENT_ERROR <error>\r\n" 表示客户端的命令格式不正确
    3. "SERVER_ERROR <error>\r\n" 表示服务端错误。当严重的错误发生时,服务端在发送完这个响应后会关闭链接
  • 以下是命令的格式,所有的命令都是大小写敏感的
存储命令
set|add|replace|append|prepend <key> <flags> <exptime> <bytes> [noreply]\r\n
或
cas <key> <flags> <exptime> <bytes> <cas unqiue> [noreply]\r\n
后跟
<data block>\r\n

命令说明:

  1. set: 置值
  2. add: 如果不存在,置值
  3. replace: 如果存在,置值
  4. append: 如果存在,在原值后添加
  5. prepend: 如果存在,在原值前添加
  6. cas: check and set,检查并置值,确保在上次获取值后没有被置过值

参数说明:

  1. <flags>: 一个16-bit无符号整数(1.2.1以后版本为32-bit),每次取操作时会随数据返回,客户端可以用它来作位图标识一些数据的属性(如是否压缩过,是否序列化过等等),这个值是服务端透明的,服务器只是原样返回
  2. <bytes>: <data block>的长度,不含\r\n
  3. <cas unique>: 一个随gets命令返回的32位整数,标识这个对象被置值的次数
  4. noreply: 让服务端沉默

返回说明:

  • "STORED\r\n": 成功
  • "NOT_STORED\r\n": add了已存在的,replace|append|prepend了不存在的,或者该对象已经在删除队列中了
  • "EXISTS\r\n":cas方法要设置的对象已经被更改了
  • "NOT_FOUND\r\n":cas方法要设置的对象不存在或者已经被删除了
取回命令
get <key>*\r\n
gets <key>*\r\n

命令说明:

  1. get 取得一个或多个对象by keys
  2. gets 取得一个或多个对象(包括其cas_id)by keys

参数说明:

  1. <key>* 一个key或空格分隔的多个key

返回说明:

VALUE <key> <flags> <bytes> [<cas unique>]\r\n
<data block>\r\n
...
END\r\n
删除命令
delete <key> [<time>] [noreply]\r\n

参数说明:

  1. <time> 以秒计的间隔或系统时间,在这个时间之前,对象会被扔到删除对列中。对该对象的get,add,replace操作将会被失败,但set会成功。这是个可选参数,默认为0,表示不放到队列中而直接删除(free chunk)

返回说明:

  • "DELETED\r\n" 成功
  • "NOT_FOUND\r\n" 未找到
递增递减命令
incr <key> <value> [noreply]\r\n
decr <key> <value> [noreply]\r\n

命令说明:

  1. 这两个命令是原子操作
  2. 这两个操作的前提是这个key存在且其值是一个有效的64-bit无符号整数的十进制表示(在内部存储时,其实是用的字符串)
  3. decr至0后,再decr不会有效果。但incr到最大值后会溢出

参数说明:

  1. <value>: 期望增减的值,64-bit无符号整数的十进制表示

返回说明:

  • "NOT_FOUND\r\n" 找不到
  • <value>\r\n , 增减后新的值
统计命令
stats\r\n  : 全局统计
stats slabs\r\n  : 统计slabs的使用情况
stats items\r\n  : 统计各slab class中的item的情况
stats sizes\r\n  : 统计每个大小档次中item数量(需要遍历所有item,慎用)
其他命令
flush_all [<delay>]\r\n : 将所有对象置为不可获取状态,即全清,慎用。delay以秒计,没有表示马上执行
version\r\n : 返回server版本
verbosity <level>\r\n : 调整server的日志输出level:0|1|2,2最详细
quit\r\n : 告诉server关闭此链接

典型用例

问题与解决方案

相关讨论贴

潜入memcached server http://www.javaeye.com/topic/225692
看看mina和memcached的联姻(适合不同语言客户端,高并发?http://www.javaeye.com/topic/217165
分布式缓存系统Memcached学习心得 http://www.javaeye.com/topic/208981


【评估多目标跟踪方法】9个高度敏捷目标在编队中的轨迹和测量研究(Matlab代码实现)内容概要:本文围绕“评估多目标跟踪方法”,重点研究9个高度敏捷目标在编队飞行中的轨迹生成与测量过程,并提供完整的Matlab代码实现。文中详细模拟了目标的动态行为、运动约束及编队结构,通过仿真获取目标的状态信息与观测数据,用于验证和比较不同多目标跟踪算法的性能。研究内容涵盖轨迹建模、噪声处理、传感器测量模拟以及数据可视化等关键技术环节,旨在为雷达、无人机编队、自动驾驶等领域的多目标跟踪系统提供可复现的测试基准。; 适合人群:具备一定Matlab编程基础,从事控制工程、自动化、航空航天、智能交通或人工智能等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于多目标跟踪算法(如卡尔曼滤波、粒子滤波、GM-CPHD等)的性能评估与对比实验;②作为无人机编队、空中交通监控等应用场景下的轨迹仿真与传感器数据分析的教学与研究平台;③支持对高度机动目标在复杂编队下的可观测性与跟踪精度进行深入分析。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注轨迹生成逻辑与测量模型构建部分,可通过修改目标数量、运动参数或噪声水平来拓展实验场景,进一步提升对多目标跟踪系统设计与评估的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值