第一部分:Memcached介绍
定义:自由开源的,高性能、分布式内存对象缓存系统
- 高性能是指:日常生产环境下 QPS(每秒查询率) 为4-6万,如果利用多核优势,单实例吞吐量可以达到几十万 QPS(取决于 key 和 value 的字节大小以及服务器的硬件性能)
- 分布式是指:可以跨服务器分布部署
特征:
- 协议简单:服务端和客户端通信并不使用复杂的 xml 等格式,而是用基于文本行的协议,可以通过 telnet 直接访问服务器进行数据查询
- 基于libevent
- 内存存储:服务器重启所有数据丢失
- 分布式:分布式内存对象缓存系统,它的分布式是基于客户端算法的。本身各个 Memcached 服务器是不进行相互通讯、数据拷贝的。这点和 MySQL、Redis 和 MongoDB 都是不一致的。MySQL就是一个典型的主从同步分布式处理,更新操作会统一在主库上进行,按照一定的同步机制,将主库数据同步到从库中。而 Memcached 各个服务器之间是不进行相互通信的
第二部分:Centos 编译安装 Memcached
安装 libevent
# 所有资源全部下载到 src 目录便于管理
cd /usr/local/src
wget https://github.com/libevent/libevent/releases/download/release-2.1.10-stable/libevent-2.1.10-stable.tar.gz
tar zxvf libevent-2.1.10-stable.tar.gz
yum install gcc
cd libevent-2.1.10-stable
./configure --prefix=/usr
make
make install
ls -a /usr/lib | grep libevent
安装 Memcached
cd /usr/local/src
wget http://www.memcached.org/files/memcached-1.5.16.tar.gz
tar zxvf memcached-1.5.16.tar.gz
cd memcached-1.5.16
./configure -prefix=/usr/local/memcached \
-with-libevent=/usr
make
make install
# 运行
/usr/local/memcached/bin/memcached -d start -u root -m 1024 -p 11211 -c 2048 -P /tmp/memcached.pid
ps -ef | grep memcached
# 简单的开机自启动配置(下面还有“配置开机自动启动脚本”,两者都OK)
vim /etc/rc.d/rc.local
# 将上面的运行代码帖进去,OK
# 为启动脚本增加权限
chmod +x /etc/rc.d/rc.local
# 连接服务器
telnet 127.0.0.1 11211
- 参数说明:
- -d 选项是启动一个守护进程
- -m 是分配给Memcached使用的内存数量,单位是MB,默认64MB
- -u 是运行Memcached的用户
- -l 是监听的服务器 IP 地址,默认为所有网卡,安全策略应绑定内网地址
- -p 是设置 Memcached 监听的 TCP 端口,默认11211
- -c 选项是最大运行的并发连接数,默认是1024
- -P 是设置保存 Memcached 的pid文件,我这里是保存在 /tmp/memcached.pid
- 创建自启动脚本
vim /etc/init.d/memcached
- 往脚本文件写入如下内容(注意 CentOS 和 Ubuntu 的区别)
#! /bin/sh
# 注意:以下代码根据系统选择
################# CentOS 代码如下:
# chkconfig: - 55 45
# description: The memcached daemon is a network memory cache service.
# processname: memcached
# config: /etc/sysconfig/memcached
# Source function library.
. /etc/rc.d/init.d/functions
################# CentOS 代码结束
################# Ubuntu 代码如下:
### BEGIN INIT INFO
# Provides: lostphp.com
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: wsocket service
# Description: wsocket service daemon
### END INIT INFO
# Source function library.
. /lib/lsb/init-functions
################# Ubuntu 代码结束
PORT=11211
USER=root
MAXCONN=1024
CACHESIZE=128
OPTIONS=""
if [ -f /etc/sysconfig/memcached ];then
. /etc/sysconfig/memcached
fi
# Check that networking is up.
if [ "$NETWORKING" = "no" ]
then
exit 0
fi
RETVAL=0
start () {
echo "Starting memcached ..."
chown $USER /usr/local/memcached/bin/memcached
/usr/local/memcached/bin/memcached -d -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /tmp/memcached.pid $OPTIONS
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/memcached
}
stop () {
echo "Stopping memcached ..."
killproc memcached
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f /var/lock/subsys/memcached
rm -f /tmp/memcached.pid
fi
}
restart () {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status memcached
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/memcached ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|condrestart}"
exit 1
esac
exit $?
- 启动服务
# 为启动脚本增加权限
chmod +x /etc/init.d/memcached
# 启动
/etc/init.d/memcached start
# 停止
/etc/init.d/memcached stop
# 开机自启动
# CentOS
chkconfig memcached on
# Ubuntu
systemctl enable memcached
第三部分:Memcached 命令
1. set 命令:将 value(数据值) 存储在指定的 key(键) 中,如果set的key已经存在,更新key所对应的数据
# 语法
set key flags exptime bytes [noreply]
value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- exptime : 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes : 在缓存中存储的字节长度
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
- value : 存储的值 (回车第二行)
输出信息:
- STORED : 保存成功后输出
- ERROR : 保存出错或语法错误
# 使用示例
set k1 0 900 5
hello
# 成功返回
STORED
# 失败返回
CLIENT_ERROR bad data chunk
ERROR
2. get 命令:获取存储在 key(键) 中的 value(数据值),如果 key 不存在,则返回空。
# 语法
get key key1 key2
# 使用示例
get k1 k2
# 返回
VALUE k1 0 5
hello
END
3. gets 命令:获取带有 CAS 令牌存 的 value(数据值),如果 key 不存在,则返回空。
# 语法
gets key key1 key2
# 使用示例:在 使用 gets 命令的输出结果中,在最后一列的数字 代表当前 key 的 CAS 令牌
gets k1 k2
# 返回
VALUE k1 0 5 422
hello
END
4. cas 命令: CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作。
-
仅当前客户端最后一次取值后,该 key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
-
检查是通过cas_token参数进行的, 这个参数是 Memcached 指定给已经存在的元素的一个唯一的64位值。
- 使用 cas 命令 前 要使用 gets 命令获取当前 key 的令牌,然后在使用 cas 命令去设置对应的 value 值。这样做虽然有一些繁琐,但是能保证在高并发情况下,数据的唯一性,不会被多个应用同时更改。
# 语法
cas key flags exptime bytes unique_cas_token [noreply]
value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- exptime : 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes : 在缓存中存储的字节长度
- unique_cas_token : 通过 gets 命令获取的一个唯一的64位值。
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
- value : 存储的值 (回车第二行)
输出信息:
- STORED : 保存成功后输出
- ERROR : 保存出错或语法错误
- EXISTS : 在最后一次取值后另外一个用户也在更新该数据
- NOT_FOUND : Memcached 服务上不存在该键值
# 使用示例:value更新key对应的unique_cas_token 也随之更新
cas k1 0 900 4 422
demo
# 结果返回
STORED
# 重新获取k1
gets k1
# 结果返回
VALUE k1 0 4 425
demo
END
5. delete 命令:删除已存在的 key(键)。
# 语法: 一次只能删除一个键值
delete key [noreply]
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
输出信息:
- DELETED : 成功
- ERROR : 语法错误或删除失败
- NOT_FOUND :key 不存在
# 使用示例
delete k1
# 结果返回
DELETED
delete k3
# 结果返回
NOT_FOUND
6. add 命令:将 value(数据值) 存储在指定的 key(键) 中。
# 语法
add key flags exptime bytes [noreply]
value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- exptime : 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes : 在缓存中存储的字节长度
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
- value : 存储的值 (回车第二行)
输出信息:
- STORED : 保存成功后输出
- NOT_STORED : key已存在, value不变
- ERROR : 保存出错或语法错误
# 使用示例
add k1 0 900 3
add
# 结果返回
STORED
# 查询key
gets k1
# 结果返回
VALUE k1 0 3 456
add
END
# 重新add操作
add k1 0 900 5
again
#结果返回
NOT_STORED
7. replace 命令:替换已存在的 key(键) 的 value(数据值)。
# 语法
replace key flags exptime bytes [noreply]
value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- exptime : 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes : 在缓存中存储的字节长度
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
- value : 存储的值 (回车第二行)
输出信息
- STORED : 成功
- ERROR : 语法错误
- NOT_STORED : key 不存在,替换失败
# 使用示例
replace k1 0 900 12
replace.demo
# 结果返回
STORED
# 查询key
gets k1
# 结果返回
VALUE k1 0 7 457
replace
END
# delete k1
delete k1
# replace 操作
replace k1 0 900 12
replace.demo
# 结果返回
NO_STORED
8. prepend / append 命令:向已存在 key (键) 的 value (数据值) 前面(后面)追加数据 。
# 语法
# 在前面追加
prepend key flags exptime bytes [noreply]
value
# 在后面追加
append key flags exptime bytes [noreply]
value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
- exptime : 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
- bytes : 在缓存中存储的字节长度
- noreply(可选) : 该参数告知服务器不需要返回数据(若设置了noreply参数则没有输出)
- value : 存储的值 (回车第二行)
输出信息:
- STORED : 成功
- NOT_STORED : key 不存在,操作失败
- CLIENT_ERROR :语法错误
# 使用示例
# 向不存在的key追加
prepend k1 0 900 5
hello
# 返回
NO_STORED
HELLO MEMCACHED
set k1 0 900 2 # 输入2空格
--
# 返回
STORED
prepend k1 0 900 5
hello
# 返回
STORED
append k1 0 900 9
memcached
# 返回
STORED
# 查询结果
gets k1
# 返回
VALUE K1 0 16 430
hello memcached
END
9. incr / decr 命令:对已存在的 key(键) 的数字值进行自增或自减操作。
# 语法
incr key increment_value
decr key decrement_value
参数介绍:
- key: 键值 key-value 结构中的 key,用于查找缓存值
- increment_value:增加的数值。
- decrement_value:减少的数值。
输出信息:
- NOT_FOUND:key : key 不存在
- CLIENT_ERROR : value不是数字
- ERROR :其他错误,如语法错误等
# 使用示例
set int 0 900 2
20
# 返回
STORED
# 自增
incr int 3
# 返回
23
# 自减
decr int 30
# 返回
0
# 查询
gets int
# 返回
VALUES 0 2 454
0
END