memcached for Win32:
1. http://jehiah.cz/projects/memcached-win32/ , 1.2.1
2. http://code.jellycan.com/memcached/ , 1.2.6
3. http://www.splinedancer.com/memcached-win32/ , 1.2.4
4. http://blog.northscale.com/ , 1.4.4
memcached .NET clients:
http://code.google.com/p/memcached/wiki/Clients
Win32的安装、卸载等参考memcached.exe -h,正式环境的部署应当使用linux环境,使用memcached最新版本
描述
高性能、内存、分布式缓存方案。存储string、byte[]类型数据
全内存缓存,提供高性能存取,但服务器重启将导致已有缓存数据丢失,需重新设置加载
key-value类型存储方案,负载均衡、一致性哈希、failover等管理都由client完成
key值限定为250字符以下,存储小对象效率很高,大对象效率比较低(服务器端存储空间大,网络通讯开销大),对大对象、大文件数据等情形,应当考虑其他缓存方案
不支持锁,替代的方案是cas操作,其原理与乐观锁一样:
1. 添加到cache server的每个key-value值对,服务器都会生成一个cas值(8字节无符号整数,即服务器端的版本号)
2. 服务器每次更新某个值,都会自动更新他的cas值
3. client向服务器请求数据的同时,要求服务器返回每个key对应的cas值
4. client对数据进行处理
5. client向服务器更新数据的同时,提交读取数据时服务器返回的cas值
6. 服务器使用client提交的cas值与服务器上该key当前的cas值比较是否一致。如果不一致,说明在client读取数据之后,提交更新之前,有其他人更新了该数据,服务器返回更新失败的消息;如果一致,则服务器将更新数据并返回操作成功
7. cas方式更新失败说明存在并发一致性冲突,client自行处理该异常状况
协议简述
详细协议规范参考官方提供的memcached-protocol.txt
支持TCP/IP和UDP协议,建议客户端缓存连接
数据有2种格式:文本行和非结构化数据。文本行用于客户端和服务器端的命令,非结构化数据用于客户端提交数据或者接收数据,非结构化数据为字节流的方式
2种数据格式都以\r\n作为结束标记。因为非结构化数据中可能包含\r或\n字符,所以接收非结构化数据时必须根据预先接收到的数据长度进行处理,而不能依赖数据中的\r和\n字符判断是否结束
目前key被限制为250字符,不能包含控制字符和空白字符
命令分类
1. 存储命令:set, add, replace, append, prepend, cas,通知服务器存储一个key标识的数据。客户端发送一个命令,接着发送数据块,从服务器接收一行回应消息,表明操作成功或者失败
2. 读取命令:get, gets,向服务器请求返回一个或多个key标识的数据。客户端发送一个命令,包含key值列表,接着服务器为每个返回数据,先发送一行回应消息,包含返回数据的信息,接着发送返回数据块,结束时服务器发送一行"END"的回应消息
3. 其他命令:都不包含非结构化数据。客户端发送一个命令,服务器返回一行或多行回应消息,最后一行消息为"END"
命令行均以命令的名称开始,后面跟着空格分隔开的参数(如果有),命令名称都为小写并且是大小写敏感的
过期时间
时间有2种格式:
1. Unix时间格式,即从1970年1月1号开始的秒数(32位整数)
2. 从当前时间开始的秒数(最大值为30*24*60*60秒)
如果值的范围超过30天的总秒数,则认为是Unix格式的时间
错误消息
1. "ERROR\r\n",表示命令不存在
2. "CLIENT_ERROR <error>\r\n",表示客户端的错误,例如消息不符合协议等,<>中为错误描述
3. "SERVER_ERROR <error>\r\n",服务器端错误,发送完错误消息后服务器端将关闭连接(其他情况服务器都不会关闭连接)
主要命令
add: store this data, but only if the server *doesn't* already hold data for this key
replace: store this data, but only if the server *does* already hold data for this key
set: store this data,没有就插入有就覆盖
append: add this data to an existing key after existing data
prepend: add this data to an existing key before existing data
cas: store this data but only if no one else has updated since I last fetched it
get:
gets:
delete:
flush_all:
使用telnet
参考:memcached Telnet Interface
连接: telnet localhost 11211
存储:
set mykey 0 60 10 #60秒过期时间,数据长度为10字节
HelloWorld #要存储的数据
读取:
get mykey