Memcached原理与应用
标签: linux
笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流
1.Memcached是什么
- 高性能
- 支持高并发
- 分布式内存缓存系统
协议简单且部署方便
服务端软件名字如: Memcached-1.4.24.tar.gz
客户端软件的名字形如: Memcache-2.25.tar.gz
2.作用和原理
多数Web应用都将数据保存到关系型数据库中,如MySQL,Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会出现加重、响应缓慢、导致网站打开延迟等问题。所以Memcached的主要目的是通过自身内存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态Web应用的速度、提高网站架构的并发能力和可扩展性。
通过在事先规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直新年好高并发访问,从而达到提升大规模网站集群中动态服务的并发访问能力
web服务器读取数据时先读memcached服务器,若memcached没有,则向数据库请求数据,然后web再把请求到的数据发送到memcached
常见内存缓存服务软件对比
软件 | 类型 | 主要作用 |
---|---|---|
Memcached | 纯内存型 | 常用于缓存网站后端的各类数据,例如数据库中的数据 |
Redis、Memcachedb(新浪开发) | 可持久化存储,即使用内存,也会使用磁盘存储 | 1、缓存后端数据库的查询数据。 2、作为关系数据库的重要补充。 |
Squid、Nginx | 内存或内存加磁盘缓存 | 主要用一缓存web前端的服务内容 |
应用场景
1.完整数据缓存
例如:电商的商品分类功能不会经常变动,就可以事先放到Memcached里,然后对外提供数据访问,即”数据预热”。
这时只需要读取缓存而无需读取数据,数据库访问压力大大降低了。
***
为什么商品分类数据可事先放到缓存?
因为商品分类几乎都是由内部人员管理的,如需更新数据,更新数据库后,就可以把数据同时更新到Memcached里。 商品分类更新频率不是很大。 如果把商品分类数据做成静态化文件,然后,通过在前端WEB缓存或者使用CDN加速效果更好。
2.热点数据缓存
热点数据缓存一般是用于由用户更新的商品,如淘宝卖家,当卖家新增商品后,网站程序就会把商品写入后端数据库,同时把这部分数据放入Memcache内存中,下一次访仍这个商品的请求就直接从Memcached中取走。这种方法用来缓存网站热点数据,即利用Memcached缓存经常被访问的数据。
这个过程可以通过程序实现,也可在数据库上安装相关软件进行设置,直接由数据库把内容更新到Memcached中,相当于Memcached是MySQL从库.
几大电商双11秒杀场景:
在这种高并发情况下,必须先预热各种缓存,包括前端的Web缓存和后端数据库缓存。
先把数据放入内存预热,然后在逐步动态更新。先读取缓存,如果缓存里没有对应的数据,再云读取数据库,然后把读到的数据放入缓存。如果数据库里的数据更新,需要同时触发缓存更新,防止给用户过期的数据,当然,对于这种百万级别并发还有很多其它要做的。
***
作为集群节点的session会话共享存储
即把客户端用户请求多个前端应用服务集群产生的session会话信息,统一存储到一个Memcached缓存中。
由于session会话数据是存储在内存中的,所以很快。
3.特性
协议简单
基于文本行的协议,可通过telnet/nc等命令直接操作memcached服务存取数据。
支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制
简而言之,libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。memcached就是利用这个libevent库进行异步事件处理。
key/value键值数据类型
被缓存的数据以key/value键值形式存在的,例如:
oldboy—>36,key=oldboy,value=36
oldgirl—>28,key=oldgirl,value=28
通过oldboy key可以获取到36值,同理通过oldgirl key可以获取28值。全内存缓存,效率高
memcached管理内存的方式非常高效,即全部的数据都存放于memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或memcached服务时,memcached内存中的数据机会丢失。
如希望重启后,数据依然能保留,可采用redis——持久性内存缓存系统
当内存中缓存的数据容量达到服务启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。也可以存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。
- 可支持分布式集群
memcached没有像MySQL那样的主从复制方式,分布式memcached集群的不同服务器之间是互不通信的,每一个节点都是独立存取数据,并且数据内容也应该是不一样的。通过对Web应用端的程序设计或者通过支持hash算法的负载均衡换件,可以让memcached支持大规模海量分布式缓存集群应用。