memcached总结
目录
- 作用
- 应用场景
- 工作流程
- 集群实现方式
- 特点和原理
- 删除和cache机制
- 安装部署
一、memcached是什么,有什么作用?
高性能的内存的缓存系统。
通过在实现规划好的内存空间中临时缓存数据库中的各项数据,来达到减少直接对数据库的直接高并发访问,从而达到提升数据库的访问性能,加网站集群动态应用服务的能力。
简单说就是通过缓存数据库查询结果,减少数据库访问次数,以提高动态web应用的速度和扩展性。
二、在企业集群架构中应用场景
A:作为数据库的前端缓存应用
a/ 完整缓存,静态缓存
商品信息,事前放到内存里,然后在对外提供访问。预热。用户访问时只读取memched缓存,就不用读数据库。
b/ 热点缓存
需前端web程序配合,只缓存热点数据,即缓存经常被访问的数据。
先预热数据库里的基础数据,然后动态更新。所谓动态更新,程序先读取缓存,如果缓存里面没有对应数据,再去读取数据库,然后程序把读到的数据放入缓存。
1、 电商秒杀,双十一等高并发业务。例如,小米秒杀只获取资格,而不是瞬间秒杀到手商品。只更改用户状态,节省服务器资源。
2、如果数据更新,同时出发缓存更新,避免给客户过期数据。
c/ 对于持久化存储系统。比如redis,可以替代一部分数据库的存储,一些简单的数据业务,投票,统计,好友统计等
B:session会话共享存储
三、在不同企业业务场景中的工作流程
a 当web程序需要访问后盾数据库获取数据时,会优先访问memcached内存缓存。如果缓存中有对应数据就直接放回给前端及用户;如果没有数据,也就是没有命中,再由程序请求数据库,获取到数据后除了返回给客户,还会把数据放入到memcaced中,以便下次请求被访问。memcached始终是数据库的挡箭牌,从而减轻数据库的压力,提高整个网站的相应速度。
b 当程序更新、修改、杀出等操作时,会同时发送请求通知memcached已经缓存的数据失效,从而保证缓存的数据和数据库中的一致。
如果是在高并发场合,除了通知过期缓存失效外,还会通过相关机制,使用户访问新数据前,通过程序预先把更新过的数据推送到memcached中缓存起来。这样可以减少数据库的访问压力,提升命中率。
四、服务分布式集群如何实现?
memcached集群和普通集群的区别:所有memcached的数据综合才是数据库的综合。
a 程序实现
程序加载所有memcached的ip列表,通过对key做一致性哈希
一致性hash,目的是不但保证每个对象只请求一个对应的服务器,而且当节点宕机缓存服务器的更新重新分配比例降到最低。
b 负载均衡器/代理,如magnet
1、安装
wget http://memagent.googlecode.com/files/magent-0.5.tar.gz
tar zxvf magent-0.5.tar.gz
/sbin/ldconfig
sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
make
cp magent /usr/bin/magent
2、命令详解
-h this message -u uid -g gid -p port, default is 11211. (0 to disable tcp support) -s ip:port, set memcached server ip and port -b ip:port, set backup memcached server ip and port -l ip, local bind ip address, default is 0.0.0.0 -n number, set max connections, default is 4096 -D do not go to background -k use ketama key allocation algorithm -f file, unix socket path to listen on. default is off -i number, max keep alive connections for one memcached server, default is 20 -v verbose
3、启动magent -u root -n 51200 -l 192.168.1.2 -p 12000 -s 192.168.1.4:11211 -s
192.168.1.5:11211
五、特点和原理
- 完全基于内存,没有持久性存储的设计,一旦重启,数据丢失
- 异步I/O模型, 使用libevent模型的事件通知机制
- 节点之间相互独立
- 被缓存的数据是以键值对形式存在的
- 可以设定过期时间,过期后自动删除。是在访问的时候删除,根据时间戳判断
- 内存分配机制是对特定的内存进行分块,再把多个块分为一组
六、删除和cache机制
cache机制是LRU(最近最少用)算法,加上item过期失效。如果内存不够用了,过期的会最先被替换,接着是lru算法算出来的。
-m可以指定不被删除
七、安装部署
1、下载
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz
wget https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
2、安装
# tar zxvf libevent-*.tar.gz
# cd libevent-2.0.21
# ./configure –prefix=/usr/local/libevent
# make
# make install
#测试是否安装成功
# ls -al /usr/lib | grep libevent
# tar zxvf memcached-1.4.15.tar.gz
# cd memcached-1.4.15
#这里安装的时候需要制定libevent的安装路径
# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/
# make
# make install
#检查是否安装成功
# ls -al /usr/local/bin/mem*
3、启动
/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211 -c 1024 –P /tmp/memcached.pid
启动参数说明:
-d 选项是启动一个守护进程。
-u root 表示启动memcached的用户为root。
-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。
-M return error on memory exhausted (rather than removing items)。
-u 是运行Memcache的用户,如果当前为root 的话,需要使用此参数指定用户。
-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。
-c 选项是最大运行的并发连接数,默认是1024。
-P 是设置保存Memcache的pid文件。
4、测试
[root@localhost /]# telnet 192.168.141.64 12000
Trying 192.168.141.64...
Connected to 192.168.141.64 (192.168.141.64).
Escape character is '^]'.
set key1 0 60 4
zhou
STORED
get key1
VALUE key1 0 4
zhou
END
备注:
参数详细说明
memcached 1.4.2
-p 监听的TCP端口(默认: 11211)
-U 监听的UDP端口(默认: 11211, 0表示不监听)
-s 用于监听的UNIX套接字路径(禁用网络支持)
-a UNIX套接字访问掩码,八进制数字(默认:0700)
-l 监听的IP地址。(默认:INADDR_ANY,所有地址)
-d 作为守护进程来运行。
-r 最大核心文件限制。
-u 设定进程所属用户。(只有root用户可以使用这个参数)
-m 单个数据项的最大可用内存,以MB为单位。(默认:64MB)
-M 内存用光时报错。(不会删除数据)
-c 最大并发连接数。(默认:1024)
-k 锁定所有内存页。注意你可以锁定的内存上限。
试图分配更多内存会失败的,所以留意启动守护进程时所用的用户可分配的内存上限。
(不是前面的 -u 参数;在sh下,使用命令"ulimit -S -l NUM_KB"来设置。)
-v 提示信息(在事件循环中打印错误/警告信息。)
-vv 详细信息(还打印客户端命令/响应)
-vvv 超详细信息(还打印内部状态的变化)
-h 打印这个帮助信息并退出。
-i 打印memcached和libevent的许可。
-P 保存进程ID到指定文件,只有在使用 -d 选项的时候才有意义。
-f 块大小增长因子。(默认:1.25)
-n 分配给key+value+flags的最小空间(默认:48)
-L 尝试使用大内存页(如果可用的话)。提高内存页尺寸可以减少"页表缓冲(TLB)"丢失次数,提高运行效率。
为了从操作系统获得大内存页,memcached会把全部数据项分配到一个大区块。
-D 使用 作为前缀和ID的分隔符。
这个用于按前缀获得状态报告。默认是":"(冒号)。
如果指定了这个参数,则状态收集会自动开启;如果没指定,则需要用命令"stats detail on"来开启。
-t 使用的线程数(默认:4)
-R 每个连接可处理的最大请求数。
-C 禁用CAS。
-b 设置后台日志队列的长度(默认:1024)
-B 绑定协议 - 可能值:ascii,binary,auto(默认)
-I 重写每个数据页尺寸。调整数据项最大尺寸。