一直有同学反映说感觉阿里云的OCS(开放缓存服务)应该是很有用,但是不知道究竟该怎么用,今天我们就开个帖,给刚上手的同学们介绍下阿里云的OCS。
咱们这个入门帖子慢慢来,期间如果有已经玩转了OCS的大牛愿意也上来分享一下自己的体会,我们也欢迎。
俗话说“笨鸟先飞”,但我认为在阿里云看来用户没有什么“笨鸟” ,顶多是还没有成长为骨灰级大神之前的“菜鸟”,所以咱们这个帖子就叫做“菜鸟先飞”。
-------------------------
-------------------------
在开始使用之前,关于阿里云OCS,我们还需要知道以下这些事:
-------------------------
现在我们开始在阿里云官网上购买OCS实例 http://buy.aliyun.com/ocs 首先我们需要已经有了一台阿里云ECS,否则我们无法在这个页面成功购买OCS。
购买的第一步,我们先要确定选择买哪个地区的OCS;这个很重要,如上面所说,如果我们的ECS是属于北京,而我们在这里购买了杭州的OCS,那么这两者是无法配合协同工作的。所以,在购买OCS的时候一定要选择应用服务器ECS所在地区的OCS。
下一步是要选择OCS缓存容量。我们要购买多大的缓存,这个取决于我们对自身业务应用中热点数据总量大小的判断。如果一时难以准确判断数据量,也不用担心:我们可以先买一个大致容量的OCS(比如1GB),随后在使用过程中,通过OCS控制台提供的监控功能,我们可以了解到目前OCS缓存的使用量等数据,然后可以自主的调整所需的缓存量,购买更大的缓存(比如升到5GB)或者减少已购的缓存量(比如降到512MB),阿里云会根据我们选择的新配置来调整对应的收费。
此外在选择缓存容量的时候,要知道不同容量的缓存档位对应着不同的性能配额,具体来说包括两个指标:吞吐量带宽与每秒请求处理数(QPS)。比如以现在的配额标准,1GB的OCS缓存对应5MB/sec的吞吐量带宽和3000次/sec的请求处理峰值。当我们使用OCS的时候,如果数据量传输的带宽超过了5MB/s, 或者每秒的请求数超过了3000次,都会触发性能配额控制机制,导致某些请求无法返回正常结果。
在确定了地区和缓存容量之后,我们就可以直接下单购买OCS了。
-------------------------
在成功购买OCS之后,我们的联系邮箱和手机都会收到OCS创建成功的通知,里面会包括OCS的实例ID和初始密码(关于密码的用处后面会讲到)。
我们现在登录OCS控制台, http://ocs.console.aliyun.com/ 就可以看到已经购买到的OCS实例列表。
在列表页面上对应OCS实例的后面点击“管理”,就可以进入该OCS实例的详情页,看到更多的详细信息。
-------------------------
我们现在已经有了一个OCS缓存实例,现在是时候试玩OCS了。要使用OCS就要写一点程序代码,不过不用担心,我们在这里采用“Happy-Path”的方法,从最简单的操作开始,让新上手的菜鸟们能马上就有一个能调用OCS缓存服务的程序。
OCS提供缓存服务,它并不要求我们的程序是哪种语言来写的。我们这里先以Java程序为例,写一个最简单的“Hello World”。(其他编程语言的例子,我们随后附上。)
第一步,登录你的阿里云ECS服务器,在上面安装Java JDK和你常用的IDE(比如Eclipse)。一定要记得我们之前说过的,只有在阿里云内网的ECS服务器上,才能访问我们的OCS实例。所以,用家里或是公司的电脑执行下面的代码示例是看不到结果的。
Java JDK和Eclipse都很容易从网上找到下载,比如 http://download.eclipse.org/ 或者 http://www.onlinedown.net/soft/32289.htm
OK,搞定!我们已经成功的连接上了阿里云的OCS并且调用缓存服务成功,就这么简单。
OCS Sample Code
Set操作完成!
Get操作: Open Cache Service, from www.Aliyun.com
-------------------------
我们已经成功运行了第一个调用阿里云OCS缓存服务的Sample程序OcsSample1.java,现在我们看看这个程序里都做了什么。
…… …… ……
System.out.println("OCS Sample Code");
//向OCS中存一个key为"ocs"的数据,便于后面验证读取数据,
//这个数据对应的value是字符串 Open Cache Service, from www.Aliyun.com
OperationFuture future = cache.set("ocs", 1000," Open Cache Service, from www.Aliyun.com");
//向OCS中存若干个数据,随后可以在OCS控制台监控上看到统计信息
for(int i=0;i<100;i++){
String key="key-"+i;
String value="value-"+i;
//执行set操作,向缓存中存数据
cache.set(key, 1000, value);
}
System.out.println("Set操作完成!");
future.get(); // 确保之前(cache.set())操作已经结束
//执行get操作,从缓存中读数据,读取key为"ocs"的数据
System.out.println("Get操作:"+cache.get("ocs"));
…… …… ……
从这些代码中可以看出:
1. 我们在建立与OCS缓存服务器的连接后,先是向缓存中存(set)了一个“key-value”(键值对)形式的数据,这个数据的key是字符串“ocs”,其对应的value也是字符串;
2. 接着我们继续向缓存中存(set)了100个其他简单的“key-value”数据。
3. 最后我们进行功能验证。根据之前给定的key,从缓存中获取(get)其对应的value:也就是输入字符串“ocs”,缓存给我们返回value对应的字符串。
以上的步骤中,1与3是相对应的,我们只有先向缓存中set了某个数据,后面才能从缓存中get到这个数据。
步骤2中程序向缓存set了100个数据,是为了从另一个方面进行验证。我们回到阿里云OCS控制台,打开“实例详情”页,在“实例监控”的部分点击刷新,会看到其中一些监控项的值已经发生了变化(注:监控信息的刷新可能存在数秒的延迟), 其中的“Key的个数”已经变成了101,也就是说我们程序已经成功地向OCS缓存中存放了101个数据。
-------------------------
在写下一篇技术贴之前,列一些OCS用户在入门时问到的问题,方便其他刚认识OCS的同学:
Question:买了1G的OCS,那就相当于这个1G是专门缓存用的,与ECS服务器的内存没关系是吧~
Answer:是的,OCS的缓存容量与您ECS的内存容量是没关系的。
Question:OCS 外网测试,怎么连接?有没有外网连接地址哦?
Answer:OCS是不能从外网访问的。参照上面的文章。
Question:我之前那个OCS可以正常使用,但现在换了一个OCS就不行了,怎么回事?
Answer:经核实您的主机是属于杭州节点的,而现在这个OCS是青岛节点的,不同地域之间的产品内网不互通。
Question:在设置一个value时,如果指定过期时间为0,会永久保留吗?
Answer:指定过期时间为0,OCS就认为此数据不根据过期时间发生淘汰;但是,此数据仍有可能基于LRU被其他数据淘汰,或者由内存清理造成丢失 ,因此不能认为这个value会永久保留。
Question:对OCS的访问是否需要负载均衡?
Answer:不需要。对访问请求的负载均衡都是在OCS服务器端来进行的,用户直接使用缓存服务即可,不用考虑负载均衡的事情。
Question:OCS是否会主动关闭闲置的连接? 如果会,请问连接闲置多久会被关闭?
Answer:OCS不会主动关闭闲置的用户连接。但是用户的环境如果使用了SLB,则需要参考SLB连接关闭时间。
Question:如何设置数据在OCS缓存中的过期时间 ?
Answer:关于设置缓存数据的过期时间,可以参考Memcached官方说明: https://code.google.com/p/memcached/wiki/NewCommands An expiration time, in seconds. Can be up to 30 days. After 30 days, is treated as a unix timestamp of an exact date. 翻译过来就是:0~2592000表示从当前时刻算起的时间长度(以秒计算,最长2592000即30天);大于2592000表示UNIX时间戳。 此值设置为0表明此数据不会主动过期。
-------------------------
-------------------------
缓存与数据库相结合使用,是常见的一种应用搭配场景。现在我们再看一个例子,是用OCS搭配MySQL数据库使用。Java示例代码在此(
这个示例代码中,大部分与前几个例子类似。因为要与数据库结合,所以程序需要依赖一个JDBC的jar包才能运行。支持MySQL的JDBC jar包在此(
在程序中添加MySQL数据库的连接信息:
…… …… ……
// JDBC driver name and database URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://xxxxxxx.mysql.rds.aliyuncs.com/testdb"; //MySQL数据库URL
// Database用户名及密码
static final String DB_USER = "xxxxxx";
static final String DB_PASS = "xxxxxx";
我们设想这样一个场景:我们需要从数据库的tableone表中查找区域不属于北京的记录总数,用SQL表示就是:
SELECT count(*) FROM testdb.tableone where region != 'beijing'
假定这个表中的数据如下,则这条SQL查询返回的结果就是7:
如果这个查询被调用到的频率很高,多个用户反复不断的在数据库中查这个数据,我们就可以把这个查询结果放到OCS缓存中去。
看下面的代码片段,我们用for循环模拟用户连续20次在数据库中查询上述SQL语句:
for (int i = 1; i <= 20; i++) {
String sql = "SELECT count(*) FROM testdb.tableone where region != 'beijing'";
String key ="non-beijing"; //给SQL语句自定义一个key
//在OCS缓存里按key查找
String value = (String) cache.get(key);
if (value == null) {
// 在OCS缓存里没有命中
// step 1:从My SQL数据库中查询
//Load MySQL Driver
Class.forName(JDBC_DRIVER);
con = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS);
ps = con.prepareStatement(sql);
ResultSet result = ps.executeQuery(sql);
result.next();
value=result.getString(1);
System.out.println("从MySQL中查询数据. Key= "+key+" Value="+value);
// step 2: 把数据库返回的数据作为value存放到OCS缓存中去
cache.set(key, EXPIRE_TIME, value);
} else {
// 在OCS缓存里命中
System.out.println("从OCS中读取数据. Key= "+key+" Value="+value);
}
}// end of for
在这段代码中我们可以看到,我们给这条SQL语句标记了一个key,当有用户要执行这条SQL的时候,我们首先按照key在OCS缓存中查找:如果没有对应的缓存数据,则连接MySQL数据库执行SQL查询,把结果返回给用户,并把这个查询结果存到OCS缓存中去;如果OCS中已经有了对应的缓存数据,则直接把缓存数据返回给用户。
运行结果如下:
从MySQL中查询数据. Key= non-beijing, Value=7从结果可以看出,程序第1次是从MySQL数据库当中查询数据,后面的19次都是从OCS缓存中获取key对应的value直接返回。也就是说,OCS降低了程序去连接MySQL数据库执行SQL查询的次数,减轻了对数据库的负载压力。用户对热点数据访问的频率越高,OCS的这种优势就越明显。
从OCS中读取数据. Key= non-beijing, Value=7
从OCS中读取数据. Key= non-beijing, Value=7
从OCS中读取数据. Key= non-beijing, Value=7
…… ……
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。