1       Memcache是什么

Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。

它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。

为什么会有Memcache和memcached两种名称?

其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,

Memcache官方网站:http://www.danga.com/memcached

2       Memcache工作原理

首先 memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客户端在与 memcached 服务建立连接之后,接下来的事情就是存取对象了,每个被存取的对象都有一个唯一的标识符 key,存取操作均通过这个 key 进行,保存到 memcached 中的对象实际上是放置内存中的,并不是保存在 cache 文件中的,这也是为什么 memcached 能够如此高效快速的原因。注意,这些对象并不是持久的,服务停止之后,里边的数据就会丢失。

与许多 cache 工具类似,Memcached 的原理并不复杂。它采用了C/S的模式,在 server 端启动服务进程,在启动时可以指定监听的 ip,自己的端口号,所使用的内存大小等几个关键参数。一旦启动,服务就一直处于可用状态。Memcached 的目前版本是通过C实现,采用了单进程,单线程,异步I/O,基于事件 (event_based) 的服务方式.使用 libevent 作为事件通知实现。多个 Server 可以协同工作,但这些 Server 之间是没有任何通讯联系的,每个 Server 只是对自己的数据进行管理。Client 端通过指定 Server 端的 ip 地址(通过域名应该也可以)。需要缓存的对象或数据是以 key->value 对的形式保存在Server端。key 的值通过 hash 进行转换,根据 hash 值把 value 传递到对应的具体的某个 Server 上。当需要获取对象数据时,也根据 key 进行。首先对 key 进行 hash,通过获得的值可以确定它被保存在了哪台 Server 上,然后再向该 Server 发出请求。Client 端只需要知道保存 hash(key) 的值在哪台服务器上就可以了。

其实说到底,memcache 的工作就是在专门的机器的内存里维护一张巨大的 hash 表,来存储经常被读写的一些数组与文件,从而极大的提高网站的运行效率。

3       如何使用

  • 建立Manager类

Java代码 
  1. package com.alisoft.sme.memcached;
  2. import java.util.Date;
  3. import com.danga.MemCached.MemCachedClient;
  4. import com.danga.MemCached.SockIOPool;
  5. public class MemCachedManager {
  6. // 创建全局的唯一实例
  7. protected static MemCachedClient mcc = new MemCachedClient();
  8. protected static MemCachedManager memCachedManager = new MemCachedManager();
  9. // 设置与缓存服务器的连接池
  10. static {
  11. // 服务器列表和其权重
  12. String[] servers = { "127.0.0.1:11211" };
  13. Integer[] weights = { 3 };
  14. // 获取socke连接池的实例对象
  15. SockIOPool pool = SockIOPool.getInstance();
  16. // 设置服务器信息
  17. pool.setServers(servers);
  18. pool.setWeights(weights);
  19. // 设置初始连接数、最小和最大连接数以及最大处理时间
  20. pool.setInitConn(5);
  21. pool.setMinConn(5);
  22. pool.setMaxConn(250);
  23. pool.setMaxIdle(1000 * 60 * 60 * 6);
  24. // 设置主线程的睡眠时间
  25. pool.setMaintSleep(30);
  26. // 设置TCP的参数,连接超时等
  27. pool.setNagle(false);
  28. pool.setSocketTO(3000);
  29. pool.setSocketConnectTO(0);
  30. // 初始化连接池
  31. pool.initialize();
  32. // 压缩设置,超过指定大小(单位为K)的数据都会被压缩
  33. mcc.setCompressEnable(true);
  34. mcc.setCompressThreshold(64 * 1024);
  35. }
  36. /**
  37. * 保护型构造方法,不允许实例化!
  38. *
  39. */
  40. protected MemCachedManager() {
  41. }
  42. /**
  43. * 获取唯一实例.
  44. *
  45. * @return
  46. */
  47. public static MemCachedManager getInstance() {
  48. return memCachedManager;
  49. }
  50. /**
  51. * 添加一个指定的值到缓存中.
  52. *
  53. * @param key
  54. * @param value
  55. * @return
  56. */
  57. public boolean add(String key, Object value) {
  58. return mcc.add(key, value);
  59. }
  60. public boolean add(String key, Object value, Date expiry) {
  61. return mcc.add(key, value, expiry);
  62. }
  63. public boolean replace(String key, Object value) {
  64. return mcc.replace(key, value);
  65. }
  66. public boolean replace(String key, Object value, Date expiry) {
  67. return mcc.replace(key, value, expiry);
  68. }
  69. /**
  70. * 根据指定的关键字获取对象.
  71. *
  72. * @param key
  73. * @return
  74. */
  75. public Object get(String key) {
  76. return mcc.get(key);
  77. }
  78. public static void main(String[] args) {
  79. MemCachedManager cache = MemCachedManager.getInstance();
  80. cache.add("hello", 234);
  81. System.out.print("get value : " + cache.get("hello"));
  82. }
  83. }

建立数据对象

Java代码 
  1. package com.alisoft.sme.memcached;
  2. import java.io.Serializable;
  3. public class TBean implements Serializable {
  4. private static final long serialVersionUID = 1945562032261336919L;
  5. private String name;
  6. public String getName() {
  7. return name;
  8. }
  9. public void setName(String name) {
  10. this.name = name;
  11. }
  12. }
Java代码 
  1. <pre name="code" class="java"> </pre>
  2. <h2 style="margin: 13pt 0cm 13pt 28.8pt;"><span style="" lang="EN-US"><span style=""><span style="font-family: 'Times New Roman';">   </span></span></span><span style=""><span style="font-size: large;">创建测试用例</span></span></h2>
  3. <h2 style="margin: 13pt 0cm 13pt 28.8pt;"> </h2>
  4. <pre name="code" class="java">package com.alisoft.sme.memcached.test;
  5. import junit.framework.TestCase;
  6. import org.junit.Test;
  7. import com.alisoft.sme.memcached.MemCachedManager;
  8. import com.alisoft.sme.memcached.TBean;
  9. public class TestMemcached extends TestCase {
  10. private static MemCachedManager cache;
  11. @Test
  12. public void testCache() {
  13. TBean tb = new TBean();
  14. tb.setName("E网打进");
  15. cache.add("bean", tb);
  16. TBean tb1 = (TBean) cache.get("bean");
  17. System.out.println("name=" + tb1.getName());
  18. tb1.setName("E网打进_修改的");
  19. tb1 = (TBean) cache.get("bean");
  20. System.out.println("name=" + tb1.getName());
  21. }
  22. @Override
  23. protected void setUp() throws Exception {
  24. super.setUp();
  25. cache = MemCachedManager.getInstance();
  26. }
  27. @Override
  28. protected void tearDown() throws Exception {
  29. super.tearDown();
  30. cache = null;
  31. }
  32. }
  33. </pre>
  34. <h2 style="margin: 13pt 0cm 13pt 28.8pt;"> <span style="">测试结果</span></h2>
  35. <h2 style="margin: 13pt 0cm 13pt 28.8pt;"><span style="">
  36. <pre name="code" class="java">[INFO] ++++ serializing for key: bean for class: com.alisoft.sme.memcached.TBean
  37. [INFO] ++++ memcache cmd (result code): add bean 8 0 93 (NOT_STORED)
  38. [INFO] ++++ data not stored in cache for key: bean
  39. [INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
  40. name=E网打进
  41. [INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
  42. name=E网打进
  43. </pre>
  44. </span></h2>
posted on 2009-05-07 13:51 Blog of JoJo 阅读(9728) 评论(1)  编辑  收藏 所属分类: Linux 技术相关

FeedBack:

 
# re: Memcache工作原理
2009-05-07 13:54 | Blog of JoJo

memcache是一个高性能的分布式的内存对象缓存系统,可以用来构建大负载的网站,来分担数据库的压力。在这里我们要非常注意三点:

* 分布式:具我目前了解,memcache作为分布式缓存系统的一种方法是首先启动多个memcache进程,这些进程可以在不同的主机的不同端口上。memcache的分布式方法可以在N个前端主机上跑memcache进程,可以应付足够大的缓存数据,提高了访问获取数据的速度。
* 内存对象:memcache的工作机制是通过在内存里维护一个统一的巨大的hash表,用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等
* 缓存:一个好多缓存机制,可以给一个程序带来意想不到的性能提高,这个就不用多说了。

memcache的优点:一般情况下,缓存系统,我们最注重的性能,不然我们用它来做啥呢?然后就是在管理维护方面,因为是要人来操作的,所以需要它能够稳定的运行以及不能让人发狂的配置。

memocache工作原理的更多相关文章

  1. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  2. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  3. HashMap的工作原理

    HashMap的工作原理   HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间 ...

  4. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  5. ThreadLocal 工作原理、部分源码分析

    1.大概去哪里看 ThreadLocal 其根本实现方法,是在Thread里面,有一个ThreadLocal.ThreadLocalMap属性 ThreadLocal.ThreadLocalMap t ...

  6. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  7. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  8. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  9. 浏览器内部工作原理--作者:Tali Garsiel

    本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...

随机推荐

  1. Mysql group by语句的优化

    默认情况下,MySQL排序所有GROUP BY col1, col2, ....,查询的方法如同在查询中指定ORDER BY  col1, col2, ....如果显式包括一个包含相同的列的ORDER ...

  2. 网站开发进阶(三十八)Web前端开发规范文档你需要知道的事

    Web前端开发规范文档你需要知道的事 规范目的 为提高团队协作效率, 便于后台人员添加功能及前端后期优化维护, 输出高质量的文档, 特制订此文档. 本规范文档一经确认, 前端开发人员必须按本文档规范进 ...

  3. HTTP请求方法

    HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:OPTIONS, ...

  4. UNIX环境高级编程——system函数

    system函数 功能:调用fork产生子进程,由子进程来调用:/bin/sh -c command来执行参数command所代表的命令,阻塞当前进程直到command命 令执行完毕. int sys ...

  5. zookeeper学习总结

    最近一两天,一直在看zookeeper,自己也感觉头昏脑涨的. 现记录一下,最近的所得: 安装与配置: http://blog.csdn.net/morning99/article/details/4 ...

  6. Java中函数的递归调用

    说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的. public class HelloWorld { public static void ...

  7. MongoDB分组

    MongoDB三种分组方式 group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) [简单分组实测150W 12.5s] mapreduce(基于js引擎,单线程执行,效率较低,适合用做后 ...

  8. ORACLE DB TRIGGER详解

    本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...

  9. OC利用ijkplayer框架按照步骤集成实现电视直播

    一. 下载ijkplayer ijkplayer下载地址:https://github.com/Bilibili/ijkplayer 下载完成后解压, 解压后文件夹内部目录如下图: ijkplayer ...

  10. 【翻译】在Sencha Touch中创建离线/在线代理

    原文:Creating an Online/Offline proxy in Sencha Touch 概述 在Sencha Touch中,一个常见的需求就是,当设备在没有连接互联网的时候,应用程序必 ...