【转】对memcached使用的总结和使用场景
原文连接: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的代码中,下面写一段伪代码:
- String key = "taobao"+"cat"+catAll
- Object o = getKey(key);
- if(o==null){
- //查询你的数据库操作
- cat c = catService.findAll();
- setKey(key,c);//set到memcached中
- return c;//返回结果
- }else{
- return (Cat)c;//返回结果
- }
但是是嵌入到你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使用的总结和使用场景的更多相关文章
- Memcached和Redis对比和适用场景
关于memcached和redis的使用场景,根据大神们的讨论和我在网上查到的资料,总结一下: 两者对比: redis提供数据持久化功能,memcached无持久化: redis的数据结构比memca ...
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发 ...
- 对Memcached使用的总结和使用场景
1.memcached是什么 Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践.这包括应该存储或不应存储哪些.如何处理数据的灵活分布以 及如 ...
- nosql数据库:mongodb,redis,memcached,其优缺点和使用应用场景
1.mongodb (1)是文档型的非关系型数据库,使用bson结构.其优势在于查询功能比较强大,能存储海量数据,缺点是比较消耗内存. (2)一般可以用来存放评论等半结构化数据,支持二级索引. 适合存 ...
- Memcached和Redis比较
一.存储 Memcached基本只支持简单的key-value存储方式.Redis除key-value之外,还支持list,set,sorted set,hash等数据结构:Redis支持数据的备份, ...
- Memcached服务介绍及安装指南
一.memcached服务介绍 1.为什么需要memcached服务 A:第一种场景 网站访问大多数情况下都需要查询数据库操作,如果网站的流量很大并且大多数的访问会造成数据库高负荷的状况下,由于大部分 ...
- memcached的最佳实践方案(转)
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- memcached的最佳实践方案
基本问题 1.memcached的基本设置 1)启动Memcache的服务器端 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 ...
- 服务器后端开发系列——《实战Memcached内存缓存系统》
1.实战Memcached缓存系统(1)Memcached基础及示例程序 内容:建筑Memcached背景知识和入门示例程序. 2.实战Memcached缓存系统(2)Memcached Java A ...
随机推荐
- meta property=og标签含义及作用
不理解Meta Property=og标签是什么意思,以及对SEO的影响,看一下下面的介绍.Meta Property=og标签是什么呢?og是一种新的HTTP头部标记,即Open Graph Pro ...
- linq学习三个实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JS window对象的top、parent、opener含义
.top 该变更永远指分割窗口最高层次的浏览器窗口.如果计划从分割窗口的最高层次开始执行命令,就可以用top变量. .opener opener用于在window.open的页面引用执行该window ...
- 手把手教你清除WIN7的C盘垃圾
WIN7系统用着用着C盘会变得越来越大,可用空间变得越来越小,磁盘清理,和安全卫士怎么清也清不出这些系统深度的垃圾.我们可以手动删除,释放C盘空间. 这样一清理下来,结果我的C盘就释放了近10个GB的 ...
- Codeforces 571B Minimization
http://codeforces.com/problemset/problem/571/B 给出一个序列,可以任意调整序列的顺序,使得给出的式子的值最小 思路:我们可以把序列分解,变成k条链,n%k ...
- Mysql 插入记录时检查记录是否已经存在,存在则更新,不存在则插入记录SQL
我们在开发数据库相关的逻辑过程中, 经常检查表中是否已经存在这样的一条记录, 如果存在则更新或者不做操作, 如果没有存在记录,则需要插入一条新的记录. 这样的逻辑固然可以通过两条sql语句完成. SE ...
- Linux上ld和ld.so命令的区别
显然,ld链接器,它的生命周期是发生在compile-time的,它的一些参数是编译时期gcc给传递的,比如,指定需要链接什么库. ld.so命令的周期是发生在run-time的,名字叫动态链接器/加 ...
- shell操作mysql
参考: http://blog.csdn.net/hbcui1984/article/details/5125387
- java设计模式--行为型模式--策略模式
策略模式: 策略模式 概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性 1.许多相关的类仅仅是行为有异.“策略”提供了一种用多个行 ...
- js深入研究之类定义与使用
js可以定义自己的类 很有意思 <script type="text/javascript"> var Anim = function() { alert('nihao ...