復習整理7:Redis數據庫的基本應用
一:了解NoSQL
1:介紹:Nosql的全稱是Not Only Sql,這個概念早起就有人提出,在09年的時候比較火。Nosql指的是非關系型數據庫,而我們常用的都是關系型數據庫。就像我們常用的mysql,sqlserver一樣,這些數據庫一般用來存儲重要信息,應對普通的業務是沒有問題的。但是,隨著互聯網的高速發展,傳統的關系型數據庫在應付超大規模,超大流量以及高並發的時候力不從心。而就在這個時候,Nosql得到的告訴的發展。
2:NOSQl與關系型數據庫的區別:
(1)存儲方式:關系型數據庫是表格式的,因此存儲在表的行和列中。他們之間很容易關聯協作存儲,提取數據很方便。而Nosql數據庫則與其相反,他是大塊的組合在一起。通常存儲在數據集中,就像文檔、鍵值對或者圖結構。Redis就是以鍵值對方式存儲。
(2)存儲結構:關系型數據庫預定義結構帶來了可靠性和穩定性,但是修改這些數據比較困難。而Nosql數據庫基於動態結構,使用與非結構化數據。因為Nosql數據庫是動態結構,可以很容易適應數據類型和結構的變化。
(3)性能:關系型數據庫維護了數據穩定性和一致性,而NoSQL存儲面對海量數據的時候效率相比關系型數據庫非常高。
(4)略
3:NoSql的四大分類
1.鍵值(Key-Value)存儲,如Redis(優勢:快速查詢 劣勢:存儲數據缺少結構化)
2.列存儲,如HBase(優勢:快速查詢,擴展性強 劣勢:功能相對局限)
3.文檔數據庫,如mongoDB(優勢:數據結構要求不嚴格 劣勢:查詢性能不高,確實統一查詢的語法)
4.圖形數據庫,如InfoGrid(優勢:利用圖結構相關算法 劣勢:需要對整個圖做計算才能得到結果,不容易做分布式的集群方案)
二:Redis學習:
1:簡介:NoSQL(not only sql)數據庫的一種,主要以鍵值(Key-Value)的形式來存儲數據,支持的鍵值數據類型有
1 字符串類型String、
2 列表類型list、
3 有序集合類型zset、
4 散列類型hash、
5 集合類型set,
應用場景有緩存、排行榜、任務隊列、網站訪問統計、數據過期處理、分布式集群架構中的session分離。
2:安裝:Linux下,解壓安裝,後臺啟動·······操作很簡單,都是和其他軟件安裝基本一致。
三:使用Jedis操作Redis
1 簡介:Jedis是Redis官方首選的JAVA客戶端開發包
Jedis源碼工程地址:
https://github.com/xetorthio/jedis 2:使用:想要使用Jedis必須加載jar包或者添加maven依賴。在pom.xml中添加如下語句1 <dependency> 2 <groupId>redis.clients</groupId> 3 <artifactId>jedis</artifactId> 4 <version>2.9.0</version> 5 <type>jar</type> 6 <scope>compile</scope> 7 </dependency>
Jedis當然也支持連接池,連接池的好處我就不再綴述,我就說說怎麽用:
首先將配置參數抽取出來寫成redis.properties文件。例如:
1 #*****************jedis連接參數設置********************* 2 #redis服務器ip 3 redis.ip=xxx.xxx.xxx.xxx 4 #redis服務器端口號 5 redis.port=6379 6 #redis訪問密碼 7 redis.passWord=123456 8 #與服務器建立連接的超時時間 9 redis.timeout=3000 10 #************************jedis池參數設置******************* 11 #jedis的最大活躍連接數 12 jedis.pool.maxActive=100 13 #jedis最大空閑連接數 14 jedis.pool.maxIdle=50 15 #jedis池沒有連接對象返回時,等待可用連接的最大時間,單位毫秒,默認值為-1,表示永不超時。 16 #如果超過等待時間,則直接拋出JedisConnectionException 17 jedis.pool.maxWait=1500 18 #從池中獲取連接的時候,是否進行有效檢查 19 jedis.pool.testOnBorrow=true 20 #歸還連接的時候,是否進行有效檢查 21 jedis.pool.testOnReturn=true
書寫Redis連接池工具類RedisPoolUtil,網上有其他版本的方式,其實實現的本質都是一樣的
1 import java.util.Properties; 2 import redis.clients.jedis.Jedis; 3 import redis.clients.jedis.JedisPool; 4 import redis.clients.jedis.JedisPoolConfig; 5 6 /** 7 * Redis連接池工具類 8 */ 9 public class RedisPoolUtil { 10 private static JedisPool jedisPool = null; 11 private static String redisConfigFile = "redis.properties"; 12 //把redis連接對象放到本地線程中 13 private static ThreadLocal<Jedis> local=new ThreadLocal<Jedis>(); 14 15 //不允許通過new創建該類的實例 16 private RedisPoolUtil() { 17 } 18 19 /** 20 * 初始化Redis連接池 21 */ 22 public static void initialPool() { 23 try { 24 Properties props = new Properties(); 25 //加載連接池配置文件 26 props.load(RedisPoolUtil.class.getClassLoader().getResourceAsStream(redisConfigFile)); 27 // 創建jedis池配置實例 28 JedisPoolConfig config = new JedisPoolConfig(); 29 // 設置池配置項值 30 config.setMaxTotal(Integer.valueOf(props.getProperty("jedis.pool.maxActive"))); 31 config.setMaxIdle(Integer.valueOf(props.getProperty("jedis.pool.maxIdle"))); 32 config.setMaxWaitMillis(Long.valueOf(props.getProperty("jedis.pool.maxWait"))); 33 config.setTestOnBorrow(Boolean.valueOf(props.getProperty("jedis.pool.testOnBorrow"))); 34 config.setTestOnReturn(Boolean.valueOf(props.getProperty("jedis.pool.testOnReturn"))); 35 // 根據配置實例化jedis池 36 jedisPool = new JedisPool(config, props.getProperty("redis.ip"), 37 Integer.valueOf(props.getProperty("redis.port")), 38 Integer.valueOf(props.getProperty("redis.timeout")), 39 props.getProperty("redis.passWord")); 40 System.out.println("線程池被成功初始化"); 41 } catch (Exception e) { 42 e.printStackTrace(); 43 } 44 } 45 46 /** 47 * 獲得連接 48 * @return Jedis 49 */ 50 public static Jedis getConn() { 51 //Redis對象 52 Jedis jedis =local.get(); 53 if(jedis==null){ 54 if (jedisPool == null) { 55 initialPool(); 56 } 57 jedis = jedisPool.getResource(); 58 local.set(jedis); 59 } 60 return jedis; 61 } 62 63 //歸還連接 64 public static void closeConn(){ 65 //從本地線程中獲取 66 Jedis jedis =local.get(); 67 if(jedis!=null){ 68 jedis.close(); 69 } 70 local.set(null); 71 } 72 73 //關閉池 74 public static void closePool(){ 75 if(jedisPool!=null){ 76 jedisPool.close(); 77 } 78 } 79 }
最後Test方法測試使用上述方法即可。
註意::::可能會連接超時失敗,其實是防火墻的問題,到時候打開防火墻口,然後重啟防火墻就OK了。
四:Redis的持久化方式
為了能夠高速查詢,Redis將數據幾乎都在內存中,但缺點顯而易見,如何將Redis的數據持久化下來呢!官方提供了兩種方法:
1:RDB:在指定時間間隔內生成數據集的時間點快照,但要是在指定時間間隔沒到就斷電了,那就JJ了啊!
2:AOF:以日誌的方式記錄下每一步寫操作指令,並在服務器啟動時,通過執行這些命令來還原數據庫。但是體積比較大,速度慢。
3:一般將兩種聯合起來使用,其實一般在redis.conf中都已配置好,但是你想改也沒人攔得住你啊!
五:其他操作
1:Redis其實共可有16個數據庫,由0到15編號,默認選擇0號,用seclect關鍵字選擇
2:數據庫肯定少不了事務操作
開啟事務:multi
回滾:discard
提交:exec
復習整理7:Redis數據庫的基本應用