Redis 和數據庫鏈接池

1、先來搞清楚兩個問題:Redis 究竟是什麼,數據庫鏈接池又是怎麼一回事?java

  1. Redis 是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。redis

    Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫起到很好的補充做用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。數據庫

    Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。從盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。緩存

   2. 數據庫鏈接池:服務器

       數據庫鏈接池在初始化時將建立必定數量的數據庫鏈接放到鏈接池中,這些數據庫鏈接的數量是由最小數據庫鏈接數來設定的。不管這些數據庫鏈接是否被使用,鏈接池都將一直保證至少擁有這麼多的鏈接數量。鏈接池的最大數據庫鏈接數量限定了這個鏈接池能佔有的最大鏈接數,當應用程序向鏈接池請求的鏈接數超過最大鏈接數量時,這些請求將被加入到等待隊列中。memcached

2、 redis_java操做性能

Jedis 客戶端實現spa

Maven pom文件 加入依賴.net

<dependencies>  
  <dependency>  
    <groupId>redis.clients</groupId>  
    <artifactId>jedis</artifactId>  
    <version>2.1.0</version>  
  </dependency>  
    
  <dependency>  
    <groupId>junit</groupId>  
    <artifactId>junit</artifactId>  
    <version>4.8.2</version>  
    <scope>test</scope>  
  </dependency>  
</dependencies>

Jedis 簡單使用code

/* 
 * JedisTest.java 
 */  
package com.x.java2000_wl;  
  
import org.junit.Before;  
import org.junit.Test;  
  
import redis.clients.jedis.Jedis;  
  
/** 
 * jedis 簡單使用 
 * @author http://blog.csdn.net/java2000_wl 
 * @version <b>1.0</b> 
 */  
public class JedisSimpleTest {  
  
    private Jedis jedis;  
      
    /** 
     * 初始化鏈接 
     * <br>------------------------------<br> 
     */  
    @Before  
    public void beforeClass() {  
        jedis = new Jedis("127.0.0.1");  
        jedis.auth("java2000_wl");  
    }  
      
    /** 
     * set 新增 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testSet() {  
        jedis.set("blog", "java2000_wl");  
    }  
      
    /** 
     *  獲取 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testGet() {  
        System.out.println(jedis.get("blog"));  
    }  
      
    /** 
     * 修改key 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testRenameKey() {  
        jedis.rename("blog", "blog_new");  
    }  
      
    /** 
     * 按key刪除 
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testDel() {  
        jedis.del("blog_new");  
    }  
      
    /** 
     * 獲取全部的key  
     * <br>------------------------------<br> 
     */  
    @Test  
    public void testKeys() {  
        System.out.println(jedis.keys("*"));  
    }  
}

使用commons-pool鏈接池

/* 
 * JedisPoolTest.java 
 */  
package com.x.java2000_wl;  
  
import java.util.ResourceBundle;  
  
import org.junit.Assert;  
import org.junit.BeforeClass;  
import org.junit.Test;  
  
import redis.clients.jedis.Jedis;  
import redis.clients.jedis.JedisPool;  
import redis.clients.jedis.JedisPoolConfig;  
  
/** 
 * jedis Pool 操做 
 * @author http://blog.csdn.net/java2000_wl 
 * @version <b>1.0</b> 
 */  
public class JedisPoolTest {  
  
    private static JedisPool jedisPool;  
      
    /** 
     * initPoolConfig 
     * <br>------------------------------<br> 
     * @return 
     */  
    private static JedisPoolConfig initPoolConfig() {  
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();  
        // 控制一個pool最多有多少個可用的的jedis實例  
        jedisPoolConfig.setMaxActive(1000);   
        // 最大可以保持空閒狀態的對象數  
        jedisPoolConfig.setMaxIdle(300);  
        // 超時時間  
        jedisPoolConfig.setMaxWait(1000);  
        // 在borrow一個jedis實例時,是否提早進行alidate操做;若是爲true,則獲得的jedis實例均是可用的;  
        jedisPoolConfig.setTestOnBorrow(true);   
        // 在還會給pool時,是否提早進行validate操做  
        jedisPoolConfig.setTestOnReturn(true);  
        return jedisPoolConfig;  
    }  
      
    /** 
     * 初始化jedis鏈接池 
     * <br>------------------------------<br> 
     */  
    @BeforeClass  
    public static void before() {  
        JedisPoolConfig jedisPoolConfig = initPoolConfig();    
        // 屬性文件讀取參數信息  
        ResourceBundle bundle = ResourceBundle.getBundle("redis_config");  
        String host = bundle.getString("redis.host");  
        int port = Integer.valueOf(bundle.getString("redis.port"));  
        int timeout = Integer.valueOf(bundle.getString("redis.timeout"));  
        String password = bundle.getString("redis.password");  
        // 構造鏈接池  
        jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, password);  
    }  
  
    @Test  
    public void testSet() {  
        Jedis jedis = null;   
        // 從池中獲取一個jedis實例  
        try {  
            jedis = jedisPool.getResource();  
            jedis.set("blog_pool", "java2000_wl");  
        } catch (Exception e) {  
            // 銷燬對象  
            jedisPool.returnBrokenResource(jedis);  
            Assert.fail(e.getMessage());  
        } finally {  
            // 還會到鏈接池  
            jedisPool.returnResource(jedis);  
        }  
    }         
      
    @Test  
    public void testGet() {  
        Jedis jedis = null;   
        try {  
            // 從池中獲取一個jedis實例  
            jedis = jedisPool.getResource();  
            System.out.println(jedis.get("blog_pool"));  
        } catch (Exception e) {  
            // 銷燬對象  
            jedisPool.returnBrokenResource(jedis);  
            Assert.fail(e.getMessage());  
        } finally {  
            // 還會到鏈接池  
            jedisPool.returnResource(jedis);  
        }  
    }  
}
相關文章
相關標籤/搜索