Memcached之服务器端

Cache

缓存是架构之利器,在高并发的互联网中,是杀手锏的武器。我们会通过一些列的文章来介绍缓存相关的工具(包括memcached, redis), 缓存的架构设计以及缓存的相关实践。本文作为第一篇,和大家一起讨论Memcached之服务器端。

简介

Memcached是一款开源、高性能的分布式且基于key/value的内存缓存系统。它看起来非常简单,快速的部署、简单易用,但是却在互联网的大厂充频繁使用,比如:twitter, facebook, 微博,大众点评等。

组成

  • 服务端 保存数据在内部的hash table里面
  • LRU 决定清楚旧的数据或者重用merory
  • 客户端 保存有效的服务器列表,实现路由算法来选择服务器

设计理念

  • 简单K/V存储 存储的数据结构是预先序列化好的,服务器端不需要知道你的数据结构。它组成为:key, value, 失效时间,optional flags.
  • 逻辑一半在服务器端,一半在客户端。服务器端保存和获取数据,删除数据或者重用内存。客户端维护可用的服务列表,觉得路由选择。
  • 服务器之间互相不通信。每个服务器之间都是孤岛,不通信,不广播。
  • 客户端 保存有效的服务器列表,实现路由算法来选择服务器
  • O(1) 快速的操作速度,每秒近百万的吞吐量。
  • LRU失效,失效的空间将被重新使用。

内存存储

使用Slab allocation机制分配和管理内存。它的原理是:预先按照规定的大小,将内存划分为不同的块 (chunk), 并把大小相同的块分成组(Slab, collection of chunks)。失效的块不会释放到内存中,而是重复利用。

  • Page: 分配给Slab的空间,默认为1M
  • Chunk: 用于存放缓存的空间
  • Slab: 特定大小的Chunk集合
    所以它内部可以成Slab集合 Slab1 [chunk1, chunk2, chunk3 …], Slab2 [chunkx1, chunkx2, chunkx3…]。Memcached根据收到的数据大小,选择合适的Slab,让后将数据放到chunk中。
    注意:Memcached中的chunk大小是预先设定了的,比如Chunk设置为88K, 但是存放的数据为66K,则存在22K的剩余,这部分就浪费掉了。但是相对传统内存的malloc和free, 则煎炒了系统的内存碎片,降低了操作系统管理内存的负担。
    原文作者:落日无风
    原文地址: https://www.jianshu.com/p/48ba3d057dbe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞