分布式缓存学习
阿里云OCS:
提供对热点数据的高速访问。
缓存重点:
- 缓存里的数据不是持久化保存的,数据在没有持久化前都是游离态。
- 缓存里存的应该是“热点”数据。遵循常常出现的“20-80法则”,通常程序应用中都有一定比例的数据常常被请求访问,这就是所谓的热点数据,OCS正是为这种数据设计存在的。假定我们的程序中有100个数据,每次访问这些数据的概率完全是均匀分布的1/100,那么使用缓存的效果就不会太好,因为这其中不存在热点数据。
- 数据逐出。我们可以决定哪些数据是热点数据被放到缓存当中,但是如果我们的缓存容量不够大,这些热点数据中某些最近较少被用到的数据还是会被“挤出去”,这种行为叫做数据逐出。
阿里云缓存特点:
1. 阿里云OCS仅支持阿里云内网访问,不支持公网访问
2. 阿里云OCS需要与ECS(阿里云服务器)配合使用,而且只能与本地区节点的ECS连通
3. 阿里云OCS是按购买量收费的,而不是按使用量收费
4. 阿里云OCS对于存贮的对象大小是有限制的。缓存通常对其内部存储的数据尺寸是有限制的,阿里云OCS也一样。目前OCS支持存储的数据对象的上限是1,000,000Byte。如果要存的值超过这个限制,我们应该考虑把数据压缩,或从逻辑上分成不同键存储的几个值。
示例1:因为阿里云ocs只能通过内网访问,所以需要在阿里的ECS(服务器)上执行访问
Final String host = "b2fd2f89f49f11e3.m.cnqdalicm9pub001.ocs.aliyuncs.com";//控制台上的“内网地址” final String port ="11211"; //默认端口 11211,不用改 final String username = "b2fd2f89f49f11e3";//控制台上的“访问账号” final String password = "my_password";//邮件或短信中提供的“密码” MemcachedClient cache = null; try { AuthDescriptor ad = new AuthDescriptor(new String[]{"PLAIN"}, new PlainCallbackHandler(username, password)); cache = new MemcachedClient( new ConnectionFactoryBuilder().setProtocol(Protocol.BINARY) .setAuthDescriptor(ad) .build(), AddrUtil.getAddresses(host + ":" + port));
System.out.println("OCS Sample Code");
//向OCS中存一个key为"ocs"的数据,便于后面验证读取数据,1000为数据过期时间 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(); // 确保之前(mc.set())操作已经结束 //执行get操作,从缓存中读数据,读取key为"ocs"的数据 System.out.println("Get操作:"+cache.get("ocs")); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } if (cache != null) { cache.shutdown(); } |
示例2:保存对象,方法和示例1一致,但保存的Java对象必须继承serializable接口
示例3:分布式缓存和数据库结合。
for (int i = 1; i <= 20; i++) { |
Memcached缓存
Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一 个存储键/值对的hashmap。其守护进程是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET等
特性:Memcached
1.协议简单:不使用复杂xml,而使用文本格式
2.基于libevent事件处理机制
3.内置内存存储方法(重启会丢失数据)
4. Memcached相互不通信的分布式: Memcached 服务器之间不会进行通信,数据都是通过客户端的分布式算法存储到各个服务器中
代码基本和阿里云OCS一致 set和get是基本对象操作的方法。
注意“:add和set区别
set和add方法的不同之处是add方法不允许key值相同,如果第二次add的key相同,则存储失败,而set方法允许key相同,如果相同,则替换该key对应的value。
Jedis+redis
Jedis是redis的官方客户端工具。
示例:
Jedis jedis = new Jedis("10.11.20.140"); String keys = "name";
// 删数据 jedis.del(keys); // 存数据 jedis.set(keys, "snowolf"); // 取数据 String value = jedis.get(keys); System.out.println(value); |
完成程序示例代码见附件