• 1. memcached 简介及应用说明mengxl 2011-08-09
  • 2. memcached是什么? 谁在用memcached? memcached的特征介绍 memcached示例说明 memcached的优化点 主要内容
  • 3. Memcached是什么? memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。 memcache是一个自由和开放源代码、高性能、分布式的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。
  • 4. 谁在用Memcached? 国外 国内
  • 5. 适合什么场合使用 需要分布式部署的 需要频繁访问相同数据的 需要数据共享的 如实现SSO系统的状态存储
  • 6. Memcached特征 基于C/S架构,协议简单 基于libevent的事件处理 内置内存存储方式 基于客户端的memcached分布式
  • 7. 基于C/S架构,协议简单 服务端启动memcached进程 客户端可以通过telnet操作,也可以通过各种编程语言实现的客户端程序存取数据及查询状态 memcached的服务器与客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
  • 8. 基于libevent的事件处理 libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理。 包装的接口包括: poll、select(Windows)、epoll(Linux)、kqueue(BSD)、/dev/pool(Solaris) Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。 关于libevent,可查看:http://www.monkey.org/~provos/libevent/
  • 9. 内置内存存储方式 数据存储方式:Slab Allocation 数据过期方式:Lazy Expiration + LRU
  • 10. 数据存储方式:Slab Allocation Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以解决内存碎片问题。 Slab Allocation的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合) memcached -f 2 –vv (参数f可设置size)Slab Alloction 构造图
  • 11. 数据存储方式:Slab Allocation memcached根据收到的数据的大小,选择最适合数据大小的slab。 memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。 Page:分配给Slab的内存空间,默认是1MB。分配给Slab之后根据slab的大小切分成chunk。 Chunk:用于缓存记录的内存空间。 Slab Class:特定大小的chunk的组。 Slab Classes 分配图
  • 12. 数据过期方式 Lazy Expiration memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。这种技术被称为lazy(惰性)expiration。因此,memcached不会在过期监视上耗费CPU时间。 LRU memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used(LRU)机制来分配空间。顾名思义,这是删除“最近最少使用”的记录的机制。 注意:需要保持服务器之间的时间一致性
  • 13. 基于客户端的memcached的分布式
  • 14. 基于客户端的memcached的分布式
  • 15. 基于客户端的memcached的分布式 选择服务器节点算法: 1.余数式hash算法 server = serverlist[hash(key) % serverlist的个数] 2.一致性hash算法 首先求出memcached服务器(节点)的哈希值,并将其配置到0~2^32的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过2^32仍然找不到服务器,就会保存到第一台memcached服务器上。
  • 16. 一致性hash算法
  • 17. Memcached示例说明 启动服务、telnet客户端、java客户端 Hibernate缓存设置:二级缓存、查询缓存 共享session机制
  • 18. 启动Memcached 服务器端关注基本选项 -p 监听的TCP端口 (缺省: 11211) -d 以守护进程方式运行Memcached -u 运行Memcached的账户,非root用户 -m 最大的内存使用, 单位是MB,缺省是 64 MB -c 软连接数量, 缺省是 1024 -v 输出警告和错误信息 -vv 打印客户端的请求和返回信息 -h 打印帮助信息 -i 打印memcached和libevent的版权信息 -n 设置初始chunk的大小 -f chunk size factor的增长因子,默认是1.25 运行 Memcached 目标:使用11211端口、mengxl用户、最大占用512M内存、1024个软连接,输出客户端请求,以守护进程方式运行 # /usr/local/bin/memcached -p 11211 -d -u mengxl -m 512 -c 1024 -vv
  • 19. public class MemcacheService { private static MemcacheService instance = null; private SockIOPool pool = null; private String poolName = "pool"; public static synchronized MemcacheService getInstance() { if (instance == null) { instance = new MemcacheService (); } return instance; } private MemcacheService () { String[] servers = new String[]{"127.0.0.1:11211“, “127.0.0.1:11212”}; pool = SockIOPool.getInstance(poolName); pool.setServers(servers); pool.initialize(); } public MemCachedClient getMemCachedClient() { MemCachedClient mc = new MemCachedClient(poolName); return mc; } protected void finalize() { if (this.pool != null) { this.pool.shutDown(); } } } Java客户端使用示例
  • 20. public static void main(String[] args) { MemcacheService service = new MemcacheService (); MemCachedClient client = service.getMemCachedClient(); Date curDate = new Date(); Date date = (Date ) client .get("date"); if(null == date){ curDate.setTime(curDate.getTime()+10000); client.set("date", curDate, curDate); }else{ System.out.println(date); } }Java客户端使用示例
  • 21. 基于分布式缓存共享sessionNode ANode BNode CCache ACache BCache C登录其他操作放入用户session获取用户session
  • 22. 一级缓存 Session内置,以实体对象为单位进行存储,实体主关键字Id作为key 二级缓存 SessionFactory范围的外置缓存,实现原理与一级缓存一样,但范围更广,可供所有的Session对象共享 查询顺序 先从Session一级缓存查找,如果找不到且配置了二级缓存,则从二级缓存查找,如果还找不到,则会查询数据库,并存入缓存Hibernate 一级缓存、二级缓存
  • 23. 适合缓存什么数据? 很少被修改的数据 不是很重要的数据,允许出现偶尔并发的数据 不会被并发访问的数据 参考数据 注意:对放入缓存中的数据不能有第三方的应用对数据进行更改(其中包括在自己程序中使用其他方式进行数据的修改,如jdbc),因为那样hibernate将不会知道数据已经被修改,也就无法保证缓存数据与数据库数据的一致性Hibernate 二级缓存
  • 24. 查询缓存是专门针对各种查询操作进行缓存 存储方式采用key-value形式 key:根据查询的语句、查询的条件、查询的参数和查询的页数等信息组成的 注意:对于完全相同的select SQL,查询缓存才生效。在两次查询之间,select SQL对应的库表没有发生过改变。可以通过设置有效期的方式,实现短暂数据不同步 http://tb069x.corp.youdao.com:10080/adContent.s?method=checkContentHibernate 查询缓存
  • 25. true true com.googlecode.hibernate.memcached.MemcachedCacheProvider 127.0.0.1:11211 3000 KETAMA_HASH Hibernate 中配置memcached
  • 26. MemcachedSessionFilter 检测cookie,生成session id HttpSessionWrapper 形式存储session SessionService 建立与memcached的连接,并存取session 举例:http://tb069x.corp.youdao.com:10080/test.s?method=check实现Session共享方法
  • 27. 命中率 如增大服务内存总量、冗余备份等 命中率=get_hits / (get_hits + get_misses) 空间利用率 修改启动参数-f和-n,根据实际调整大小 加速比 也即事件的处理效率.是否可以修改libevent的事件处理效率等 安全性能 Linux端口监听限制,或者添加防火墙,以防被攻击Memcached可优化点
  • 28. Q&A ThanksEmail: mengxl@rd.netease.com Popo : frankie_meng@corp.netease.com Msn : mengxiangl@msn.com