Memcached 介绍、安装、常用命令

第一部分:Memcached介绍

定义:自由开源的,高性能、分布式内存对象缓存系统

  • 高性能是指:日常生产环境下 QPS(每秒查询率) 为4-6万,如果利用多核优势,单实例吞吐量可以达到几十万 QPS(取决于 key 和 value 的字节大小以及服务器的硬件性能)
  • 分布式是指:可以跨服务器分布部署

特征:

  • 协议简单:服务端和客户端通信并不使用复杂的 xml 等格式,而是用基于文本行的协议,可以通过 telnet 直接访问服务器进行数据查询
  • 基于libevent
  • 内存存储:服务器重启所有数据丢失
  • 分布式:分布式内存对象缓存系统,它的分布式是基于客户端算法的。本身各个 Memcached 服务器是不进行相互通讯、数据拷贝的。这点和 MySQL、Redis 和 MongoDB 都是不一致的。MySQL就是一个典型的主从同步分布式处理,更新操作会统一在主库上进行,按照一定的同步机制,将主库数据同步到从库中。而 Memcached 各个服务器之间是不进行相互通信的

第二部分:Centos 编译安装 Memcached

安装 libevent
  1. 下载 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
  1. 解压到src
tar zxvf libevent-2.1.10-stable.tar.gz
  1. 编译安装
yum install gcc
cd libevent-2.1.10-stable
./configure --prefix=/usr
make
make install
  1. 验证是否安装成功
ls -a /usr/lib | grep libevent
安装 Memcached
  1. 下载 memcached
cd /usr/local/src
wget http://www.memcached.org/files/memcached-1.5.16.tar.gz
  1. 解压到src
tar zxvf memcached-1.5.16.tar.gz
  1. 编译安装
cd memcached-1.5.16
./configure -prefix=/usr/local/memcached \
-with-libevent=/usr
make
make install
  1. 运行 Memcached
# 运行
/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
  1. 配置开机自动启动脚本
  • 创建自启动脚本
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 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
# 语法
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(数据值)。
  • 如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
# 语法
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 与 decr 命令操作的数据必须是十进制的32位无符号整数。
  • 如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。
# 语法
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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值