主要内容:

  Memcached基本的工作原理

  Memcached的两阶段哈希

  Memcached的数据存储方式

  Memcached新建Item分配内存过程

  Memcached的数据过期方式

  Memcached与Spring集成

------------------------------------------------------------------------------------------

Memcached基本的工作原理

  Memcached是以守候程序的方式运行于一个或者多个服务器中,随时等待客户端的链接请求,通过启动Memcached服务端,配置相应的监听IP、端口等参数,客户端可通过指定的服务器IP 将数据以key-value的方式存储到Memcached实例中。

  如下图所示,有N个Memcached实例部署在一台专门的机器上,应用程序在查询数据时首先去Memcached里面查询,如果有数据则直接返回客户端使用,如果Memcached里面没有需要的数据或者数据过期了,则应用程序先去查询数据库,然后把查询的结果放到Memcached实例里面去,最后返回给客户端。

Memcached的两阶段哈希

  第一阶段哈希是计算"key-value"存储在哪个Memcached实例上,第二阶段哈希是计算"key-value"是存储存储在Memcached实例的哪个chunk里面。

  客户端存取数据时,首先参考Memcached实例列表计算出key的哈希值(阶段一哈希),进而选中一个Memcached实例;客户端将请求发送给选中的Memcached实例节点,然后该Memcached节点通过内部的哈希算法(阶段二哈希) 进行真正的数据(Item)存取。 Memcached的服务器和客户端通信并不使用复杂的XML等格式,而是使用简单的基于文本行的协议。

  如下图所示:
    比如我们要在Memcached上存储 key为"Hello",value为"World" 的这么一个键值对。
    阶段一哈希: 首先在客户端根据key计算出该"键值对"会存储在哪个Memcached实例中,假如是m2
    阶段二哈希: 在Memcached实例二中 再次根据key计算出该"键值对"在m2实例中存在的位置。

Memcached的数据存储方式

  Memcached的数据存储方式被称为Slab Allocator,其基本方式是:

  (a)先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片问题。

    分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。

    (如下图:在Memcached实例中先把内存分了n个slab,然后每个slab里面分了n个page)

  (b)然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk的大小是先有一个基本值,然后根据增长因子来增大。
Slab Allocation的原理——将分配的内存分割成各种尺寸的块(chunk), 并把尺寸相同的块分成组(chunk的集合),每个chunk集合被称为slab。
  (借用网上一张图来说明:)

  (c)slab class:内存区类别(48byte-1M),每个类别有一个slab classId

(d)Memcached里面保存着slab内存空间的chunk列表,当收到要保存的item时,它会根据item的大小去选择一个最适合的slab,然后找到空闲的chunk,把数据存放进去。

Memcached新建Item分配内存过程

  第一步: 快速定位slab classid,先计算Item长度
    key键长+flag+suffix(16字节)+value值长+结构大小(32字节),比如计算出来有90byte
    如果Item长度计算出来>1M,则无法存储丢弃
    取最小冗余的slab class进行存储,比如有:48、96、120, 存储90就会选96
  第二步:按顺序寻找可用的chunk
    (a) slot : 检查slab回收空间slot里是否有剩余chunk
      delete: delete时标记到slot
      exptime: get时检查的过期对象标记到slot
    (b)end_page_ptr: 检查page中是否有剩余chunk
    (c)memory: 内存还有剩余空间可以用于开辟新的slab
    (d)LRU
  (PS:Memcached的数据存储方式的缺点,由于chunk的大小是预先分配好的特定长度,因此如果数据不能完全填满chunk,那么chunk中剩余的空间就浪费了。)

Memcached的数据过期方式
  (1)Lazy Expiration(延迟/惰性 过期)
    Memcached不会监控记录是否过期,而是当客户端来获取数据的时候,才会检查记录的时间戳,因此成为Lazy Expiration
  (2)LRU(Least Recently Used 最近最少使用)
    当空间不足的时候,Memcached会优先使用已经过期的数据空间,如果还不够的话,那么就会把最近最少使用的对象的空间释放出来。
    (ps:要特别注意,Memcached的LRU不是全局的,而是针对slab的,可以说是区域性的)
  (3)惰性删除机制
    删除item对象时,不释放内存,作删除标记,指针放入slot回收插槽,下次分配的时候直接使用。

Memcached与Spring集成

(1)先把jar包添加到本地仓库中:

  mvn install:install-file -Dfile=java_memcached-release_2.6.6.jar -DgroupId=com.danga -DartifactId=memcached -Dversion=2.6.6 -Dpackaging=jar -DgeneratePom=true

  (ps:注意 -Dfile=java_memcached-release_2.6.6.jar  一定要输入jar包的全路径名 )

(2)在pom中添加memcached的lib依赖和common-pool的lib依赖:

         <dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>com.danga</groupId>
<artifactId>memcached</artifactId>
<version>2.6.6</version>
</dependency>

(3)在spring的applicationContext.xml文件中加入memcached的配置

 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance"
init-method="initialize" destroy-method="shutDown">
<constructor-arg>
<value>neeaMemcachedPool</value>
</constructor-arg>
<property name="servers">
<list>
<value>192.168.1.81:3333</value>
</list>
</property>
<property name="weights">
<list>
<value>1</value>
</list>
</property>
<property name="initConn">
<value>5</value>
</property>
<property name="minConn">
<value>5</value>
</property>
<property name="maxConn">
<value>5</value>
</property>
<property name="maintSleep">
<value>30</value>
</property>
<property name="nagle">
<value>false</value>
</property>
<property name="maxIdle">
<value>6000</value>
</property>
<property name="socketTO">
<value>3000</value>
</property>
</bean> <bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">
<constructor-arg>
<value>neeaMemcachedPool</value>
</constructor-arg>
</bean>

在程序中就可以通过 MemCachedClient的get、set方法来往Memcached里面获取和设置item了

  

Memcached基础知识的更多相关文章

  1. 【 学习笔记 】memcached基础知识

    源地址:http://kb.cnblogs.com/page/42731/ 仔细学习了下,以下是记录的笔记备忘内容. 一.memcached是什么?    memcached是高性能的分布式内存缓存服 ...

  2. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  3. IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token

    本文引用了简书作者“骑小猪看流星”技术文章“Cookie.Session.Token那点事儿”的部分内容,感谢原作者. 1.前言 众所周之,IM是个典型的快速数据流交换系统,当今主流IM系统(尤其移动 ...

  4. 死磕面试 - Dubbo基础知识37问(必须掌握)

    作为一个JAVA工程师,出去项目拿20k薪资以上,dubbo绝对是面试必问的,即使你对dubbo在项目架构上的作用不了解,但dubbo的基础知识也必须掌握. 整理分享一些面试中常会被问到的dubbo基 ...

  5. MySQL 基础知识梳理

    MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...

  6. redis基础知识详解

    一.redis基础知识 1.Redis是什么Redis是一个开源的key-value存储系统. 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  7. 老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化

    引言 今天周末,我在家坐着掐指一算,马上又要到一年一度的金九银十招聘季了,国内今年上半年受到 YQ 冲击,金三银四泡汤了,这就直接导致很多今年毕业的同学会和明年毕业的同学一起参加今年下半年的秋招,这个 ...

  8. Elasticsearch基础知识学习

    概要 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Ap ...

  9. .NET面试题系列[1] - .NET框架基础知识(1)

    很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...

随机推荐

  1. (转) Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么?

    Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么? 建站有很多技术,如 HTML.HTML5.XHT ...

  2. 【BZOJ-1692&1640】队列变换 后缀数组 + 贪心

    1692: [Usaco2007 Dec]队列变换 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1153  Solved: 482[Submit][St ...

  3. BZOJ1024 [SCOI2009]生日快乐

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  4. Linux.BackDoor.Chikdos/Elknot Attack And Defense Analysis

    catalogue . 恶意程序概述 . 模块分解 . 通信协议 . 木马清理 1. 恶意程序概述 Trojan.Chikdos.A是一个木马,它允许远程攻击者利用受感染计算机发动DDoS攻击 . 木 ...

  5. Scala implicit

    Scala implicit implicit基本含义 在Scala中有一个关键字是implicit, 之前一直不知道这个货是干什么的,今天整理了一下. 我们先来看一个例子: def display( ...

  6. UVa 11889 Benefit(数论)

    题目链接: 传送门 Benefit Time Limit: 5000MS     Memory Limit: 32768 KB Description Recently Yaghoub is play ...

  7. POJ 1064 Cable master (二分)

    题目链接: 传送门 Cable master Time Limit: 1000MS     Memory Limit: 65536K 题目描述 有N条绳子,它们长度分别为Li.如果从它们中切割出K条长 ...

  8. C# 开源项目一

    商业协作和项目管理平台-TeamLab 网络视频会议软件-VMukti 驰骋工作流程引擎-ccflow [免费]正则表达式测试工具-Regex-Tester Windows-Phone-7-SDK E ...

  9. Mysql学习笔记(二)对表结构的增删改查

    有将近一个星期都没有更新mysql了.相反linux的东西倒是学习不少.可能我个人情感上对linux更感兴趣一点.但mysql我也不烦,只是一旦将精力投入到了一样事情上去,就很难将精力分散去搞其他的东 ...

  10. UVA11178 Morley's Theorem(基础模板)

    题目链接 题意:给出A,B, C点坐标求D,E,F坐标,其中每个角都被均等分成三份   求出 ABC的角a, 由 BC 逆时针旋转 a/3 得到BD,然后 求出 ACB 的角a2, 然后 由 BC顺时 ...