文章目录
Memcached 原理及应用
Memcached是什么?有什么作用?
- Memcached是一个开源的,高性能的,具有分布式内存对象的缓存系统
- 众所周知,从内存读取数据的速度远远快于从磁盘中读取,而数据库的数据是存放在磁盘中的,因此Memcached通过在事先规划好的内存空间中临时缓存数据库中的各类数据,以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能,加速网站集群动态应用服务的能力
Memcached内存管理机制原理
-
Memcached利用slab allocation机制来分配和管理内存,slab allocation机制原理是按照预先规定的大小,将分配给Memcached的内存空间分割成各种特定长度的内存块,再把长度相同的内存块分成组(chunks slab class)这些内存块不会被释放,可以重复使用
-
Memcached服务器端中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存在其中,当有数据存入时,Memcached根据收到的数据大小,选择最适合该数据大小的slab分配一个能存下这个数据的最小内存块(chunk),例如,有一个100字节的数据,根据下图中的chunk,就会被分配到112节的内存块中,这样就导致了12字节空间被浪费了,而这也是slab allocation机制的一个缺点
-
降低浪费的方法只能是预先计算出应用存入数据的常见大小,以此调整chunk的大小。或者把同一业务类型的数据存入同一个Memcached服务器中,确保存入的数据大小相对均匀。
Memcached对象删除原理与cache机制
- Memcached主要的cache机制是LRU算法(Least Recently Used 最近最少使用)加上item过期,存放数据时,Memcached可以指定该数据在缓存中的存放时间,如果Memcached的内存不够用,过期的slab会优先被替换,接着轮到最近最少使用的slab。
- 若不想使用LRU算法,则在Memcached启动时指定 -M 选项, 当内存耗尽时,则会返回一个报错信息
Memcached服务特点总结
- 各个节点之间相互独立
- C/S模式架构
- 异步IO模型,使用libevent作为事件通知机制
- 被缓存的数据以Key-Value 形式存在
- 当内存中缓存的数据容量达到启动时设定的内存值,就自动使用LRU算法删除最少使用的缓存数据
- 可以对存储的数据设置过期时间,这样过期后数据会被清除,服务本身不会监控过期,而是在访问的时候查看key的时间戳判断是否过期
- memcached内存分配机制是对特定的内存进行分块,再把多个相同大小的块分为一组
Memcached服务在应用场景的工作流程
- 当应用程序服务器(一般是WEB服务器)需要访问后端数据库获取数据时,会先访问Memcached的内存缓存,如果缓存中有指定数据就直接获取然后返回给应用程序服务器,应用服务器再返回给用户,如果没有指定数据,即没有命中,再由Memcache客户端请求后端数据库服务器,获取到相应的数据后,缓存到Memcached的内存以备下次请求,并返回给应用服务器,再有应用服务器返回给用户。Memcached就相当于是数据库的挡箭牌,大大减少了数据库的访问压力,提高了整个网站架构的响应速度,提升了用户体验
- 当程序更新时,修改或删除数据库已有数据时,会同时发送请求通知Memcached已经缓存的旧数据已经失效,从而保证Memcached的数据和数据库中的一致
- 如果是高并发场合,除了通知Memcached过期的缓存失效外,还会通知相关机制,使得用户访问新数据前,通过程序预先把更新过的数据推送到Memcached中缓存起来,这样可以减少数据库的访问压力,提升Memcached缓存的命中率
- 数据库插件可以在写入更新数据库后,自动抛给Memcached缓存起来
Memcached 服务在企业集群架构中的应用场景
-
作为数据库的前端缓存应用
- 完整缓存:先全部缓存起来,再对外提供数据,称为预热,用户访问时就可以直接读取Memcached,而不用再访问数据库l
- 热点缓存:需前端Web程序配合,只缓存热点的数据,即缓存经常被访问的数据(先预热基础数据,再动态更新,非热门数据收到请求后再读取数据库缓存)
- 如果是高并发的业务,一定要事先预热,如果数据更新,同时应该触发缓存更新,防止给用户过期数据
-
作为集群的session会话共享存储
- 例如用php实现,则修改php.ini
save_handler = memcache
save_path = "tcp://192.168.139.103:11211"
Memcached服务分布式集群实现
- Memcached是C/S架构的,当数据到达到达客户端,客户端的实现算法会根据 Key 来决定保存到哪一台Memcached服务器,保存和取出时的算法一致就能保证选中的服务器相同,从而提高缓存的命中率
- 最常用的是一致性hash算法,一致性哈希算法的原理是计算出服务器节点的哈希值,并将其分配到 0~2^32 的圆上,然后用同样的方法求出存储数据的Key的哈希值,并映射到圆上,然后从数据映射的位置开始顺时针查找,并将数据存放到找到的第一个服务器上
- 一致性哈希算法在服务节点太少时,容易因为节点分部不均匀而造成数据倾斜问题,为了解决这种数据倾斜问题,一致性哈希算法引入了虚拟节点机制,即对每一个服务节点计算多个哈希,每个计算结果位置都放置一个此服务节点,称为虚拟节点。具体做法可以在服务器ip或主机名的后面增加编号来实现.