redis - 學習筆記回顧

b9x_發表於2018-04-23
  1. 什麼是redis (C)
    reids是一個nosql資料庫,中文:非關係型資料庫
    nosql(not noly sql):不僅僅只有資料庫
    關係型資料庫:以二維表形式儲存資料
    非關係型資料庫:以鍵值對(key,value)儲存資料

    redis是將資料存放到記憶體中,由於記憶體存取速度快,所以redis被廣泛應用於網際網路專案中,
    redis優點:存取速度快,操作具有原子性(保證高併發)
    缺點:對持久化支援不夠良好
    所以redis一般不作為資料的主資料庫儲存,一般配合傳統的關係型資料庫使用。

  2. redis應用領域
    分散式鎖
    分散式快取
    分散式session session共享(不存伺服器端了,直接取出來存到redis中,每回讀取)
    儲存部落格或者論壇的留言回覆等
    總之是用在資料量大,併發性高的情況下
    //分散式:一個業務分拆多個子業務,部署在不同的伺服器上
    叢集:同一個業務,部署在多個伺服器上

  3. linux配置VMnet8. SecureCRT執行命令下載C++編譯器。將redis壓縮包上傳到lunix。解壓,編譯。執行服務端,改conf改成後端執行,執行客戶端存取,關閉客戶端
    啟動:/usr/local/redis/bin 下執行./redis-server & (後臺執行)

  4. 怎麼用
    redis主要就是使用命令來進行操作,java端在程式碼中可以使用Jedis來操作redis伺服器
    redis資料型別:

    • 字串String:
      set get del incr(數值+1) incrby(數值+指定值) decr(減) decrby
      應用:商品編號,訂單號採用string的遞增數字特性生成
    • 列表list:
      redis中使用的是雙向迴圈連結串列來實現的,很像棧,可從左或右新增
      LPUSH key value… RPUSH key value… 從左或從右新增(像棧)
      LRANG key start stop(按索引從start檢視到stop,stop=-1時代表最後一個素)
      LPOP key… RPOP key…. 從左或從右彈出元素
      LLEN key 獲取列表中元素的個數
      應用:商品評論列表,評論資訊。
    • 雜湊hash:
      一個物件可以又多個string欄位
      HSET key field value…. 設定欄位且賦值(可以多個直接跟著寫)
      HGET key field 取欄位值(可以多個,同上)
      HGETALL key 取欄位及欄位值
      HDEL key filed 刪除欄位
      應用:一般應用於將redis作為分散式緩衝時,儲存資料庫中的資料物件
    • 集合set:
      set中資料是無序且不重複的(hash表實現的應該)
      SADD key member… 增加元素,可以多個
      SREM key member… 刪除元素,可以多個
      SMEMBERS key 獲取key這個set的所有元素
      SISMEMBERS key member 判斷元素是否在這個set中.返回1在0不在
      SDIFF key1 key2 集合1和2做差集運算
      SINTER key1 key2 交集運算
      SUNION key1 key2 並集運算
      應用:共同好友,共同粉絲等(交集)
    • 有序集合zset:
      redis會根據score(自己新增的數值吧)排序。可以用在成績,銷量等需要排序的資料上
      ZADD key score member …. 新增元素分數及元素
      ZSCORE key member 獲取元素的分數
      ZREM key member… 刪除元素
      ZRANGE key start stop [withscores] 獲取某個範圍內的元素排名,加withscores就是把分數也獲取了,不影響排名,排名已經排好了
      ZREVRANG key start stop [withscores] 從大到小排
    • Java自定義物件:
      1.雜湊hash ?
      2.利用Jedis+序列化工具,將value(物件)序列化為二進位制陣列,儲存到redis中,提取時再反序列化。
      利用序列化這樣存取更快,並且記憶體空間佔用極少。
  5. redis高階特性:
    redis的單個command都是原子性的,原因是大部分情況下(不考慮redis 3.x版本的某些情況下使用了多執行緒),redis是單程式單執行緒的,客戶端的命令請求會被排隊加入到一個內部queue中,redis會按順序執行它們並返回。因此多個客戶端併發請求也是沒問題的。
    // redis的實現類似與node佇列。

    • expire 設計鍵的生存時間,到期後自動刪除
      expire key second(秒)
      ttl 檢視鍵的剩餘生存時間
      persist 取消生存時間
      應用場景: 限時的優惠活動資訊 網站資料快取(對於一些需要定時更新的資料,例如:積分排行榜) 手機驗證碼 限制網站訪客訪問頻率

    • SETNX:設定一個key,不存在就設定,並且返回1,存在就不設定什麼也不做。

    • delete :刪除 key
    • SETNX,expire,delete一起配合使用,實現分散式鎖。SETNX通過設定key獲取鎖,expire設定鎖的自動過期時間(防止鎖釋放失敗,避免死鎖),delete釋放鎖
    • redis事務控制(不提供回滾,可結合watch使用)
      redis事務是基於先進先出佇列實現的,multi之後的命令放入佇列中,exec後佇列中的命令一次執行。
      它不滿足原子性(會部分不執行)、永續性(因為redis是在記憶體中、即使開啟AOF,也存在命令執行一部分後,系統當機而導致資料丟失的情況,不能恢復)、一致性(狀態轉移一半當機了)。因為redis是單執行緒的,事務也是序列執行,所以滿足隔離性。
      multi 事務開始
      exec 事物結束
      discard 放棄事物
      1:語法錯誤:致命的錯誤,事務中的所有命令都不會執行,即插入到佇列時出錯,佇列所有的命令就都不執行了。
      2:執行錯誤:不會影響事務中其他命令的執行,即插入佇列都成功,但從佇列出來執行時出錯,其他命令還會執行。
    • watch:命令可以監控一個或多個鍵,一旦其中有一個鍵被修改(或刪除),之後的事務就不會執行,監控一直持續到EXEC命令
      (事務中的命令是在EXEC之後才執行的,EXEC命令執行完之後被監控的鍵會自動被UNWATCH)
    • pipeline 管道
      redis的pipeline(管道)功能在命令列中沒有,但是redis是支援管道的,在java的客戶端(jedis)中是可以使用的。
      在插入更多資料的時候,管道的優勢更加明顯,插入資料更快。
      Pipeline pipelined = jedis.pipelined();
      for (int i = 0; i < 1000; i++) {
      pipelined.set(“bb” + i, i + “bb”);
      }
      pipelined.sync();
  6. redis持久化方案:(DBA做的事)
    rdb: 可以設定經過多長時間儲存到硬碟一次。(redis預設的持久化方案)通過快照完成的
    就是一段時間儲存到硬碟一次。
    優點:讓redis的資料存取速度保持快(硬碟存取慢)
    缺點:伺服器斷電時會丟失部分資料(沒到儲存時間的就丟失了),資料的完整性得不到保證。
    aof:實時儲存。
    可以通過設定redis.conf 設定實時儲存。
    有點:持久化良好,保證資料完整性。
    缺點:大大降低了redis 系統的存取速度,效能就沒那麼好了(和關係型資料庫不就一樣了)

主從複製
這裡寫圖片描述
從redis伺服器用來做備份,實時向主redis傳送命名,詢問其是否出錯,如果得不到迴應其就暫時代替主redis,但它只能做讀取操作,不能做增刪改,要保證主從資料的一致性。從的資料來源:
設定好之後
主傳送RDB檔案給從
從將檔案儲存到磁碟上,然後載入到記憶體恢復
新生成的資料時主把快取的命令轉發給從,從進行操作(這樣傳送資料量比直接發資料小)。
所以從上位不時不能做增刪改,只能讀取。主好了之後還是主。

相關文章