1. 程式人生 > >復習整理7:Redis數據庫的基本應用

復習整理7:Redis數據庫的基本應用

com 分布式 集合類 pom con 計算 分布 註意 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數據庫的基本應用