Redis 和數據庫連接池
一、先來搞清楚兩個問題:Redis 到底是什么,數據庫連接池又是怎么一回事?
1. Redis 是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合可以對關系數據庫起到很好的補充作用。它提供了Python,Ruby,Erlang,PHP客戶端,使用很方便。
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹復制。從盤可以有意無意的對數據進行寫操作。由于完全實現了發布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗余很有幫助。
2. 數據庫連接池:
數據庫連接池在初始化時將創建一定數量的數據庫連接放到連接池中,這些數據庫連接的數量是由最小數據庫連接數來設定的。無論這些數據庫連接是否被使用,連接池都將一直保證至少擁有這么多的連接數量。連接池的最大數據庫連接數量限定了這個連接池能占有的最大連接數,當應用程序向連接池請求的連接數超過最大連接數量時,這些請求將被加入到等待隊列中。
?二、 redis_java操作?
Jedis 客戶端實現
Maven pom文件 加入依賴
<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 簡單使用
/* * 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); } } }