領略NoSQL的魅力—-Hello,Redis!

james發表於2017-12-07

什麼是NoSQL?為什麼要用NoSQL?

指web1.0時代以來,我們一直在使用關係型資料庫,例如比較流行的關係型資料庫有MySQL,SQL SERVER Oracle,但隨著Web2.0時代的到來,隨之而來的便是產生的海量資料以及高併發的資料庫操作,這些事情所帶來的是極大增大了資料庫伺服器及其相關伺服器的負載能力,例如雙“11.11”時期,其資料庫操作可達千萬級每秒,支付寶每分處理的事務以億計算。為了解決以上問題,非關係型資料庫即NoSQL便應運而生,市面上常見的NOSQL有Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB,Cassandra, HBase, Riak等。
以下是集中常見NoSQL產品效能比較:
![圖片描述][1]

Redis簡介

Redis是一個遠端記憶體資料庫,它不僅效能強勁,而且還具有複製特性以及為解決問題而生的獨一無二的資料模型。Redis提供了5種不同型別的資料結構,各式各樣的問題都可以很自然地對映到這些資料結構上:Redis的資料結構致力於幫助使用者解決問題,而不會像其他資料庫那樣,要求使用者扭曲問題來適應資料庫。除此之外,通過複製、持久化(persistence)和客戶端分片(client-side sharding)等特性,使用者可以很方便地將Redis擴充套件成一個能夠包含數百GB資料、每秒處理上百萬次請求的系統。

Redis安裝

一、Redis的下載地址
Redis官方並沒有提供Redis的windows安裝包,但在github上, 有相關的下載地址,如下:
https://github.com/ServiceSta…
也可以到我的百度網盤下載,下載地址:http://pan.baidu.com/s/1gf2nuin,我下載的版本是redis-64.3.0.503.zip(64位的win系統,redis
3.0版本)。

二、Redis的安裝和配置

找到下載的壓縮包 redis-64.3.0.503.zip,解壓後,重新命名為redis-3.0,置於某個資料夾下(如D:Program Files)。

  1. 執行Redis伺服器端

直接雙擊D:Program Filesredis-3.0目錄下的redis-server.exe檔案(redis伺服器端),就會以視窗的形式執行Redis伺服器(但該視窗不可關閉,否則,Redis服務不可用)。此種執行redis伺服器的方式,沒有載入指定的配置檔案。如果出現如下介面

  1. 執行Redis客戶端

直接雙擊D:Program Filesredis-3.0目錄下的redis-cli.exe檔案(redis客戶端),如果顯示127.0.0.1:6379> ,就說明客戶端執行成功。
輸入命令: keys *
檢視所有的鍵
如果提示“NOAUTH Authentication required.”,則說明Redis伺服器設定了密碼,請輸入正確的密碼後,再來進行其他操作。
輸入命令: auth 密碼
如果提示OK,就說明密碼正確。
Tips:可以將D:Program Filesredis-3.0目錄下的redis-server.exe傳送到桌面快捷方式,便於以後快速開啟Redis客戶端。

  1. 將Redis服務安裝到本地服務

由於上述啟動Redis伺服器的方式有點複雜,且redis服務視窗不可關閉。故這裡介紹如何將Redis服務安裝到Windows系統的本地服務。
複製D:Program Filesredis-3.0目錄下的redis.windows.conf檔案,重新命名為redis.conf,來作為redis的配置檔案。
開啟win系統的命令列,依次輸入下列命令:

d: (回車,切換到d盤)

cd Program Filesredis-3.0 (回車,切換至D:Program Filesredis-3.0目錄)

redis-server –service-install redis.conf –loglevel verbose (回車,安裝redis本地服務,指定配置檔案redis.conf)

操作完成後,就可以到win系統的本地服務管理處,檢視和操作Redis服務。(計算機圖示右鍵 -> 管理) -> 服務和應用程式 -> 服務)

  1. 設定Redis密碼

編輯D:Program Filesredis-3.0目錄下的redis.conf配置檔案,找到如下程式碼:

requirepass foobared

將其複製一行,去掉前導的#註釋符,將foobared改為你要設定的密碼,如:
requirepass test
儲存退出。
重啟Redis服務,配置檔案就會生效。

  1. 如何解除安裝Redis本地服務

開啟win系統命令列,依次輸入下列命令:
d:
cd Program Filesredis-3.0
redis-server –service-uninstall
就可將Redis本地服務解除安裝。

  1. 安裝Redis Desktop Manager

Redis Desktop Manager是一個視覺化的Redis資料庫管理工具,使用非常簡單,這裡不做介紹。
下載地址:http://pan.baidu.com/s/1i44AXal
這裡提供Redis安裝包以及Redis客戶端的工具安裝包下載連結:
Redis安裝包下載:連結:https://pan.baidu.com/s/1o779TBO 密碼:n8mw
Redis客戶端的工具安裝包下載:連結:https://pan.baidu.com/s/1hsD2mX2 密碼:40nd

Jdies的相關知識

接下來我將以一段程式碼的形式來介紹有關於Jedis的相關操作:

public class JedisDemo1 {
    /**
     * Jedis例項
     */
    @Test
    public void demo1()
    {
        //1.設定IP地址和埠
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //2.儲存資料
        jedis.set("name", "james");
        //3.獲取資料
        String value = jedis.get("name");
        System.out.println(value);
        //4.釋放資源
        jedis.close();
    }
    
    /**
     * 使用連線池的方式來操縱Jedis
     */
    @Test
    public void demo2()
    {
        //活動連結池的配置物件
        JedisPoolConfig config = new JedisPoolConfig();
        //設定最大的連線數
        config.setMaxTotal(30);
        //設定最大的空閒連線數
        config.setMaxIdle(10);
        
        
        //獲取連線池
        JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379);
        
        //獲取核心物件Jedis
        Jedis jedis = new Jedis();            
        try {
            //通過連線池獲得連線
            jedis = jedisPool.getResource();
            //設定資料
            jedis.set("name", "張三");
            jedis.set("age", "25");
            String name = jedis.get("name");
            System.out.println(name);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            //釋放資源
            if(jedis!=null){
                jedis.close();
            }
            if(jedisPool!=null){
                jedis.close();
            }
        }
    }
}

該專案原始碼下載:連結:https://pan.baidu.com/s/1c2nlSkw 密碼:1iym

Redis的5中資料結構

  1. string
    使用string時,redis大多數情況下並不會理解或者解析其含義,無論使用json、xml還是純文字在redis看來都是一樣的,只是一個字串,只能進行strlen、append等對字串通用的操作,無法針對其內容進一步操作。其基本操作命令有set、get、strlen、getrange、append:

    SET key value
    GET key
    STRLEN key
    GETRANGE key start end
    APPEND key value

  2. Hash
    使用hash時,在我看來,就是value本身就是一組key-value對,不過redis將這裡的key稱為field(但是hkeys命令為什麼不叫hfields命令呢哈哈),也就是value是一組field-value對。其基本操作命令有hset、hget、

    hmset、hmget、hgetall、hkeys和hdel:
    HSET key field value
    HGET key field
    HMSET key field value [field value …]
    HMGET key field [field …]
    HGETALL key
    HKEYS key
    HDEL key field [field …]

  3. List

    使用list時,value就是一個string陣列,操作這組string時,可以像對待棧一樣使用pop和push操作,但是這個棧兩端都能進行操作;也可以像對待陣列一樣使用一個index引數來操作。list的操作命令略雜,主要分為兩類:L開頭的和R開頭的,L代表LEFT或者LIST,進行一些從列表左端進行的操作,或者一些與端無關的操作;R代表RIGHT,進行一些從列表右端進行的操作。
    
    
  4. Set

set用於儲存一組不重複的值,也可以進行一些集合的操作,就像數學上的集合,它是無序的。基本操作有sadd和

sismember:
SADD key member [member ...]
SISMEMBER key member

  1. Sorted Set

sorted set類似set,但是sorted set裡每個元素都有一個score,這個score可用於排序和排名。基本操作有

zadd、zcount、zrank:
ZADD key score member [score member ...]
ZCOUNT key min max
ZRANK key member

Redis的持久化

redis提供了不同幅度的持久化選項:

  • RDB持久化對你的資料集基於特定的時間間隔執行時間點快照。
  • AOF持久化在每次伺服器收到寫操作時記入日誌,當伺服器重啟時,這些寫操作會再次執行,重構出原始的資料集。
  • 命令以只能追加的方式記入日誌,記入的格式與redis協議本身相同。當日志太大時,redis會重寫日誌。
  • 如果你想讓你的資料只在伺服器執行的時候存在,可以按照你的要求完全關閉持久化功能。
  • 可以在同一個例項中結合使用AOF和RDB。注意,在這種情況下,redis重啟時使用AOF檔案重構原始資料集,因為這樣得到的資料集更完整。

最重要的事情就是理解RDB持久化和AOF持久化之間的差別與權衡。先從RDB開始:

RDB

RDB的優點:

RDB是壓縮的單個檔案,表示你的某一時刻的redis資料。RDB檔案非常適合備份。假如你把最近24小時中每個小時的RDB檔案存檔,並把最近30天每天儲存一個RDB快照。這樣遇到資料災難時你就能容易地恢復各種版本的資料集了。

  • RDB適用於災難恢復,作為一個單個的緊湊的檔案,能夠傳輸到遠端的資料中心,或傳到亞馬遜S3(最好加密)。
  • RDB把redis的效能最大化。因為對於redis父程式,如果要執行持久化,唯一要做的就是建立一個子程式,而子程式會做所有的事情。父程式不需要執行磁碟I/O或者其它類似操作。
  • 對於資料集較大的情況,相較於AOF,RDB使得重啟更快。

RDB的缺點:

  • 在Redis停止工作的情況(例如斷電)下,如果你想要使資料丟失的可能性最小,RDB並不合適。你可以設定不同的儲存點,在儲存點上會生成RDB(例如至少5分鐘且100次對資料集的寫操作以後。你也可以設定多個儲存點)。然而,你通常會設定成每5分鐘或更長時間生成一個RDB快照。在這種情況下,如果redis因為什麼原因沒有經過正常關機而停止工作,你會丟失最後幾分鐘的資料。
  • RDB需要經過fork()通過子程式寫磁碟。如果資料集很大,fork()是非常耗時的,可能導致redis在幾毫秒甚至1秒的時間裡停止向客戶端提供服務且CPU效能也不好。AOF也需要fork(),但你可以調節重新日誌的頻率而不需要任何犧牲。

AOF

AOF的優點:

  • AOF更加可靠:你可以有不同的檔案同步策略:沒有檔案同步,每秒同步,每次請求時同步。預設為每秒同步,寫效能也不錯(檔案同步使用一個後臺執行緒,當沒有進行檔案同步時,主執行緒會執行寫操作),你只會丟失1秒內的寫資料。
  • AOF的日誌只能追加,因此也沒有搜尋操作,斷電時也不會有丟失問題。即使由於某種原因(磁碟滿或其它原因)導致最後一條命令只記錄了一半,redis-check-aof工具也能很容易的修復它。

當AOF檔案太大時,redis能夠在後臺自動重寫AOF。重寫是完全安全的。因為當redis繼續向舊檔案追加內容時,產生的新檔案包含能夠產生當前資料集的所需要的最小命令集。一但新檔案準備好了,redis就會切換到第二個檔案,向這個新檔案追加內容。

  • AOF使用一種方便理解和分析的格式,一條一條地記錄所有操作的日誌。你可以很容易地匯入一個AOF檔案。即使你由於錯誤地使用FLUSHALL命令沖掉了所有命令,如果在此期間沒有沒有重寫日誌,你仍然可以恢復資料,只需要停止伺服器、移除最後一條命令,然後重啟伺服器就可以了。

AOF的缺點

  • 相較於相同資料集同等情況下的RDB檔案來說,AOF檔案通過很大。

由於精確同步策略,AOF比RDB慢。通常情況下,每秒檔案同步的效能仍然很好,而無檔案同步的AOF和RDB的速度一樣快,即使是在高負載的情況下。然而,對於大量的潛在問題,RDB還能提供更多的保障,即使是大規模的寫。

  • 以前,我們對某些特殊的命令(例如一個涉及到阻塞的命令,BRPOPLPUSH)測出的bug很少,導致生成的AOF檔案不能在重新載入時生成完全一樣的資料集。這個bug不常見。我們在測試時自動建立隨意的複雜的資料集並重新載入它們,檢查是否一切正常。但這種問題在RDB持久中幾乎不存在。更清楚地講:Redis的AOF的工作原理是更新一個已經存在的狀態,類似MySQL和MongoDB的作法,而RDB一次又一次地生成快照,這從理論上更健壯。然而,(1)注意,每次redis重寫AOF時,它是從資料集中實際的資料開始,相對於一味向AOF追加(或重寫時讀取舊的AOF而不是記憶體中的資料)來說,這使它更強壯【1】。(2)我們至今沒有發現一個來自使用者的在真實使用中檢測出AOF丟失資料的報告。

以上是對Redis的一個基本介紹以及一些基本的使用說明。相信你在使用Redis後一定會對它愛不釋手的。

相關文章