Memcached的基础使用
1、Memcached是一种高性能key/value数据缓存系统
memcached的特点:
1)协议简单
memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。
2)基于libevent事件处理
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥IO的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
3)基于内存完成数据存储:LRU算数(最近最少使用算法);为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
4)memcached互不通信的集群:分布式;memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。
2、Memcached的安装与启动
[[email protected] ~]# yum install memcached -y
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
jyy | 4.1 kB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.15-9.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
======================================================================================================================
Package Arch Version Repository Size
======================================================================================================================
Installing:
memcached x86_64 1.4.15-9.el7 jyy 84 k
Transaction Summary
======================================================================================================================
Install 1 Package
Total download size: 84 k
Installed size: 172 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : memcached-1.4.15-9.el7.x86_64 1/1
Verifying : memcached-1.4.15-9.el7.x86_64 1/1
Installed:
memcached.x86_64 0:1.4.15-9.el7
Complete!
[[email protected] ~]# systemctl start memcached.service
[[email protected] ~]# ss -tunlp |grep memcached
tcp UNCONN 0 0 *:11211 *:* users:(("memcached",1871,28))
tcp UNCONN 0 0 :::11211 :::* users:(("memcached",1871,29))
tcp LISTEN 0 128 *:11211 *:* users:(("memcached",1871,26))
tcp LISTEN 0 128 :::11211 :::* users:(("memcached",1871,27))
[[email protected] ~]#
3、启动Memcached常用参数:
-p < num > :设置TCP端口号;默认设置为: 11211;
-U < num > :UDP监听端口;默认: 11211, 0 时关闭;
-l <ip_addr> :绑定地址,默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问;
-d :以daemon方式运行
-u < username >:绑定使用指定用于运行进程< username >
-m < num >:允许最大内存用量,单位M (默认: 64 MB)
-P < file > :将PID写入文件,这样可以使得后边进行快速进程终止, 需要与-d 一起使用
4、基本命令
1)set命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。
[[email protected] ~]# telnet localhost 11211 //连接本地11211端口
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set mykey 0 10 3 //设置键为mykey;0表示在缓存中保存键值对的时间长度(以秒为单位,0 表示永远);10表示value值得保存时长;3表示设置的值的字节长度
aaa //值为aaa
STORED
get mykey //查看mykey的值
VALUE mykey 0 3
aaa //返回aaa
END
get mykey //十秒钟过去值便消失了
END
2)append命令在一个键后面添加字节值
set mykey 0 60 11
hello world
STORED
get mykey
VALUE mykey 0 11
hello world
END
append mykey 0 60 1 //在mykey键的后面添加1个字节
a //添加的值
STORED
get mykey
VALUE mykey 0 12
hello worlda //添加成功
END
3)prepend命令在一个键的前面添加字节值
set mykey 0 60 11
hello world
STORED
prepend mykey 0 60 4 //在mykey键的前面添加四个字节
hi!
STORED
get mykey
VALUE mykey 0 15
hi! hello world //返回成功
END
4)delete命令用来删除一个键的值
set mykey 0 60 11
hello world
STORED
get mykey
VALUE mykey 0 11
hello world
END
delete mykey
DELETED
get mykey //再次查看mykey的值便没有结果返回
END
5)incr命令在某一个键的数值上加上某值
set mykey 0 60 1
5 //设置mykey的值为5
STORED
get mykey
VALUE mykey 0 1
5
END
incr mykey 3 //在mykey的值的基础上加3
8
get mykey
VALUE mykey 0 1
8 //返回值则变为了8
END
6)decr命令在某一个键的数值上减去某值
set mykey 0 60 1
5 //设置mykey的值为5
STORED
decr mykey 3 //减去3
2
get mykey
VALUE mykey 0 1
2 //mykey的返回值则为2
END
7)flush_all清空所有的键值缓存
set mykey1 0 0 3
abc
STORED
set mykey2 0 0 3
def
STORED
get mykey1
VALUE mykey1 0 3
abc
END
get mykey2
VALUE mykey2 0 3
def
END
flush_all //执行清空操作
OK
get mykey1 //没有值返回
END
get mykey2
END
8)stats命令转储所连接的 memcached 实例的当前统计数据。执行 stats 命令显示了关于当前 memcached 实例的信息:
stats
STAT pid 1871 //进程ID
STAT uptime 2663 //服务器运行秒数
STAT time 1549449725 //服务器当前unix时间戳
STAT version 1.4.15 //服务器版本
STAT libevent 2.0.21-stable
STAT pointer_size 64 //操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.079676 //进程累计用户时间
STAT rusage_system 0.112874 //进程累计系统时间
STAT curr_connections 10 //当前打开连接数
STAT total_connections 11 //曾打开的连接总数
STAT connection_structures 131 //服务器分配的连接结构数
STAT reserved_fds 20
STAT cmd_get 27 //执行get命令总数
STAT cmd_set 17 //执行set命令总数
STAT cmd_flush 1 //指向flush_all命令总数
STAT get_hits 14 //get命中次数
STAT get_misses 13 //get未命中次数
STAT delete_misses 0 //delete未命中次数
STAT delete_hits 1 //delete命中次数
STAT incr_misses 0 //incr未命中次数
STAT incr_hits 2 //incr命中次数
STAT decr_misses 0 //decr未命中次数
STAT decr_hits 0 //decr命中次数
STAT cas_misses 0 //cas未命中次数
STAT cas_hits 0 //cas命中次数
STAT cas_badval 0 //使用擦拭次数
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 15785 //读取字节总数
STAT bytes_written 15222 //写入字节总数
STAT limit_maxbytes 67108864 //分配的内存数(字节)
STAT accepting_conns 1 //目前接受的链接数
STAT listen_disabled_num 0
STAT time_in_listen_disabled_us 0
STAT threads 4 //总线程数
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT malloc_fails 0
STAT conn_yields 0
STAT bytes 0 //存储item字节数
STAT curr_items 0 //item个数
STAT total_items 34 //item总数
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evictions 0 //为获取空间删除item的总数
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 0
STAT lrutail_reflocked 0
9)stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等
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 0
STAT 1:free_chunks 10922
STAT 1:free_chunks_end 0
STAT 1:mem_requested 0
STAT 1:get_hits 14
STAT 1:cmd_set 17
STAT 1:delete_hits 1
STAT 1:incr_hits 2
STAT 1:decr_hits 1
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END
5、Memcached的内存存储
slab allocation:整理内存以进行复用;
age:分配给slab用于再次分割为chunk的内存空间
chunk:用于缓存缓存对象的空间;
slab class:特定大小的chunk组合而成的组;
1)调整chunk size大小:
[[email protected] ~]# memcached -u memcached -vv -f 2.0
slab class 1: chunk size 96 perslab 10922
slab class 2: chunk size 192 perslab 5461
slab class 3: chunk size 384 perslab 2730
slab class 4: chunk size 768 perslab 1365
slab class 5: chunk size 1536 perslab 682
slab class 6: chunk size 3072 perslab 341
slab class 7: chunk size 6144 perslab 170
slab class 8: chunk size 12288 perslab 85
slab class 9: chunk size 24576 perslab 42
slab class 10: chunk size 49152 perslab 21
slab class 11: chunk size 98304 perslab 10
slab class 12: chunk size 196608 perslab 5
slab class 13: chunk size 393216 perslab 2
slab class 14: chunk size 1048576 perslab 1
failed to listen on TCP port 11211: Address already in use
//调整chunk size增长因子为2倍
2)memcached-tool查看stats信息
[[email protected] ~]# memcached-tool 127.0.0.1
# Item_Size Max_age Pages Count Full? Evicted Evict_Time OOM
1 96B 25s 1 1 yes 0 0 0
#:slab class的编号;
Ltem_size:Chunk大小;
Max_age:缓存对象的生存时间;
Pages:分配给slab内存页数;
Count:slab内的记录数;
Full:slab内是否仍有空闲chunk;