Memcached
Memcached 简介
Memcached是一个自由开源的,高性能,分布式内存对象缓存系统。
Memcached简洁而强大。它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存的很多问题。它的API兼容大部分流行的开发语言。
本质上,它是一个简洁的key-value存储系统。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
特征
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
- 协议简单
- 基于libevent的事件处理
- 内置内存存储方式
- memcached不互相通信的分布式
Linux Memcached安装
Linux系统安装memcached,首先要先安装libevent库。
sudo apt-get install libevent ibevent-dev 自动下载安装(Ubuntu/Debian)
yum install libevent libevent-devel 自动下载安装(Redhat/Fedora/Centos)
自动安装
Ubuntu/Debian
依次执行以下命令
sudo apt-get install memcached
portmaster databases/memcached
whereis memcached
安装位置在 /usr/bin/memcached
Memcached 运行
$ /usr/bin/memcached/bin/memcached -h 命令帮助
启动选项:
- -d是启动一个守护进程;
- -m是分配给Memcache使用的内存数量,单位是MB;
- -u是运行Memcache的用户;
- -l是监听的服务器IP地址,可以有多个地址;
- -p是设置Memcache监听的端口,,最好是1024以上的端口;
- -c是最大运行的并发连接数,默认是1024;
- -P是设置保存Memcache的pid文件。
作为前台程序运行
从终端输入以下命令,启动memcached:
/usr/bin/memcached/bin/memcached -p 11211 -m 64m -vv
作为后台服务程序运行
# /usr/bin/memcached/bin/memcached -p 11211 -m 64m -d
Windows 下安装 Memcached
以64位系统1.4.5版本为例
http://static.runoob.com/download/memcached-1.4.5-amd64.zip
直接点击下载链接可能会出现无法下载的问题
点击图中的保留即可
我下载的路径如下
在 1.4.5 版本以前 memcached 可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。这里介绍1.4.5的安装方法:
memcached >= 1.4.5 版本安装
1、解压下载的安装包到指定目录。
2、在 memcached1.4.5 版本之后,memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,在 window 启动时设置 memcached自动执行。
我们使用管理员身份执行以下命令将 memcached 添加来任务计划表中:
schtasks /create /sc onstart /tn memcached /tr "'D:\develop\memcache\dmemcached.exe' -m 512"
注意: 你需要使用自己的路径替代
注意: -m 512 意思是设置 memcached 最大的缓存配置为512M
注意: 我们可以通过使用 “c:\memcached\memcached.exe -h” 命令查看更多的参数配置。
3、如果需要删除 memcached 的任务计划可以执行以下命令:
schtasks /delete /tn memcached
Memcached 连接
语法
telnet HOST PORT
本机安装的测试链接:
telnet 127.0.0.1 11211
# 可能会出现telnet不是内部或外部命令报错,解决方法在下面有给出
# 正常启动页面
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
'
set foo 0 0 3 保存命令
bar 数据
STORED 结果
get foo 取得命令
VALUE foo 0 3 数据
bar 数据
END 结束行
quit 退出
telnet不是内部或外部命令的解决
Win+R 输入control 进入控制面板 点击程序:
点击程序和功能
接着安图中步骤将Telnet客户端勾上 重启即可
Memcached 存储命令
Memcached set 命令
Memcached set 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。
语法:
set 命令的基本语法格式如下:
set key flags exptime bytes [noreply]
value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例:
- key → runoob
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 9 (数据存储的字节数)
- value → memcached
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 9
memcached
END
输出
如果数据设置成功,则输出:
STORED
输出信息说明:
STORED: 保存成功后输出。
ERROR: 在保存失败后输出。
Memcached add 命令
Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
语法:
add 命令的基本语法格式如下:
add key flags exptime bytes [noreply]value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → new_key
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 10 (数据存储的字节数)
- value → data_value
add new_key 0 900 10
data_value
STORED
get new_key
VALUE new_key 0 10
data_value
END
Memcached replace 命令
Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
语法:
replace 命令的基本语法格式如下:
replace key flags exptime bytes [noreply]value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
以下实例中我们设置:
- key → mykey
- flag → 0
- exptime → 900 (以秒为单位)
- bytes → 10 (数据存储的字节数)
- value → data_value
以下实例中我们使用的键位 ‘mykey’ 并存储对应的值 data_value。执行后我们替换相同的 key 的值为 ‘some_other_value’。
add mykey 0 900 10
data_value
STORED
get mykey
VALUE mykey 0 10
data_value
END
replace mykey 0 900 16
some_other_value
get mykey
VALUE mykey 0 16
some_other_value
END
Memcached append 命令
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。
语法:
append 命令的基本语法格式如下:
append key flags exptime bytes [noreply]value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
实例如下:
首先我们在 Memcached 中存储一个键 runoob,其值为 memcached。
然后,我们使用 get 命令检索该值。
然后,我们使用 append 命令在键为 runoob 的值后面追加 “redis”。
最后,我们再使用 get 命令检索该值。
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 14
memcached
END
append runoob 0 900 5
redis
STORED
get runoob
VALUE runoob 0 14
memcachedredis
END
Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
语法:
prepend 命令的基本语法格式如下:
prepend key flags exptime bytes [noreply]value
参数说明如下:
- key:键值 key-value 结构中的 key,用于查找缓存值。
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
- exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes:在缓存中存储的字节数
- noreply(可选): 该参数告知服务器不需要返回数据
- value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例
实例如下:
首先我们在 Memcached 中存储一个键 runoob,其值为 memcached。
然后,我们使用 get 命令检索该值。
然后,我们使用 prepend 命令在键为 runoob 的值后面追加 “redis”。
最后,我们再使用 get 命令检索该值。
set runoob 0 900 9
memcached
STORED
get runoob
VALUE runoob 0 14
memcached
END
prepend runoob 0 900 5
redis
STORED
get runoob
VALUE runoob 0 14
redismemcached
END
Memcached CAS 命令
Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。
语法:
CAS 命令的基本语法格式如下:
cas key flags exptime bytes unique_cas_token [noreply]value
参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
unique_cas_token通过 gets 命令获取的一个唯一的64位值。
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
实例:
要在 Memcached 上使用 CAS 命令,你需要从 Memcached 服务商通过 gets 命令获取令牌(token)。
gets 命令的功能类似于基本的 get 命令。两个命令之间的差异在于,gets 返回的信息稍微多一些:64 位的整型值非常像名称/值对的 “版本” 标识符。
实例步骤如下:
- 如果没有设置唯一令牌,则 CAS 命令执行错误。
- 如果键 key 不存在,执行失败。
- 添加键值对。
- 通过 gets 命令获取唯一令牌。
- 使用 cas 命令更新数据
- 使用 get 命令查看数据是否更新
cas tp 0 900 9
ERROR <− 缺少 token
cas tp 0 900 9 2
memcached
NOT_FOUND <− 键 tp 不存在set tp 0 900 9memcached
STORED
gets tp
VALUE tp 0 9 1
memcached
END
cas tp 0 900 5 1
redis
STORED
get tp
VALUE tp 0 5
redis
END
更多语法详情请见:https://www.runoob.com/memcached/memcached-get-data.html