Memcached
许可证: Revised BSD License
活跃度: 中
目的: 内存缓存
官方地址: http://memcached.org
Hadoop集成: 无集成
你完全有可能遇到这种情景,你需要在很短的时间内访问大量的数据。例如,假设你想要给你的客户发送一封邮件,并期望他们能够了解你在你产品中添加的新特征,但是你也需要是一些你这个月已经联系过但是不包含在内的人。
这个方法就是你通过查询一个非常大的联系人列表分布在很多机器上,在一个非常大的数据系统中查询,然后加载这个月联系过的人整个列表到每台机器的内存,并且在这个列表中快速检查你联系过的每个联系人。在MapReduce中,这通常称为“复制连接”。但是假设你已经有了非常庞大的一个联系网,这个联系网包含数以百万计的email地址,这些地址都是在交易演出,产品演示或者社交媒体上收集来的,而且你与这些人联系也是相当频繁。这就意味着你这个月已经联系过的人的列表是相当大的,而且整个列表在每天机器上的可用内存可能就不够用了。
你真正需要的就是将你所有机器的内存都连在一起形成池子,并且让每个人都在这个大池子中操作。Memcached就是这么一个工具让你建立一个分布式内存池。为了遵守前面的例子,你需要将已经发过邮件的人的整个列表都放在这个分布式内存池中,并且通知虽有不同的机器处理完整联系列表都是到这个内存池中,而不是本地内存。
教程链接
spymemcached项目有很多例子,在wiki上有它的API。
示例代码
假设需要跟踪哪个评论者评论了哪部电影,所以我们不会让一个评论人对同一部电影评论两次。因为没有单独的,官方支持Memcached的Java客户端,我们用比较流行的spymemcached客户端。
我们定义一个客户端并将它指到我们的Memcached服务器:
MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses("server1:11211 server2:11211"));
现在开始加载数据到缓存。我们用流行的OpenCSV库读评论文件并把我们找到的每个<评论人,题目>对写一个实体到缓存中。
CSVReader reader = new CSVReader(new FileReader("reviews.csv"));
String [] line;
while ((line = reader.readNext()) != null) {
//Merge the reviewer name and the movie title
//into a single value (ie: KevinDune)
//that we'll use as a key
String reviewerAndTitle = line[0] + line[1];
//Write the key to our cache and store it for 30 minutes
//(188 seconds)
client.set(reviewerAndTitle, 1800, true);
}
一旦数据都加载到缓存中,我们就可以很快地用MapReduce或者其他Java代码来价差缓存:
Object myObject=client.get(aKey);