原文连接:http://blog.csdn.net/ajun_studio/article/details/6745791#

原文作者:halfMe

转载注明以上信息!


1、memcached是什么

Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践。这包括应该存储或不应存储哪些、如何处理数据的灵活分布以 及如何调节用来更新 memcached 和所存储数据的方法。所有的应用程序,特别是很多 web 应用程序都需要优化它们访问客户机和将信息返回至客户机的速度。可是,通常,返回的都是相同的信息。从数据源(数据库或文件系统)加载数据十分低效,若是 每次想要访问该信息时都运行相同的查询,就尤显低效。要是能从内存中直接加载这些信息,可想而知速度会快多少倍。
虽然很多 web 服务器都可被配置成使用缓存发回信息,但那与大多数应用程序的动态特性无法相适。而这正是 memcached
的用武之地。它提供了一个通用的内存存储器,可保存任何东西,包括本地语言的对象,这就让您可以存储各种各样的信息并可以从诸多的应用程序和环境访问这些
信息。

memcached存储的是key/value的键值对,但是值必须是可序列化的对象(这里我说的java),还可以是json,xml,html
等,这里要说明memcached集群,server端之间并不会进行相互的通信,通信完全由你的客户端来完成,你只需在客户端规定好你的key值,然后
set进行,此时会有一个散列算法,来决定你key会存放在哪台server上。

最后要注意一点,memcached主要使用于存储实时性要求不是很高的信息。

2、使用memcached的场景

想象有这么一个场景,一个电子商务网站,在网站的左侧会是商品的分类,中间是商品搜索结果的列表,可以查看商品信息和商家的基本信息和相关商家的信誉度信息。

在这个场景下,因为一个商场的类别不会经常改变的。实时性不是很高,这样应该放到缓存中取的。

一般时候做法:

执行一次或者多次sql从数据库中查询全站的商品分类---->>递归形成你所需的分类tree------>>进入处理数据------->>显示到页面上。

在使用 memcached做法:

第一次显示的时候:判断memcached缓存中是否有该分类----没有----->执行一次或者多次sql从数据库中查询全站的商品分类
----->放到memcached中------->>进入处理数据------->>显示到页面

第二次显示的判断memcached缓存中是否有该分类----有--->>-从memcached中取出数据-------->>进入处理数据------->>显示到页面

当这个过程首次发生时,数据将正常地从数据库或其他数据源加载,然后再存储到 memcached 内。当下一次访问此信息时,它就会从 memcached 中取出,而不是从数据库加载,节省了时间和 CPU 循环。

但是要是数据中的数据改变怎么来更新memcached中的数据呢

过程为:更新数据库中分类的信息------->找到memcached中key值,删除------>重新插入到你的memcached中就可以了

memcached 内的存储操作是原子的,所以信息的更新不会让客户机只获得部分数据;它们获得的或者是老版本,或者是新版本。

3、在使用memcached中key的约定和命名规范

这里给大家做一下总结:

第一种:一般都是公司的项目名称+字符常量+返回PO的id(或者唯一标示都可以)

第二种:可以用spring aop来拦截你要缓存的service,通过类名+方法名+参数名,来做到key值得唯一

第三种:用你的sql语句+id(或者查询条件)

其中第一种比较灵活你可以嵌入到你service的代码中,下面写一段伪代码:

  1. String key = "taobao"+"cat"+catAll
  2. Object o = getKey(key);
  3. if(o==null){
  4. //查询你的数据库操作
  5. cat  c = catService.findAll();
  6. setKey(key,c);//set到memcached中
  7. return c;//返回结果
  8. }else{
  9. return (Cat)c;//返回结果
  10. }

但是是嵌入到你service层,就会破坏你service的业务逻辑,耦合性高,这里我们老大提出了解决方法,就是可以在你service和action中间在加一层来做缓存处理,这样似乎可以降低耦合。
第二种适用于分模块开发 ,因为调用的都是同一个类中的方法,但是拦截器也是回影响性能的,但是开发效率会提高的,还有就是不会破坏你的service的业务逻辑。

第三种 个人觉得不是很好 ,因为sql语句要是很长得话,也是会占用一部分内存的。

客户端语言包括 Java、Perl、PHP 等,都能串行化语言对象以便存储在 memcached 内,大家可以google一下他的客户端来做自己的实验。

4、怎么有规则弹性的使用memcached(多服务器使用)

提一个问题 ,当memcached的服务器宕掉怎么办呢?

这里要说明的一点就是缓存不是你信息的唯一来源,你不能把memcached当做你的数据库来使用,他仅仅是一个缓存,一旦宕掉,信息全无,很是可
怕。此时你必须保证能从别的地方加载到你数据(如你的mysql数据库),有人可能会想到,我可以使用多台server,相互复制彼此的信息,一台宕掉
,其他的还可以接着使用,我觉得这样的想法是很糟糕的,假设你使用了三台server
都是1g的内存,你们把信息复制到这三台上,但是你仔细想想,实际上你只拥有1g的内存可用,而你却浪费了2台server ,这似乎代价很大。

此时你可以这样解决 ,还是有3台server ,但是这三台server不会拥有相同的信息
,也就是不会复制信息到对方的server上去,其中一台宕掉的时候,当你在次加载信息的时候,会从数据库查询,而这个信息会存储在其他两台中的任意一台
server上,这样使用的好处为:同样式三台server,但是你却不像第一种那样,只拥有1g的可用内存,你现在而是3g可用,何乐而不为呢,只是宕掉的时候多查一次库而已,后面还是会从缓存中获取。

5、总结

到这里我想你对memcached也有了些了解,

记住memcached不是一个数据库,他只是内存,

不是信息的唯一来源,来辅助数据库操作的,来提升信息的查询速度。

在开发中怎么样规定key,这点很重要,方便以后进行维护。

以及多台server的使用中怎么才能更有效的利用你的RAM

【转】对memcached使用的总结和使用场景的更多相关文章

  1. Memcached和Redis对比和适用场景

    关于memcached和redis的使用场景,根据大神们的讨论和我在网上查到的资料,总结一下: 两者对比: redis提供数据持久化功能,memcached无持久化: redis的数据结构比memca ...

  2. 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景

    一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...

  3. 对Memcached使用的总结和使用场景

    1.memcached是什么 Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践.这包括应该存储或不应存储哪些.如何处理数据的灵活分布以 及如 ...

  4. nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景

    1.mongodb (1)是文档型的非关系型数据库,使用bson结构.其优势在于查询功能比较强大,能存储海量数据,缺点是比较消耗内存. (2)一般可以用来存放评论等半结构化数据,支持二级索引. 适合存 ...

  5. Memcached和Redis比较

    一.存储 Memcached基本只支持简单的key-value存储方式.Redis除key-value之外,还支持list,set,sorted set,hash等数据结构:Redis支持数据的备份, ...

  6. Memcached服务介绍及安装指南

    一.memcached服务介绍 1.为什么需要memcached服务 A:第一种场景 网站访问大多数情况下都需要查询数据库操作,如果网站的流量很大并且大多数的访问会造成数据库高负荷的状况下,由于大部分 ...

  7. memcached的最佳实践方案(转)

    基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...

  8. memcached的最佳实践方案

    基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...

  9. 服务器后端开发系列——《实战Memcached内存缓存系统》

    1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java A ...

随机推荐

  1. linux crond服务

    linux crond服务 linux crond服务简介:定时执行系统命令 查看crond服务状态:[root@www ~]# /sbin/service crond status 启动.停止.重启 ...

  2. .net 中的DllImport

    只有做成COM的C++ dll才能直接引用.没有做成COM的就只能用P/Invoke(DllImport)或者C++/CLI那种.不过P/Invoke容易类型对不上,所以要是函数多,最好用C++/CL ...

  3. 10.1.5 Connection Character Sets and Collations

    10.1.5 Connection Character Sets and Collations Several character set and collation system variables ...

  4. linux系统下svn服务器操作命令

    linux系统下svn服务器操作命令 .输出指定文件或URL的内容.  svncat 目标[@版本]…如果指定了版本,将从指定的版本开始查找. svncat -r PREV filename > ...

  5. 解决IE6 IE7 JSON.stringify JSON 未定义问题

    在项目中引入json2.js 官方http://www.json.org/ 源码地址:https://github.com/douglascrockford/JSON-js $.ajax({ url: ...

  6. 利用智能手机(Android)追踪一块磁铁(三)

    更新磁铁追踪算法的源代码,Android Studio项目工程 github地址:https://github.com/amazingyyc/MagnetLocate 说明:将磁铁的位置信息封装成消息 ...

  7. SharePoint excel service web part 连接到 filter web part

    本文讲述SharePoint excel service web part 连接到 filter web part的一个简单应用场景. SharePoint excel service web par ...

  8. Hibernate框架增删改查测试类归为一个类

    package cn.happy.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org ...

  9. struts——文件上传

    上传文件在一个系统当中是一个很常用的功能,也是一个比较重要的功能.今天我们就一起来学习一下Struts2如何上传文件. 今天讲的上传文件的方式有三种: 1,以字节为单位传输文件: 2,Struts2封 ...

  10. drwtsn32.exe 遇到问题须要关闭。我们对此引起的不便表示抱歉

    我的机器老是这样.启动起来就有这个... 那位高手能告诉我这是怎么会事.故障的原因以及解决的办法. 最佳答案 drwtsn32.exe是windows的一项磁盘检查程序,同一时候也是鸡肋程序,最好的办 ...