【数据库】缓存学习

分布式缓存学习

阿里云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++) { 
                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 

 

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);

 

完成程序示例代码见附件

你可能感兴趣的:(【数据库】缓存学习)