锁定老帖子 主题:缓存学习-memcached基本概念
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-15
缓存新手,写错了请指出,谢谢
以前的项目里的缓存都是自己实现的简易版,下午学习下流行的缓存,先来到大名鼎鼎的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节点 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-06-04
呵呵,总结的很好,一起学习
|
|
返回顶楼 | |
浏览 2529 次