memcache学习笔记
memcache初识
什么是memcache
memcached是一个基于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
分别使用命令解压
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
出现一个窗口
按ctrl+]键
回车即可使用memcached的命令
命令详解
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
运行一个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 非后台运行
测试
准备几个命令行窗口进行测试,测试实例中,11211和11212是主服务器,11213和11214是副服务器
设置值
设置一个key为name的值。
结论:
设置值的时候,通过算法会把值分别给一台主服务器和一台副服务器,不是所有的服务器都能收到这个值。
关闭两台主服务器。
结论:
两台主服务器宕机时,通过magent依然能够设置值,但是memcached是接收不到值的。
获取值
关闭保存了key为name的主服务器。
结论:
关闭了主服务器之后,依然能够获取到key,这是因为这个key是从副服务器上面获取到的。
关闭主服务器后再开启。
结论:
在设置了某个值之后,主副服务器都有这个值,关闭对应的主服务器后,能够从副服务器获取到值,再次开启主服务器后,值不能获取。
关闭保存了key为name的副服务器。
结论:
关闭了主副服务器之后,name便不能获取。
重新开启主副服务器。
结论:
如果某个key保存在主副服务器上,而这两台服务器刚好被关闭,那么key丢失。
优缺点
优点
1、配置较少,拿来即用。
2、速度快。
3、轻量,只存储key-value键值对,String类型。
4、在数据量为100kb及以上时使用更好。
缺点
1、安全性不高,由于配置里没有做登录验证,所以建议和ip限制一起使用。
2、不支持数据的持久化,重启后缓存数据消失。
3、使用magent搭建集群后,如果主服务器宕机,虽然能够再获取到值,但是重启主服务器后,值会丢失。