memcache:
介绍
最新版本v1.5.16
老牌的内存缓存技术,对相关领域支持比较丰富,window和linux都可以使用,各种框架(tp/yii等等)都支持使用,session的信息可以非常方便的保存到该memcache中,每个key保存的数据量最大为1M,支持的数据类型比较单一,就是String类型,数据存放在内存中,不支持持久化
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度, MemCaChe是一个存储键值对的HashMap
存储一般的K-V键值对, 基于LruCache做缓存
redis:支持比较多的数据类型(String/list/set/sortset/hash),redis支持集合计算的(set类型支持),每个key最大数据存储量为1G
它是由什么组成的?
客户端软件,提供可用的memcached服务器列表。
基于客户端的散列算法,根据“密钥”选择服务器。查询成本几乎为O(1)
服务器软件,将值及其密钥存储到内部哈希表中。
LRU,确定何时丢弃旧数据(如果内存不足),或重用内存。
失效超时机制:
超过有效期:具体是通过“懒惰”机制删除该过期数据,与过期session的删除类似。
过期session删除机制:session是以文件形式保存的硬盘中,如果有的session文件已经过期了,则该session文件不会立即被删除,而是后期其他用户访问网站使用session的同时会有一定的几率触发删除过期的session文件。也就是被访问的时候删除, 另外因为内存大小有限lru也会让一部分缓存失效
memcache的过期数据删除也是懒惰机制实现,如果有一个key过期了,其本身不会马上被删除,而是我们调用get方法获取数据的同时会删除该过期的数据
缓存空间耗尽
如果存储的数据超过memcache最大的存储限制(默认是64M),此时还继续存入数据,则会把最近不常使用的key就删除了。该机制名称为LRU(least recently use)优先删除最近很好使用的key
采用一致性哈希
,一致性哈希是一种模型,它允许在添加或删除服务器时更稳定地分发密钥
压缩大值是一种很好的方式来获得更多的内存降压。压缩可以为某些值节省大量内存,并且还可以减少延迟,因为较小的值可以更快地通过网络获取, 但会带来一定的性能损失,小型网站可以不用压缩数据
协议简单
· 基于libevent的事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能
· 内置内存存储方式
· memcached不互相通信的分布式
协议
memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
因此,通过telnet也能在memcached上保存数据、取得数据
安装:
yum install memcached
编译安装
wget http://memcached.org/latest 下载最新版本
tar -zxvf memcached-1.x.x.tar.gz 解压源码
cd memcached-1.x.x 进入目录
./configure --prefix=/usr/local/memcached 配置
make && make test 编译
make install 安装
启动
如果是root启动则需要加上-u root
/usr/local/memcached/bin/memcached -d -m 512 -l 127.0.0.1 -p 10000 -u root
否则会报错:
# /usr/local/memcached/bin/memcached -p 11211
can't run as root without the -u switch
注册为系统服务:
添加用户
useradd -d /run/memcached memcached
也可以直接在文件中添加
添加用户组
# vi /etc/group
memcached:x:797:
添加用户
# vi /etc/passwd
memcached:x:796:797:Memcached daemon:/run/memcached:/sbin/nologin
添加配置文件:
/usr/local/memcached/memcached.conf
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="4096"
OPTIONS=""
添加系统服务文件
vi /usr/lib/systemd/system/memcached.service
[Unit]
Description=Memcached
Before=httpd.service
After=network.target
[Service]
Type=simple
EnvironmentFile=-/usr/local/memcached/memcached.conf
ExecStart=/usr/local/memcached/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
[Install]
WantedBy=multi-user.target
启动:
systemctl daemon-reload
systemctl enable memcached.service
systemctl start memcached.service
systemctl status memcached.service
● memcached.service - Memcached
Loaded: loaded (/usr/lib/systemd/system/memcached.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2019-07-04 16:01:31 CST; 2s ago
Main PID: 10926 (memcached)
CGroup: /system.slice/memcached.service
└─10926 /usr/local/memcached/bin/memcached -u memcached -p 11211 -m 4096 -c 1024
Jul 04 16:01:31 cnsz92vl05340 systemd[1]: Started Memcached.
Jul 04 16:01:31 cnsz92vl05340 systemd[1]: Starting Memcached...
telnet 连接测试 quit退出连接
# telnet 192.168.1.2 11211
Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'.
ERROR
set test 0 0 2
bar
CLIENT_ERROR bad data chunk
ERROR
set test 0 0 3
bar
STORED
quit
命令
set命令
set key flags exptime bytes [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
set m1 0 100 4
test
STORED
get m1
VALUE m1 0 4
test
END
注意bytes需要指定value的长度, 如果不精确指定,则无法存储, 需要等待足够的值输入才能被存储, 例如:
set m1 0 100 32
this is a test one for 32
ok it
STORED
输入一段后,长度不够,补齐后存储成功
Memcached add 命令
Memcached add 命令用于将 value(数据值) 存储在指定的 key(键) 中。
如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且您将获得响应 NOT_STORED
add key flags exptime bytes [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
add m1 0 100 4
trxx
NOT_STORED
add m2 0 100 3
new
STORED
Memcached replace 命令
Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。
如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。
replace key flags exptime bytes [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
replace m2 0 100 4
new1
STORED
get m2
VALUE m2 0 4
new1
END
Memcached append 命令
append key flags exptime bytes [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
add m2 0 100 3
new
STORED
append m2 0 100 5
_new2
STORED
get m2
VALUE m2 0 8
new_new2
END
Memcached prepend 命令
Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。
prepend key flags exptime bytes [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
VALUE m2 0 9
init_add1
END
prepend m2 0 900 4
pre_
STORED
get m2
VALUE m2 0 13
pre_init_add1
END
Memcached CAS 命令
用于执行一个"检查并设置"的操作
它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。
检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值
cas key flags exptime bytes unique_cas_token [noreply]
value
key:键值 key,用于查找缓存值。
flags:标签,使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远不过期)
bytes:在缓存中存储的字节数
unique_cas_token通过 gets 命令获取的一个唯一的64位值。
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)
set tp 0 900 9
memcached
STORED
cas tp 0 900 5 1
redis
EXISTS
查询命令:
Memcached get 命令
获取单个:
get key
获取多个get key1 key2 key3
get m1 m2
VALUE m2 0 13
pre_init_add1
END
注:m1已经过期
Memcached gets 命令
gets key
获取多个:
gets key1 key2 key3
gets m1 m2
VALUE m2 0 13 12
pre_init_add1
END
Memcached delete 命令
delete key [noreply]
delete m1
NOT_FOUND
delete m2
DELETED
Memcached incr 与 decr 命令
incr key increment_value
set m3 0 900 1
8
STORED
incr m3 2
10
get m3
VALUE m3 0 2
10
END
decr 命令
decr key decrement_value
get m3
VALUE m3 0 2
10
END
decr m3 3
7
Memcached stats 命令
一些参数说明:
pid: memcache服务器进程ID
uptime:服务器已运行秒数
time:服务器当前Unix时间戳
version:memcache版本
pointer_size:操作系统指针大小
rusage_user:进程累计用户时间
rusage_system:进程累计系统时间
curr_connections:当前连接数量
total_connections:Memcached运行以来连接总数
cmd_get:get命令请求次数
cmd_set:set命令请求次数
get_hits:get命令命中次数
get_misses:get命令未命中次数
delete_misses:delete命令未命中次数
delete_hits:delete命令命中次数
cas_badval:使用擦拭次数
limit_maxbytes:分配的内存总大小(字节)
accepting_conns:服务器是否达到过最大连接(0/1)
threads:当前线程数
bytes:当前存储占用的字节数
curr_items:当前存储的数据总数
total_items:启动以来存储的数据总数
evictions:LRU释放的对象数目
reclaimed:已过期的数据条目来存储新数据的数目
Memcached stats items 命令
Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)
stats items
TAT items:1:number 2
STAT items:1:number_hot 0
STAT items:1:number_warm 0
STAT items:1:number_cold 2
STAT items:1:age_hot 0
STAT items:1:age_warm 0
STAT items:1:age 6032
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 2
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:evicted_active 0
STAT items:1:crawler_reclaimed 3
STAT items:1:crawler_items_checked 34
STAT items:1:lrutail_reflocked 0
STAT items:1:moves_to_cold 19
STAT items:1:moves_to_warm 5
STAT items:1:moves_within_lru 0
STAT items:1:direct_reclaims 0
STAT items:1:hits_to_hot 0
STAT items:1:hits_to_warm 0
STAT items:1:hits_to_cold 16
STAT items:1:hits_to_temp 0
Memcached stats slabs 命令
stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 2
STAT 1:free_chunks 10920
STAT 1:free_chunks_end 0
STAT 1:mem_requested 131
STAT 1:get_hits 16
STAT 1:cmd_set 24
STAT 1:delete_hits 2
STAT 1:incr_hits 7
STAT 1:decr_hits 1
STAT 1:cas_hits 0
STAT 1:cas_badval 2
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048576
Memcached stats sizes 命令
Memcached stats sizes 命令用于显示所有item的大小和个数。
该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。
stats sizes
Memcached flush_all 命令
Memcached flush_all 命令用于用于清理缓存中的所有 key=>value(键=>值) 对。
flush_all [time] [noreply]
set m4 0 900 3
new
STORED
flush_all
OK
get m4
END