`
zhangjunbao
  • 浏览: 91818 次
  • 性别: Icon_minigender_1
  • 来自: 核桃博客
社区版块
存档分类
最新评论

缓存学习-memcached基本概念

阅读更多

http://www.hetaoblog.com/%E7%BC%93%E5%AD%98%E5%AD%A6%E4%B9%A0-memcached%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/

 

缓存新手,写错了请指出,谢谢

 

以前的项目里的缓存都是自己实现的简易版,下午学习下流行的缓存,先来到大名鼎鼎的memcached,当前版本是1.4.5,

http://memcached.org/,http://code.google.com/p/memcached/wiki/

memcached是一个开源、高性能、分布式缓存系统,主要特性如下:

1. 使用简单的key-value存储,适用于存储各种格式的小数据,比如数据库查询结果、api调用结果、页面展示结果;

2. memcached有服务端和客户端,有一些api通过网络交互,

(看到这里,我觉得暂时我是用不上了,就一台机器的话还是直接在JVM内存里面搞cache好了,没必要非要通过网络操作下,那样肯定会更慢;)

基本的api包括set/add/replace/get/gets/delete/append/prepend/cas/incr/decr/stats/flush_all和一些其他统计api

3. memcached所有操作都在内存中进行,所有操作都保证是o(1)的常数时间,所以速度比较快;

4. memcached在server之间没有任何通信和同步机制,那猜想应该数据没有重复(冗余),如果一个节点挂了的话肯定这部分数据就没有了,相当于缓存不命中,这符合KISS原则;

5 服务端的内容是key,过期时间,一些可选的flag和原始数据(raw data),数据需要先序列化(这个地方需要注意下,java默认的序列化性能不太好,最好是直接存string,真的需要对象的时候可以考虑用其他序列 化方式,比如我看到有人用hessian做序列化)

6. 缓存剔除策略基本是超时设置+LRU算法,当然你也可以手动去删除,当然一般说来如果数据变化的时候,应该更新下cache

7. key最大250个字符,item最大1MB,当然key/item最好都别太大,最长过期时间是30天

8. 最开始是文本协议,从1.3开始支持二进制协议,这样可以减少更少的cpu消耗

9.既不做身份验证、也不做失效处理(fail over,就是一台挂了可以自动切换到另外一台继续提供原有的服务,对于cache来说这个非常难做,必须有事先的冗余和同步机制才可以这么搞,否则挂了肯定挂了)、也不做节点同步(这里说的第4点), 再KISS下

10. hash有两步,第一对客户端来说知道把某个key唯一的映射到n台cache服务器的某一台,第二对服务器来说就是在内存里面把key放到一个hashmap里面

客户端hash的关键是一致性hash,一致性的意思是多台节点的增加和删除不影响原有节点的hash结果,

具体点,具个非一致性hash的意思,如果简单的时候hashcode()%N的算法,那么N变化(服务器的增加或减少,比如一个节点挂掉),那么 原来所有的hash结果都失效了,一个key过来算出来的服务器是不对的,上面根本不包含之前存进去的东西,相当于要全部重新hash过,这样显然是不行 的;

memcache实现了一致性hash,基本原理是将key算出hashcode后,也将服务节点也算出一个hashcode(), 然后把这两个hash值放到一个2^32的环上,

11. 内存方面使用了slab分配代替malloc/free以提高性能,更好的匹配key/value,并且value是小对象的场景

12. 单个api是原子的

13. 由于设计简单后(比如不做冗余,不做服务器节点间通信后),再加上良好的一致性hash,memcached作为分布式缓存最大的优点是,几乎可以无限水平扩展,不够了就加节点,并且节点的增加几乎不会增加任何复杂性和额外的开销

14. memcached的java客户端有xmemcached, spymemcached等

15. 网络部分基于libevent, 也就是非阻塞的事件处理,连接增加也能发挥O(1)的性能,解决c10k问题;

16, 当前版本已经支持多线程,可以更好的利用多cpu的硬件

17. memcached不推荐用来存放session相关的数据,因为,如果一个节点挂掉了,那么这个节点上的所有session信息都没有了,

这对于用户的体验是有问题的,比如你在某网站买东西,找了半天之后突然购物车里面的东西都没了,那肯定是不行的;

网上看到有人搞了个memcached-session-manager , 在tomcat里面仍然保存默认的session,然后在放一份到memcached,实现tomcat的fail over,同时,同时他又实现了memcached的fail over,如果一个memcached节点不available,那么就生成一个新的sessionid,同时把session信息从tomcat复制到 其他memcached节点

分享到:
评论
1 楼 azheng270 2011-06-04  
呵呵,总结的很好,一起学习

相关推荐

Global site tag (gtag.js) - Google Analytics