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

1、memcached是什么

Memcached 常被用来加速应用程序的处理,在这里,我们将着重于介绍将它部署于应用程序和环境中的最佳实践。这包含应该存储或不应存储哪些、怎样处理数据的灵活分布以 及怎样调节用来更新 memcached 和所存储数据的方法。

全部的应用程序,特别是非常多 web 应用程序都须要优化它们訪问客户机和将信息返回至客户机的速度。

但是,通常,返回的都是同样的信息。从数据源(数据库或文件系统)载入数据十分低效,若是每次想要訪问该信息时都执行同样的查询,就尤显低效。要是能从内存中直接载入这些信息。可想而知速度会快多少倍。


尽管非常多 web server都可被配置成使用缓存发回信息,但那与大多数应用程序的动态特性无法相适。而这正是 memcached 的用武之地。它提供了一个通用的内存存储器,可保存不论什么东西,包含本地语言的对象,这就让您能够存储各种各样的信息并能够从诸多的应用程序和环境訪问这些 信息。


memcached存储的是key/value的键值对。可是值必须是可序列化的对象(这里我说的java),还能够是json,xml,html等。这里要说明memcached集群,server端之间并不会进行相互的通信,通信全然由你的client来完毕,你仅仅需在client规定好你的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语句要是非常长得话。也是会占用一部分内存的。

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

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

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

这里要说明的一点就是缓存不是你信息的唯一来源。你不能把memcached当做你的数据库来使用,他不过一个缓存,一旦宕掉。信息全无,非常是可怕。

此时你必须保证能从别的地方载入到你数据(如你的mysql数据库),有人可能会想到。我能够使用多台server,相互复制彼此的信息,一台宕掉 ,其它的还能够接着使用,我认为这种想法是非常糟糕的,如果你使用了三台server 都是1g的内存,你们把信息拷贝到这三台上,可是你细致想想。实际上你只拥有1g的内存可用。而你却浪费了2台server ,这似乎代价非常大。

此时你能够这样解决 。还是有3台server 。可是这三台server不会拥有相同的信息 ,也就是不会复制信息到对方的server上去。当中一台宕掉的时候。当你在次载入信息的时候,会从数据库查询,而这个信息会存储在其它两台中的随意一台server上,这样使用的优点为:相同式三台server,可是你却不像第一种那样,仅仅拥有1g的可用内存,你如今而是3g可用,何乐而不为呢大笑,仅仅是宕掉的时候多查一次库而已,后面还是会从缓存中获取。

5、总结

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

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

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

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

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

原文地址:https://www.cnblogs.com/bhlsheji/p/5153700.html