与Redis对比、安装和使用(PHP)
与Redis对比
- 存储方式
memcached数据完全存储在内存中, 本身无数据持久化机制, 断电挂掉时数据会丢失。
redis数据也储存在内存中, 但提供RDB快照和AOF全量备份两张数据持久化方式, 断电重启后可恢复数据 - 数据类型
memcached只支持存储string类型
redis支持string、hash、set、zset、list … - 底层架构不同
redis自己实现了一套vm机制, 进行内存优化(内存数据与磁盘交换自己实现, 未调用系统函数)
安装篇
libevent:
Memcached依赖于libevent库,因此需要先安装 libevent
libevent官方下载地址:http://libevent.org/
cd libevent-2.1.12-stable
./configure --prefix=/usr/local/libevent
make && make install
Memcached源码编译安装:
Memcached官方下载地址:http://memcached.org/
cd memcached-1.6.6
./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
make && make install
cd /usr/local/memcached
./bin/memcached -m 64 -p 11211 -u root -vv
-p
监听的TCP端口(默认: 11211)
-U UDP
监听端口 (默认: 11211, 0 时关闭)
-d
以守护进程方式运行
-u
运行运行 Memcached的账户 非root用户
-m
最大的内存使用单位是MB 默认是64MB
-c
软连接数量默认是1024
-v
输出警告和错误信息
-vv
打印客户端的请求和返回信息
-h
打印帮助信息
-i
打印memcached和libevent的版权信息
-l
绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-P
将PID写入文件,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用
Memcached Docker安装:
# 默认安装最新版本
docker pull memcached
# 创建容器并在后台运行
docker run -d -p 11211:11211 --name memcache memcached
libmemcached:
下载链接: https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --help
./configure --prefix=/usr/local/libmemcached
make && make install
php-memcached扩展:
下载地址 http://pecl.php.net/get/memcached-3.1.5.tgz
cd memcached-3.1.5
./configure --with-php-config=/usr/local/php7.2/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached --disable-memcached-sasl
make && make install
在php.ini
中加入extension=memcached.so
php -m | grep memcached
查看是否安装成功
要在phpinfo
中查看安装是否成功记得重启php-fpm
!!!
使用篇(PHP)
关于Memcached操作方法 https://www.php.net/manual/zh/book.memcached.php
<?php
$m = new Memcached();
// 添加服务
$m->addServer('127.0.0.1', 11211);
var_dump($m);
$result = $m->add('luwei', '123');
var_dump($result);
var_dump($m->get('luwei'));
存储指令
# key:键值 key-value 结构中的 key,用于查找缓存值。
# flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
# exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
# bytes:在缓存中存储的字节数
# value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)
# unique_cas_token通过 gets 命令获取的一个唯一的64位值。
# increment_value:增加的数值。
# decrement_value: 减少的数值
# noreply(可选):该参数告知服务器不需要返回数据
# 作用: 保存 key => value, 如果key已存在则更新value
set key flags exptime bytes [noreply]
value
# 保存 key => value, 如果key已存在则输出 NOT_STORED (操作失败)
add key flags exptime bytes [noreply]
value
# 只对已保存的key进行value更新, key过期或不存在则输出 NOT_STORED (操作失败)
replace key flags exptime bytes [noreply]
value
# 向已保存的key 向后追加数据, 比如以保存的数据是qwer,追加tyuiop, 获取值返回qwertyuiop
append key flags exptime bytes [noreply]
value
# 向已保存的key 向前追加数据, 比如以保存的数据是qwer,追加tyuiop, 获取值返回tyuiopqwer
prepend key flags exptime bytes [noreply]
value
#对一个已存在的key使用gets获取cas令牌, 通过令牌修改数据, 如果数据被修改, 则令牌失效 (类似乐观锁)
cas key flags exptime bytes unique_cas_token [noreply]
value
存储指令
# 获取key的value, key不存在则返回空
get key [key2] [key3] ...
# 获取取带有CAS令牌存的 key的value
gets key [key2] [key3] ...
# 删除已存在的key
delete key [noreply]
# 对key的value进行自增、自减 并返回结果, value必须是十进制的32位无符号整数。
incr key increment_value
decr key decrement_value
统计命令
# 返回统计信息例如 PID(进程号)、版本号、连接数等。
# 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
# 显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)
stats items
# 用于显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats slabs
# 显示所有item的大小和个数。 第一列是 item 的大小,第二列是 item 的个数
stats sizes
#STAT 96 1
#END
# 用于清理缓存中的所有 key=>value, 该命令提供了一个可选参数 time,用于在指定的时间后执行清理缓存操作。
flush_all [time] [noreply]