redis的高級應用之一(Redis安全性\主從複製\事務處理)

redis的高級應用。

    (1).redis 的安全性:設置客戶端連接之後,進行任何其他指令之前都需要使用的密碼。

    【warn】:由於redis數據非常快,在一臺非常好的服務器下,一個用戶可以在1s進行150K次密碼嘗試;所以需要指定非常強大的密碼來防止暴力破解。

    設置密碼: 在redis.conf文件下#requirepass foobared 下requirepass 自己設置的密碼,設置完了之後要重啓服務。 linux下 vi 編輯conf文件。

    設置好了之後,pkill 掉redis-server 服務,重啓redis服務(redis/bin/redis-server redis/etc/redis.conf);

    登陸客戶端(client)之後,你會發現你的操作無法進行;有個操作被限制的錯誤

    redis 127.0.0.1:6379> keys *
    (error) ERR operation not permitted
    redis 127.0.0.1:6379> set dj avicii
    (error) ERR operation not permitted

    這說明我們沒有權限操作,需要我們授權。 方式一:auth 密碼口令

    redis 127.0.0.1:6379> auth zeng
    OK
    redis 127.0.0.1:6379> keys *
     1) "key2"
     2) "mimi"
     3) "mama"
     4) "age"
     5) "test"
     6) "name"
     7) "myset"
     8) "zeng"
     9) "email"
    10) "key"
    11) "key10"
    12) "key1"
    redis 127.0.0.1:6379> set dj avicii
    OK
    redis 127.0.0.1:6379> get dj
    "avicii"

     方式二,不想每次進來之後 操作的時候就授權,可以在登陸客戶端的時候 後面就跟上授權密碼 : redis-cli -a 密碼口令

    (2)reids 的主從複製☆☆☆

        Redis 的主從複製配置和使用都比較簡單,通過主從複製可以允許多個slave server(從服務器)擁有和master server(主)相同的數據庫副本。

        ①Redis主從複製特點:

        1.一個master可以擁有多個slave;

        2.多個slave 除了可以連接master之外,還可以連接其他的slave。

        3.主從複製不會阻塞master,在同步數據時,master服務器可以繼續接受和處理client的請求操作

        4.提高系統的伸縮性

        ②Redis主從複製的過程:

        1.slave與master建立連接,並且發送sync同步請求;

        2.master會啓動一個後臺進程,將數據庫快照保存到文件中;同時master主進程會開始客戶端client新的讀寫命令並緩存;(兩個進程互不影響)

        3.後臺保存完成後,將此文件發送給slave

        4.slave將文件保存到硬盤

        ③配置主從服務器

        1.找到slave的redis.conf 文件 ,找到# slaveof <masterip> <masterport>  下配置slaveof 主機ip 端口(6379),

        2.找到# masterauth <master-password> ,配置主機的授權masterauth 主機密碼

        【注】:如何區分那個主從機服務器, 在客戶端使用命令:info 主機的話  可以看到role:master  和連接上去的slave 的ip和端口 是主機

        role 爲 slave 的爲從機。

        ④設置成功之後,在主機set 一個key; 然後再 在slave 中keys *, 發現也能在數據庫找到這個key ;這樣就完成主從複製

    (3)redis的事務處理

    ①.redis目前還是支持比較簡單的事務處理,redis只能保證一個client發起的事務中的命令連續執行,而中間不會插入其他client的命令.

    一個client在一個連接中發起multi命令,這個鏈接會進入事務的上下文,該鏈接後續的命令不會被立即執行而是先放到一個隊列中,當執行exec命令後,redis會順序執行隊列中的命令。

    如果不行執行這個事務的話,可以用discard命令取消事物;隊列中的命令會被取消,事務回滾掉。

    demo

    redis 127.0.0.1:6379> get age
    "20"
    redis 127.0.0.1:6379> multi        【進入事務上下文】
    OK
    redis 127.0.0.1:6379> set age 100    【進入一個隊列】
    QUEUED
    redis 127.0.0.1:6379> set age 50
    QUEUED
    redis 127.0.0.1:6379> exec        【exec 後 依次執行命令】
    1) OK
    2) OK
    redis 127.0.0.1:6379> get age
    "50"

    redis 127.0.0.1:6379> multi
    OK
    redis 127.0.0.1:6379> set age 30
    QUEUED
    redis 127.0.0.1:6379> discard    【取消事務】
    OK
    redis 127.0.0.1:6379> get age    【事務沒有被執行】
    "50"

    redis 爲什麼只支持簡單事務呢,可以看下面一個demo:

    demo2

redis 127.0.0.1:6379> get name        
"leonardo.com"
redis 127.0.0.1:6379> incr name            【對一個字符串自加 是會報錯的】
(error) ERR value is not an integer or out of range
redis 127.0.0.1:6379> multi                   【進入一個事務】
OK
redis 127.0.0.1:6379> incr age        
QUEUED
redis 127.0.0.1:6379> incr name            【把自加這個命令放到隊列中】
QUEUED
redis 127.0.0.1:6379> exec             1) (integer) 51
2) (error) ERR value is not an integer or out of range

redis 127.0.0.1:6379> get age             【這個demo中exec之後,發現命令還是會被執行,第一條自加age命令被執行成功,而且不像我們關係型數據庫中整個事物該被回滾;這個就redis事務的欠妥的方面了】
"51"

    ②.redis 樂觀鎖的複雜事物實現:

    (1).首先介紹什麼事樂觀鎖和悲觀鎖?

       樂觀鎖,大多是基於數據版本( Version )記錄機制實現。何謂數據版本?即爲數據增加一個版本標識,在基於數據庫表的版本解決方案中,一般是通過爲數據庫表增加一個 “version” 字段來實現。讀取出數據時,將此版本號一同讀出,之後更新時,對此Version+1。此時,將提交數據的版本數據與數據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大於數據庫表當前版本號,則予以更新,否則認爲是過期數據。

        悲觀鎖,正如其名,具有強烈的獨佔和排他特性。它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處於鎖定狀態。

    (2).Redis樂觀鎖實例:對於一個key爲name,我們開2個session對這個key進行賦值 ;看這個demo:

        第一步: session1中: 對這個key 進行監聽,並進入事務上下文

        redis 127.0.0.1:6379> get name
        "leonardo.com"
        redis 127.0.0.1:6379> watch name        [注]:對key爲name的鍵進行監聽,
        OK
        redis 127.0.0.1:6379> multi                    [注]:進入事務上下文
        OK
        redis 127.0.0.1:6379> set name leo-zeng    【注】:set該key,並提交到事務隊列中
        QUEUED

        第二步: 在session2 中: 在另外一個session中,直接對name的key進行賦值,

         redis 127.0.0.1:6379> set name alex-zeng
        OK
        redis 127.0.0.1:6379> get name
        "alex-zeng"
        redis 127.0.0.1:6379>

        第三步:返回到session1 中,進行exec 操作,發現會返回個null ,發現該事務執行不成功。可以說明我們在另外一個session中已經對該監控的key進行了一個修改並提交到服務器中,我們在另外一個會話中對這個事務處理到一半的可以提交事務就會不成功。這個就是樂觀鎖的redis實例了。

        redis 127.0.0.1:6379> exec
        (nil)
        redis 127.0.0.1:6379> get name
        "alex-zeng"
        redis 127.0.0.1:6379>

        結論:watch命令會監視給定的key,當exec的時候如果該key在watch後發生過變化的話,則整個事物就會失敗;也可以調用watch對多個key進行監視,這樣就可以對多個key加樂觀鎖了。注意watch指定的key只對整個連接有效的,事務也是如此;若連接斷開,監視會自動刪除。

發佈了25 篇原創文章 · 獲贊 20 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章