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节点
分享到:
相关推荐
安装php-memcached扩展 https://github.com/php-memcached-dev/php-memcached tar -zxvf ...-disable-memcached-sasl && make && make install
python-memcached python-memcached
java-memcached-2.6.6.jar
这个包是最高版本了,google code是1.22,但是这个版本是基础班的1.5版本.是github上源代码经过我打包出来的jar
ssm3-mybatis2-memcached 使用了 simple-spring-memcached 。因为 mybatis-memcached 不支持 MyBatis2(iBatis),只能用在 MyBatis3 里。但是因为有的项目还跑在 MyBatis2 版本上,所以也做一个例子。 mm-mybatis3-...
在JAVA中使用Memcached进行行缓存是比较复杂的。Simple-Spring-Memcachd(SSM)企图通过实现几个基础的使用项来简化Memcached的使用。 该项在java-memcached客户端的基础上使用java5的注解和Sping/AspectJ的AOP,使...
cas-client-support-distributed-memcached-3.2.0.jar
hibernate-memcached, 在Hibernate中,使用Memcached作为第二级分布式缓存的库 休眠 memcachedHibernate中使用Memcached作为第二级分布式缓存的库。基于优秀的spymemcached客户端包含对 Whalin ( danga ) memcached...
hibernate-memcached-1.1.0-sources.zip
hibernate-memcached-1.1.0.jar
用于hibernate集成memcached作为二级缓存所需要的包,1.2.2版本
python-memcached-latest.tar
Nagios-Plugins-Memcached-0.02.tar.gz
simple-spring-memcached是与mamcached与spring结合,实现注解的方式缓存。 这是java所需要的jar,版本为3.3.0
php-memcached-demo.tar.gz为memcache缓存服务器的软件包
资源分类:Python库 所属语言:Python 资源全名:python-binary-memcached-0.24.1.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
本lib包包含:javolution-5.5.1.jar、kryo-1.03.jar、kryo-serializers-0.10.jar、memcached-2.5.jar、memcached-session-manager-1.5.1.jar、memcached-session-manager-tc7-1.5.1.jar、minlog-1.2.jar、msm-...
memcached python-memcached
java - memcached所需要的jar包 A. alisoft-xplatform-asf-cache-2.5.1.jar B. commons-logging-1.0.4.jar C. hessian-3.0.1.jar D. log4j-1.2.9.jar E. stax-api-1.0.1.jar F. wstx-asl-2.0.2.jar