Memcache 缓存

维护云平台缓存机制(memcached)技术总结

memcached简介
memcached是一套高性能的分布式内存缓存服务器。
许多Web应用都将数据保存到数据库中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现数据库的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached大显身手了,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。

memcached安装
解压memcached.zip,启动memcached.exe即可。
memcached使用
一、初始化memcached的连接池
1.引用memcached.zip中相关的jar
2.调用SockIOPool.getInstance()生成memcached的连接池
3.设置相关参数,可以使用配置文件或者xml文件格式进行设置,目前umc是使用xml文件进行连接池相关参数设置。
4.调用pool.initialize()进行连接池初始化。
二、调用memcached的api进行数据操作,列举一些常用的方法
1.get(String)从缓存中获取String对应的数据
2.add(String, Object)向缓存中添加数据,仅当存储空间中不存在键相同的数据时才保存。
3.replace(String, Object)替换缓存中数据,仅当存储空间中不存在键相同的数据时才保存
4.delete(String)将数据从memcached服务器中移除
5.set(String, Object)设置数据,与add和replace不同,无论何时都保存
memcached的内存存储
memcached默认情况下采用了名为Slab Allocator的机制分配、管理内存,Slab Allocator的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题,Slab Allocation的原理相当简单。将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk的集合)

memcached根据收到的数据的大小,选择最适合数据大小的slab。memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

Slab Allocator的缺点:由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将100字节的数据缓存到128字节的chunk中,剩余的28字节就浪费了。

memcached的分布式
memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息
一、memcached的分布式是什么意思
假设需要保持“key1”,“key2”,“key3”这三个key对应的数据,有node1、node2、node3三台分布式。
首先向memcached中添加“key1”。将“key1”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“key1”及其对应的数据。接下来获取保存的数据。
获取时也要将要获取的键“key1”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值

二、分布式算法-余数计算分散
求得键的整数哈希值,再除以服务器台数,根据其余数来选择服务器
memcached在umc中的应用
一、umc使用memcached进行数据缓存
umc使用了memcached基本的get和add方法进行缓存处理,具体使用方法可参照如下代码。

首先检查缓存中是否存在key对应的相应数据,如果存在,返回缓存数据,否则从数据库中查询出满足业务逻辑的数据,并放入缓存中供下次查询时使用。

二、基于事件监听的memcached缓存更新
由于数据库中的数据有可能变化,当数据库中数据发生变化时,需要通知缓存服务器将已有的缓存数据失效,否则数据库中的数据和缓存中的数据将不一致,导致业务错误。这就涉及到缓存更新事件。
目前UMC的缓存更新是采用观察者模式,类似于swing的事件监听,采用了事件驱动的形式。下图展示的是umc事件驱动的角色协作流程。

在事件控制器中,定义了一个java.util.concurrent.LinkedBlockingQueue,保证事件之间按照顺序执行,并且使用LinkedBlockingQueue确保并发更新缓存时正确。
在事件控制器中注册监听器,由事件执行器执行事件。
下图展示了umc缓存更新事件的完整时序图:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值