1. 程式人生 > >Redis客戶端細解、持久化

Redis客戶端細解、持久化

Jedis基本用法:

    連線池建立-〉訪問密碼設定-〉連線超時等引數設定

詳看 cacheDemo的JedisUtils工具類

pom.xml引入以下依賴即可

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.9.0</version>
</dependency>

 1.jedis直接連線redis如下:

2,使用連線池方式

生產環境一般使用連線池進行操作,jedis連線redis物件放在連線池裡,每次用的時候去POOL借用,用完後歸還

序列化與反序列化

        指把結構化的物件變成無結構的位元組流,便於儲存、傳輸,保持一個類在傳遞資料的有序性,使接收到的資料更具有保證,而反序列化是利用類成員變數反射成為一個類

(即把物件序列化後存redis, 從redis取值後反序列化為JAVA物件)

   序列化的工具依賴包

<dependency>
    <groupId>com.dyuproject.protostuff</groupId>
    <artifactId>protostuff-runtime</artifactId>
    <version>1.1.3</version>
</dependency>
 <dependency>
     <groupId>com.dyuproject.protostuff</groupId>
     <artifactId>protostuff-core</artifactId>
     <version>1.1.3</version>
</dependency>

例項:見cache-demo的SerializerTest測試用例

Jedis中的pipeline使用方式

大家知道redis提供了mset、mget方法,但沒有提供mdel方法,

如果想實現,可以藉助pipeline實現,詳見cache-demo, 看JedisAllCommandTest用例testPipelineMdel方法

下面程式碼可將set和incr做一次pipiline操作,看JedisAllCommandTest用例testPipelineSyncAll方法

Jedis中的lua指令碼

6379>set name james

6379>eval "return redis.call('get',KEYS[1])" 1 name //1個鍵,鍵名為name,返回james

         可以看JedisAllCommandTest用例testLuaScript方法

如何執行lua檔案呢?

例子請看cache-demo的testLuaFile測試用例方法

 

redis持久化

redis支援RDB和AOF兩種持久化機制,持久化可以避免因程序退出而造成資料丟失;

 

RDB持久化

    把當前程序資料生成快照(.rdb)檔案儲存到硬碟的過程,有手動觸發和自動觸發

     手動觸發有save和bgsave兩命令

     save命令:阻塞當前Redis,直到RDB持久化過程完成為止,若記憶體例項比較大會造成長時間阻塞,線上環境不建議用它

    bgsave命令:redis程序執行fork操作建立子執行緒,由子執行緒完成持久化,阻塞時間很短(微秒級),是save的優化,在執行redis-cli shutdown關閉redis服務時,如果沒有開啟AOF持久化,自動執行bgsave;

      顯然bgsave是對save的優化

bgsave執行流程

RDB檔案的操作

   命令:config set dir /usr/local  //設定rdb檔案儲存路徑

   備份:bgsave  //將dump.rdb儲存到usr/local下

   恢復:將dump.rdb放到redis安裝目錄與redis.conf同級目錄,重啟redis即可

   優點:1,壓縮後的二進位制文,適用於備份、全量複製,用於災難恢復

             2,載入RDB恢復資料遠快於AOF方式

    缺點:1,無法做到實時持久化,每次都要建立子程序,頻繁操作成本過高

              2,儲存後的二進位制檔案,存在老版本不相容新版本rdb檔案的問題

 

AOF持久化

針對RDB不適合實時持久化,redis提供了AOF持久化方式來解決

      開啟:redis.conf設定:appendonly yes  (預設不開啟,為no)

      預設檔名:appendfilename "appendonly.aof"   

      流程說明:  1,所有的寫入命令(set hset)會append追加到aof_buf緩衝區中

                         2,AOF緩衝區向硬碟做sync同步

                         3,隨著AOF檔案越來越大,需定期對AOF檔案rewrite重寫,達到壓縮

                         4,當redis服務重啟,可load載入AOF檔案進行恢復

AOF持久化流程:命令寫入(append),檔案同步(sync),檔案重寫(rewrite),重啟載入(load)

redis的AOF配置詳解:

    appendonly yes     //啟用aof持久化方式

    # appendfsync always //每收到寫命令就立即強制寫入磁碟,最慢的,但是保證完全的持久化,不推薦使用

    appendfsync everysec //每秒強制寫入磁碟一次,效能和持久化方面做了折中,推薦

    # appendfsync no    //完全依賴os,效能最好,持久化沒保證(作業系統自身的同步)

    no-appendfsync-on-rewrite  yes  //正在匯出rdb快照的過程中,要不要停止同步aof

    auto-aof-rewrite-percentage 100  //aof檔案大小比起上次重寫時的大小,增長率100%時,重寫

    auto-aof-rewrite-min-size 64mb   //aof檔案,至少超過64M時,重寫

 

如何從AOF恢復?

1. 設定appendonly yes;

2. 將appendonly.aof放到dir引數指定的目錄;

3. 啟動Redis,Redis會自動載入appendonly.aof檔案。

 

redis重啟時恢復載入AOF與RDB順序及流程:

1,當AOF和RDB檔案同時存在時,優先載入

2,若關閉了AOF,載入RDB檔案

3,載入AOF/RDB成功,redis重啟成功

4,AOF/RDB存在錯誤,redis啟動失敗並列印錯誤資訊