Memcached
Memcached是一个高性能的分布式内存对象缓存系统,用于动态web应用以减轻数据库负载。它通过在内存中缓存数据和对象减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一个存储键/值对的hashmap.其守护进程(daemon)是用C语言写的,客户端支持任何编程语言,通过memcached协议与守护进程通信。
特征
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
协议
memcached的服务器客户端使用基于文本行的协议。通过telnet也能在memcached上保存数据、取数据。
存储方式
为了提供性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统、断电会导致全部数据消失。另外,缓存的内容容量达到指定值之后,就基于LRU(Laset Recently Used/最近一次使用)算法自动删除命中率低(很少使用)的缓存数据。
memcached本身是为了缓存而设计的服务,因此并没有过多考虑数据的持久化操作。
windows下安装
1、下载:http://static.runoob.com/download/memcached-1.4.5-amd64.zip
2、 解压下载的安装包到指定目录,例:c:/memcached/memcached.exe
3、在memcached1.4.5版本之后,memcached不能作为服务来运行,需要使用任务计划中开启一个普通的进程,在windows启动时设置memached自动执行。
4、使用管理员身份执行以下命令,将memcached添加到任务计划列表中:
schtasks /create /sc onstart /tn memcached /tr "'c:/memcached/memcached.exe' -m 512"
5、删除任务计划,使用管理员执行以下命令:
schtasks /delete /tn memcached
6.重启电脑,打开任务管理,会发现进程中会多出一个memcache.exe的进程
7.管理员身份执行以下命令:
telnet localhost 11211
version #查看版本
stats #查看
Memcached存储命令
set 命令
1、set 命令用于将value存储在指定的key中
2、如果set的key已经存在,该命令可以更新该key的value.
3、set 命令语法:
set key flags exptime bytes [noreply]
value
#key:键值,用于查找缓存值
#flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
#exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
#bytes:在缓存中存储的字节数
#noreply(可选):该参数告知服务器不需要返回数据
#value:存储的值(始终位于第二行)
4、实例
set name 0 60 4 #设置key为name,整型参数为0,保存60秒,5个字节,值为loach
loach
STORED #保存成功后输出
ERROR #在保存失败后输出
add 命令
1、Memcached add 命令用于将value(数据值)存储在指定key(键)中
2、如果add的key已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应NOT_STRED
3、语法
add key flags exptime bytes [noreply]
value
4、参数说明
key:键值key-value结构中的key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值的额外信息。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
bytes:在缓存中存储的字节数
noreply:该参数告知服务器不需要返回数据
value:值(始终位于第二行)
5、实例
add name 0 60 5
loach
6、输出
STORED:保存成功后输出
NOT_STORED:在保存失败后输出
replace 命令
1、replace命令用于替换已存在的key(键)的value(数据值)
2、如果key不存在,则替换失败,并且您将获得响应NOT_STORED
3、语法
replace key flags exptime bytes [noreply]
value
4、参数
key:键值key-value结构中的key,用于查找缓存值。
flags:可以包括键值的整型参数,客户机使用它存储关于键值对的额外信息
exptime:在缓存中保存键值的时间长度(以秒为单位,0表示永远)
bytes:在缓存中存储的字节数
noreply(可选):该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
5、实例
add name 0 120 5
loach
replace name 0 200 10
loachblog
6、输出
STORED:保存成功后输出
NOT_STORED:执行替换失败后输出
append 命令
1、append 命令用于向已存在key(键)的value(数据值)后面追加数据
2、语法
append key flags exptime bytes [noreply]
value
3、参数:
key:键值key-value结构中的key用于查找缓存值
flags:可以包括键值对的参数,客户机使用它存储关于键值对的额外信息
exptime:在缓存中保存键值对的时间长度(以秒为单位,0表示永远)
bytes:在缓存中存储的字节数
noreply(可选):该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
4、实例
set name 0 120 5
loach
get name
append name 0 120 4
blog
get name
5、输出
STORED:保存成功后输出
NOT_STORED:该键在memcached上不存在
CLIENT_ERROR:执行错误
prepend命令
1、prepend命令用于在已存在key(键)的value(数据值)前面追加数据。
2、格式:
prepend key flags exptime bytes [noreply]
value
CAS 命令
1、Memcached CAS(check-And-Set 或Compare-And-Swap)命令用于执行一个检查并设置的操作。它仅在当前客户端最后一次取值后,该key对应的值没有被其他客户端修改的情况下,才能够将值写入。检查是通过cas_token参数进行的,这个参数是Memcached指定给已存在的元素的一个唯一的64位值。
2、语法:
cas key flags exptime bytes unique_cas_token [noreply]
value
3、参数
key:键
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
exptime:在缓存最保存键值对的时间长度(以秒为单位,0表示永远)
bytes:在缓存中存储字节数
unique_cas_token通过gets命令获取的衣蛾唯一的64位值
noreply(可选):该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
4、实例
要在Memcached上使用CAS命令,你需要从memcached服务商通过gets命令获取令牌(token).gets命令的功能类似基于get命令。两个命令之间的差别在于,gets返回的信息多一些。
cas title 0 900 10 1
loachblog.com
5、输出
STORED:数据添加成功
ERROR:保存出错或语法错误
EXISTS:最后一次取值后另外一个用户也在更新该数据
NOT_FOUND:Memcached服务商不存在该键值
Memcached 查询命令
get 命令
1、get 命令获取存储在key(键)中的value(数据),如果key不存在,则返回空。
2、语法:
#单个key
get key
#多个可以空格隔开
get key1 key2 key3
3、参数
key:键值key-value结构中的key,用于查找缓存值
4、实例
set name 0 900 5
loach
get name
gets 命令
1、gets 命令取带有CAS令牌存的value(数据值),如果key不存在,则返回空。
2、语法
#取单个
gets key
#取多个
gets key1 key2 key3
3、参数
key:键值
4、实例
set name 0 900 5
loach
gets name
delete命令
1、delete 命令用于删除已存在的key(键)
2、语法
delete key [noreply]
3、实例
set name 0 900 5
loach
get name
delete name
get name
4、输出
DELETED:删除成功
ERROR:语法错误或删除失败
NOT_FOUND:key不存在
incr 和 decr 命令
1、incr和decr命令用于对已存在的key(键)的数字值进行自增或自减操作
2、incr和decr 命令操作的数据必须是十进制的32位无符号的整数
3、语法
```shell
incr/decr key increment_value
4、参数 key:键值 increment_value:自增/自减的值 5、实例
set views 0 900 3 0 incr views 5 get views decr views 5 get views
6、参数 NOT_FOUND:key不存在 CLIENT_ERROR:自增/自减值不少对象 ERROR:其他错误
## Memcached 统计命令
### stats 命令
1、stats 命令用于返回统计信息(进程号、版本号、连接数等) 2、语法
stats
3、stats 返回对照表
|名称
|描述
|------
|pid
|memcache服务器进程ID
|uptime
|服务器已运行秒数
|time
|服务器当前Unix时间戳
|version
|memcache版本
|pointer_size
|操作系统指针大小
|rusage_user
|进程累计用户时间
|rusage_system
|进程累计系统时间
|curr_connections
|当前连接数量
|total_connections
|Memcached运行以来连接总数
|connection_structures
|Memcached分配的连接结构数量
|cmd_get
|get命令请求次数
|cmd_set
|set命令请求次数
|cmd_flush
|flush命令请求次数
|get_hits
|get命令命中次数
|get_misses
|get命令未命中次数
|delete_misses
|delete命令未命中次数
|delete_hits
|delete命令命中次数
|incr_misses
|incr命令未命中次数
|incr_hits
|incr命令命中次数
|decr_misses
|decr命令未命中次数
|decr_hits
|decr命令命中次数
|cas_misses
|cas命令未命中次数
|cas_hits
|cas命令命中次数
|cas_badval
|使用擦拭次数
|auth_cmds
|认证命令处理的次数
|auth_errors
|认证失败数目
|bytes_read
|读取总字节数
|bytes_written
|发送总字节数
|limit_maxbytes
|分配的内存总大小(字节)
|accepting_conns
|服务器是否达到过最大连接(0/1)
|listen_disabled_num
|失效的监听数
|threads
|当前线程数
|conn_yields
|连接操作主动放弃数目
|bytes
|当前存储占用的字节数
|curr_items
|当前存储的数据总数
|total_items
|启动以来存储的数据总数
|evictions
|LRU释放的对象数目
|reclaimed
|已过期的数据条目来存储新数据的数目
### stats items
1、stats items 命令用于显示各个slab总item的数目和存储时长(最后一次访问距现在的秒数)
### stats slabs 命令
1、stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况
### stats sizes
1、stats sizes 命令用于显示所有items的大小和个数
### flush_all
1、flush_all 命令用于清理缓存中的所有key=>value(键值)对 2、time参数,用于在指定的时间后执行清理缓存操作 3、语法
flush_all [time] [noreply]
4、实例
set name 0 900 0 loach get name flush_all get name
## 参考资料
http://www.runoob.com/memcached/memcached-tutorial.html
```