前几天接触到memcache的,这里学习下。希望看到这个文章的人能够纠错和补充。
http://sacharya.com/
前面写的是JBoss Cache和Memcached的比较。从而肯定了Memcached的简单,资源消耗小,便于维护的优点。
简介:
Memcached的优点:简单、独立、便于维护。
Memcached服务是一个内存缓存。它可以通过键值对存储包括字节、文档、原语等信息。想其他缓存一样,存储数据到内存中。从而当用户请求数据
的时候,阻止用户区访问数据库、文件系统以及其他后端系统。这样就降低了后端系统的负载。提高了系统的扩展性。当数据存储到到内存后,访问数据时就会比昂
贵的后天服务要快很多。
然而,Memcached并不是不变的存储空间。而且并不保证数据就一定会在缓存中,尽管你确实将数据存进去了。所以不要完全相信缓存。
Memcached的唯一一个限制就是cache的key的字符长度不能超过255个。并且被存储的值不能超过1MB。
安装:
1、安装Libevent:
Memcached使用Libevent库来处理网络IO。
$ cd libevent-1.4.11-stable
$ autoconf
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
2、安装Memcached:
从 Danga.com
下载最新版本的Memcached。
$ cd memcached-1.4.0
$ autoconf
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
3、运行Memcached:
在11211端口启动512MB的守护线程,然后你就能通过端口远程登录到服务,使用一些操作命令。
$memcached -d -m 512 127.0.0.1 -p 1121
$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get joe
END
set joe 0 3600 10 (Note: TTL 3600 and 10 bytes)
California
STORED
get joe
VALUE joe 0 10
California
END
java Memcached 客户端:
可以在下面两个连接中下载客户端:http://code.google.com/p/spymemcached/
https://github.com/gwhalin/Memcached-Java-Client/wiki/
这里使用了后者。连接中可以找到相应的API。
MemcachedClient c=new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
c.set("someKey", 3600, someObject);
Object myObject=c.get("someKey");
c.delete("someKey")
Memcached客户端是单线程的,set方法通过键值将值放到cache中。如果一个值已经在cache中存在就,原来的值就会被重写。set方法还设置了这个值的存活时间。
添加或者移除缓存服务:
如果你需要升级系统,给cache添加一个服务器。你只需要将新增加的服务器的ip和端口添加到现有的服务器中中的“池”里。memcached服
务客户端,就会将它记录下来。相反如果你想去掉一个服务器,只需要将“池”中的ip和端口删除。这样会让数据命中失败一小段时间。这个数据不久就会恢复到
其他服务器上面。如果你担心访问数据库,你可以在缓存服务器去掉后,将数据倒到其他服务器上面。
MemcachedClient c = new MemcachedClient(new BinaryConnectionFactory(),
AddrUtil.getAddresses("server1:11211 server2:11211"));
链接到“池”:
Memcached 建立的是TCP链接(Facebook 已经发布了一个Memcache的修改版本,使用的是UDP,去减少链接次数)来链接到Memcached服务。所以你想知道有多少服务链接被使用。
$ netstat -na | grep 11211
tcp4 0 0 127.0.0.1.11211 127.0.0.1.59321 ESTABLISHED
tcp4 0 0 127.0.0.1.59321 127.0.0.1.11211 ESTABLISHED
没有确切的方法去关闭链接,因为set和get方法都是动态的。我喜欢固定的链接,并且重用这些链接。这样可以防止建立TCP链接照成的开销。
Mycache单例:
这是我封装memcached的代码:
01.import net.spy.memcached.AddrUtil;
02.import net.spy.memcached.BinaryConnectionFactory;
03.import net.spy.memcached.MemcachedClient;
04.
05.public class MyCache {
06.private static final String NAMESPACE= "SACHARYA:5d41402abc4b2a76b9719d91101";
07.private static MyCache instance = null;
08.private static MemcachedClient[] m = null;
09.
10.private MyCache() {
11.try {
12.m= new MemcachedClient[21];
13.for (int i = 0; i <= 20; i ++) {
14.MemcachedClient c = new MemcachedClient(
15.new BinaryConnectionFactory(),
16.AddrUtil.getAddresses("127.0.0.1:11211"));
17.m[i] = c;
18.}
19.} catch (Exception e) {
20.
21.}
22.}
23.
24.public static synchronized MyCache getInstance() {
25.System.out.println("Instance: " + instance);
26.if(instance == null) {
27.System.out.println("Creating a new instance");
28.instance = new MyCache();
29.}
30.return instance;
31.}
32.
33.public void set(String key, int ttl, final Object o) {
34.getCache().set(NAMESPACE + key, ttl, o);
35.}
36.
37.public Object get(String key) {
38.Object o = getCache().get(NAMESPACE + key);
39.if(o == null) {
40.System.out.println("Cache MISS for KEY: " + key);
41.} else {
42.System.out.println("Cache HIT for KEY: " + key);
43.}
44.return o;
45.}
46.
47.public Object delete(String key) {
48.return getCache().delete(NAMESPACE + key);
49.}
50.
51.public MemcachedClient getCache() {
52.MemcachedClient c= null;
53.try {
54.int i = (int) (Math.random()* 20);
55.c = m[i];
56.} catch(Exception e) {
57.
58.}
59.return c;
60.}
61.}
在上面的代码:
1、 我使用了BinaryConnectionFactory,这个一个新功能,它使用了新的字节流协议。使解析文本更加有效。
2、MyCache是一个单例,但它被实例化的时候会建立21个链接。
3、我的key的格式是:SACHARYA:5d41402abc4b2a76b9719d91101:key。SACHARYA是我们域。这样我就可以使用相同的cache服务存储我的不同应用的数据。第二个随即字符串是为了隐藏key。最后就产生了数据的唯一标识。
简单使用:
通常情况下,你可以在系统瓶颈处使用cache。
01.public List<Product> getAllProducts() {
02.List<Product> products = (List<Product>) MyCache.getInstance().get("AllProducts");
03.if(products != null) {
04.return products;
05.}
06.products = getAllProductsFromDB()
07.if(products) {
08.MyCache.getInstance().put("AllProducts", 3600, customer);
09.}
10.return products;
11.}
12.
13.public void updateProduct(String id) {
14.updateProductIntoDB(id)
15.MyCache.getInstance().delete("AllProducts");
16.}
17.public void deleteProduct(String id) {
18.deleteProductFromDB(id)
19.MyCache.getInstance().delete("AllProducts");
缓存警告:
当应用第一次启动的时候,cache中没有数据。所以你可以通过一个调度程序预热cache。防止开始时大量访问端点(如数据库)。
监控cache效率:
stats命令提供了重要的信息,这些信息可以告诉你cache的执行情况。它显示了所有的get请求,以及多少命中成功,多少命中失败。
$ telnet localhost 11211
stats
STAT cmd_get 13219
STAT get_hits 12232
STAT get_misses 512
以上显示的意思是总共有13219个请求,其中有12232请求得到了想要的数据(命中)。有512个请求没有得到想要的数据。
分享到:
相关推荐
赠送jar包:netty-codec-memcache-4.1.73.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.73.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
Facebook在实现Memcache扩展方面有着丰富的经验和独特的解决方案,本文将深入探讨Facebook是如何通过改进开源版本的Memcached来构建和扩展分布式键值存储系统,以支撑世界上最大的社交网络。首先,我们来概述...
赠送jar包:netty-codec-memcache-4.1.74.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.74.Final-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
在云数据库Memcache版部分,阿里云提供了云数据库Memcache版的基本概念、使用须知、操作指南等内容,旨在帮助用户快速了解和使用云数据库Memcache版的产品。 在通用约定部分,阿里云提供了关于云数据库Memcache版的...
赠送jar包:netty-codec-memcache-4.1.73.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.73....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:netty-codec-memcache-4.1.74.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.74....人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
4. 使用约定:阿里云对用户使用本文档的行为进行了一些规定,例如不得擅自摘抄、翻译、复制本文档内容的部分或全部,不得以任何形式或途径进行传播和宣传等。 5. 法律责任:阿里云明确声明对本文档内容的准确性、...
"阿里云 专有云企业版 V...本文档提供了阿里云专有云企业版 V3.8.1 云数据库 Memcache 版安全白皮书的法律声明、云数据库 Memcache 版安全白皮书、安全设计、通用约定和其他内容,以便用户更好地理解和使用该产品。
阿里云在法律声明中明确了下载、使用本白皮书的条款和条件,包括保密义务、禁止擅自摘抄、翻译、复制和传播本白皮书的内容,等等。 云数据库Memcache版技术白皮书 云数据库Memcache版是阿里云提供的一种云数据库...
该文档为阿里云专有云Enterprise版云数据库Memcache版开发指南 V3.3.0,旨在帮助用户更好地使用阿里云云数据库Memcache版产品。该文档涵盖了云数据库Memcache版的法律声明、通用约定、API参考、开发指南等内容。 ...
阿里云专有云企业版V3.8.2云数据库Memcache版用户指南是一款详细阐述如何使用阿里云Memcache服务的文档,适用于企业级用户。Memcache是一种高性能的分布式内存对象缓存系统,它能够提高应用程序的数据访问速度,减轻...
【阿里云专有云企业版 V3.9.0 云数据库 Memcache 版 用户指南】是一份详细阐述如何使用阿里云专有云上Memcache服务的文档,适用于V3.9.0版本的产品。这份指南旨在帮助用户理解和操作阿里云的云数据库Memcache服务,...
3. 使用限制:未经阿里云事先书面同意,任何单位、公司或个人不得擅自摘抄、翻译、复制本文档内容的部分或全部,不得以任何方式或途径进行传播和宣传。 4. 版本变化:由于产品版本升级、调整或其他原因,本文档内容...
阿里云专有云企业版V3.8.0的云数据库Memcache版开发指南是一份详细的技术文档,旨在帮助开发者和用户更好地理解和使用阿里云提供的云数据库Memcache服务。此版本的开发指南发布于2019年6月21日,适用于专有云环境,...
阿里云专有云企业版V3.9.0云数据库Memcache版开发指南是针对该版本的阿里云数据库产品的一份详细技术文档,旨在帮助开发者和用户理解和使用云数据库Memcache服务。Memcache是一种高性能的分布式内存对象缓存系统,常...
阿里云专有云Enterprise版云数据库Memcache版V3.1.0开发指南主要涵盖了针对Memcache服务的详细使用和开发指导。Memcache是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高应用性能。以下是基于文档...
该版本的文档详细介绍了如何使用和开发基于阿里云的云数据库Memcache服务。Memcache是一种高性能的分布式内存对象缓存系统,常用于加速动态Web应用,通过将数据存储在内存中,减少数据库的负载。 文档首先强调了...
阿里云专有云企业版V3.7.1云数据库Memcache版开发指南是一份详细介绍如何使用和开发基于Memcache的云数据库服务的文档。该文档适用于那些希望在阿里云专有云环境中利用Memcache进行数据缓存和管理的企业和个人开发者...
阿里云专有云企业版V3.8.2云数据库Memcache版的安全白皮书主要聚焦于该服务的安全设计和用户使用条款。这份文档详细阐述了阿里云在保护客户数据和资源方面所采取的安全措施,同时也规定了用户在使用云数据库Memcache...