memcache学习笔记

memcache学习笔记

memcache初识

什么是memcache

memcache是一个基于libevent(高性能事件通知库)的开源的高性能的分布式缓存系统。和Redis类似,它也是一个基于内存的key-value型的存储系统。它没有Redis支持的数据类型多,它支持的数据类型只有String类型,内部是一个大的哈希表。

安装

因为memcache是基于libevent的,所以要安装两个程序

wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
wget http://www.memcached.org/files/memcached-1.5.10.tar.gz

QQ截图20191113151813

分别使用命令解压

tar zxvf libevent-2.1.8-stable.tar.gz
tar zxvf memcached-1.5.10.tar.gz

进入livevent文件夹修改配置并安装

./configure --prefix=/usr/local/libevent
make && make install

同理,进入memcached文件夹修改配置并安装

./configure --prefix=/usr/local/memcached --with-libevent==/usr/local/libevent
make && make install

运行

进入memcached文件夹

bin/memcached -m 64 -p 11211 -u root -d

其中:

64:占用空间为64M

11211:端口为11211

root:用户

更多参数:

-p <num> 监听的TCP端口(默认: 11211)
-U <num> UDP监听端口 (默认: 11211, 0 时关闭)
-d 以守护进程方式运行
-u <username> 运行运行 Memcached的账户 非root用户
-m <num> 最大的内存使用单位是MB 默认是64MB
-c <num> 软连接数量默认是1024
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息
-h 打印帮助信息
-i 打印memcached和libevent的版权信息
-l <ip_addr> 绑定地址 (默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)
-P <file> 将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与 -d 一起使用

连接

使用windows的telnet

C:\Users\lxxxxxxy>telnet lixingyu.cn 11211

出现一个窗口

QQ截图20191113153145

按ctrl+]键

QQ截图20191113153227

回车即可使用memcached的命令

QQ截图20191113153327

命令详解

memcached只支持String类型。分三种类型:存储,查找,统计。

存储

set

设置一个key-value值。

set的语法格式:

set key flags exptime bytes [noteply]
value

其中:

key:key-value结构中的key,用于标识。

flags:存储关于key-value的其他信息。

exptime:失效时间,单位为秒,0表示不失效。

bytes:存储的字节数。

noreply:告诉服务器不需要返回数据。

value:存储的值,必须是第二行。

设置成功后,会返回STORED.出错会返回ERROR.

演示:

set name 0 0 6
rlxy93
STORED

get name
VALUE name 0 6
rlxy93
END

add

添加一个value到key中,如果key存在则失败,不存在则成功。

add的语法格式:

add key flags exptime bytes [noreply]
value

演示:

add address 0 0 6
sc
STORED
get address
VALUE address 0 6
sc
END
add address 0 0 6
cq
NOT_STORED

replace

用于替换一个已存在的key的value,如果key不存在返回ERROR。

replace的语法格式:

replace key flags exptime bytes [noreply]
value

演示:

get name
VALUE name 0 6
lxy
END
replace name 0 0 6
rlxy93
STORED
get name
VALUE name 0 6
rlxy93
END

append

用于向一个key的value后面追加数据。

append的语法格式:

append key flags exptime bytes [noreply]
value

演示:

get address
VALUE address 0 6
cq
END
append address 0 0 6
yc
STORED
get address
VALUE address 0 12
cqyc
END

prepend

用于向一个key的value前面追加数据。

prepend的语法格式:

prepend key flags exptime bytes [noreply]
value

演示:

get address
VALUE address 0 12
cqyc
END
prepend address 0 0 6
zg
STORED
get address
VALUE address 0 18
zgcqyc
END

查找

get

根据key获取值。

get的语法格式:

get key1 key2 key3...

演示:

get address
VALUE address 0 18
zgcqyc
END

delete

根据key删除值。

delete的语法格式:

delete key [noreply]

演示:

get name
VALUE name 0 6
rlxy93
END
delete name
DELETED
get name
END

incr/decr

自增或自减指定的数值。

incr/decr的语法格式:

incr/decr key increment_value

演示:

set num 0 0 2
12
STORED
incr num 8
20
decr num 10
10
get num
VALUE num 0 2
10
END

统计

stats

用于返回memcached的信息。

演示:

stats
STAT pid 21064
STAT uptime 4981
STAT time 1573632909
STAT version 1.5.20
STAT libevent 2.1.8-stable
STAT pointer_size 64
STAT rusage_user 0.525532
STAT rusage_system 0.243351
STAT max_connections 1024
STAT curr_connections 2
STAT total_connections 8
STAT rejected_connections 0
STAT connection_structures 4
STAT reserved_fds 20
STAT cmd_get 20
STAT cmd_set 23
STAT cmd_flush 0
STAT cmd_touch 0
STAT cmd_meta 0
STAT get_hits 19
STAT get_misses 1
STAT get_expired 0
STAT get_flushed 0
STAT delete_misses 0
STAT delete_hits 1
STAT incr_misses 0
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 1268
STAT bytes_written 1354
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 slab_reassign_rescues 0
STAT slab_reassign_chunk_rescues 0
STAT slab_reassign_evictions_nomem 0
STAT slab_reassign_inline_reclaim 0
STAT slab_reassign_busy_items 0
STAT slab_reassign_busy_deletes 0
STAT slab_reassign_running 0
STAT slabs_moved 0
STAT lru_crawler_running 0
STAT lru_crawler_starts 3315
STAT lru_maintainer_juggles 9819
STAT malloc_fails 0
STAT log_worker_dropped 0
STAT log_worker_written 0
STAT log_watcher_skipped 0
STAT log_watcher_sent 0
STAT bytes 228
STAT curr_items 3
STAT total_items 9
STAT slab_global_page_pool 0
STAT expired_unfetched 0
STAT evicted_unfetched 0
STAT evicted_active 0
STAT evictions 0
STAT reclaimed 0
STAT crawler_reclaimed 0
STAT crawler_items_checked 13
STAT lrutail_reflocked 8
STAT moves_to_cold 13
STAT moves_to_warm 7
STAT moves_within_lru 4
STAT direct_reclaims 0
STAT lru_bumps_dropped 0
END

flush_all

清除所有的键值对。

flush_all的语法格式:

flush_all [time] [noreply]

其中:

time:多少时间后执行。

演示:

get address
VALUE address 0 18
zgcqyc
END
flush_all
OK
get address
END

集群

准备

安装教程memcached主备安装

运行

运行四个memcached实例

./memcached -m 64 -p 11211 -u root -d
./memcached -m 64 -p 11212 -u root -d
./memcached -m 64 -p 11213 -u root -d
./memcached -m 64 -p 11214 -u root -d

QQ截图20191115192554

运行一个magent实例

./magent -u root -n 51200 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213 -b 127.0.0.1:11214

其中各参数含义如表所示:

magent参数说明:
-h 帮助说明
-u 用户
-g gid
-p 启动端口, 默认11211
-s 服务memcached地址
-b 备份memcached地址
-l 启动IP地址
-n 最大并发数
-D 非后台运行

QQ截图20191115193116

测试

准备几个命令行窗口进行测试,测试实例中,11211和11212是主服务器,11213和11214是副服务器

QQ截图20191115193313

设置值

设置一个key为name的值。

QQ截图20191115193859

结论:

设置值的时候,通过算法会把值分别给一台主服务器和一台副服务器,不是所有的服务器都能收到这个值。


关闭两台主服务器。

QQ截图20191115195111

结论:

两台主服务器宕机时,通过magent依然能够设置值,但是memcached是接收不到值的。

获取值

关闭保存了key为name的主服务器。

QQ截图20191115194417

结论:

关闭了主服务器之后,依然能够获取到key,这是因为这个key是从副服务器上面获取到的。


关闭主服务器后再开启。

QQ截图20191115195900

结论:

在设置了某个值之后,主副服务器都有这个值,关闭对应的主服务器后,能够从副服务器获取到值,再次开启主服务器后,值不能获取。


关闭保存了key为name的副服务器。

QQ截图20191115194526

结论:

关闭了主副服务器之后,name便不能获取。


重新开启主副服务器。

QQ截图20191115194734

结论:

如果某个key保存在主副服务器上,而这两台服务器刚好被关闭,那么key丢失。


优缺点

优点

1、配置较少,拿来即用。

2、速度快。

3、轻量,只存储key-value键值对,String类型。

4、在数据量为100kb及以上时使用更好。

缺点

1、安全性不高,由于配置里没有做登录验证,所以建议和ip限制一起使用。

2、不支持数据的持久化,重启后缓存数据消失。

3、使用magent搭建集群后,如果主服务器宕机,虽然能够再获取到值,但是重启主服务器后,值会丢失。

和Redis对比

QQ截图20191115231647

posted @ 2019-11-15 23:00  lxxxxxxy  阅读(112)  评论(0编辑  收藏  举报