Redis概述及基本資料結構

2022-05-30 18:00:43

SQL vs NoSQL

  1. 結構化

    • SQL 是結構化的,一旦定義了表結構,以後在維護資料的時候必須嚴格遵守定義的結構。
    • NoSQL 是非結構化的,常見的形式有 Redis 的 Key-Value 儲存形式、Document 檔案型儲存形式、Graph 圖型別儲存形式
  2. 關聯的

    • SQL 資料庫可以通過如外來鍵的方式去維護資料與資料之間的關聯

    • NoSQL 是非關係型的,如果想要維護資料與資料之間的關係,通常通過 json 格式的資料進行維護

      例如:

      {
          id: 1,
          name: "張三",
          orders: [
              {
                  id: 1,
                  item: {
                      id: 10,
                      title: "榮耀6",
                      price: 4999
                  }
              },
              {
                  id: 2,
                  item: {
                      id: 20,
                      title: "小米11",
                      price: 3999
                  }
              }
          ]
      }
      
  3. SQL查詢

    • SQL 的查詢有自己的語法,格式固定,語法固定,相容性起強
    • NoSQL 的查詢語句不同意,沒有固定的形式
  4. 事務

    • SQL 的所有資料庫都是可以實現 ACID 的
    • NoSQL 資料庫要麼沒有事務,要麼只能滿足事務最基本的一些一致性

認識 Redis

Redis 是一個基於記憶體的鍵值型 NoSQL 資料庫

特徵:

  • 鍵值型:value 支援多種不同資料型別,功能豐富
  • 單執行緒:每個命令具備原子性
  • 延遲低、速度快:基於記憶體、IO多路複用、良好的編碼
  • 支援資料持久化
  • 支援主從叢集、分片叢集
  • 支援多語言使用者端:Java、C等等

Redis 資料結構

Redis是一個 key-value 的資料庫,key 一般是 String 型別,不過 value 的型別多種多樣:

名稱 範例
String hello world
Hash {name: 「Jack」, age: 21}
List [A -> B -> C]
Set {A,B,C}
SortedSet {A: 1, B: 2, C: 3}

[問題]:Redis 沒有類似 MySql 中的 Table 的概念,要怎麼區分不同型別的 key 呢?

[解決方法]:Redis 的 key 支援有多個單詞形成層次結構,多個單詞之間用「 :」隔開。例如 myproduct:user:1 myproduct:product:1

KEY VALUE
myproduct:user:1 {"id": 1, "name": "Jack", "age": 21}
myproduct:product:1 {"id": 1,"name": "小米11", "price": 4999}

Redis 通用命令

  • KEYS:檢視符合模板的所有 key。不建議在生產環境上使用
  • DEL:刪除一個指定的 key
  • EXISTS:判斷 key 是否存在
  • EXPIRE:給一個 key 設定有效期,有效期到期時該 key 會被自動刪除
  • TTL:檢視一個 key 剩餘的有效期

String 型別

String 型別介紹

String 型別是 Redis 中最簡單的儲存型別,其 value 是字串。不過根據字串格式不同,又具體分為三類:

  • string:普通字串
  • int:整數型別,可以做自增自減操作
  • float:浮點型別,可以做自增自減操作

String 型別常見命令

  • SET:新增或者修改已經存在的一個String型別的鍵值對
  • GET:根據key獲取String型別的value
  • MSET:批次新增多個String型別的鍵值對
  • MGET:根據多個key獲取多個String型別的value
  • INCR:讓一個整型的key自增1
  • INCRBY:讓一個整型的key自增並指定步長,例如:incrby num 2 讓num值自增2
  • INCRBYFLOAT:讓一個浮點型別的數位自增並指定步長
  • SETNX:新增一個String型別的鍵值對,前提是這個key不存在,否則不執行
  • SETEX:新增一個String型別的鍵值對,並且指定有效期

Hash 型別

Hash 型別介紹

Hash 型別,也叫雜湊,其 value 是一個無序字典,類似於 Java 中的 HashMap 結構。Hash 結構可以將物件中的每個欄位獨立儲存,可以針對單個欄位做 CRUD。

Hash 型別常用命令

  • HSET key field value:新增或者修改hash型別key的field的值
  • HGET key field:獲取一個hash型別key的field的值
  • HMSET:批次新增多個hash型別key的field的值
  • HMGET:批次獲取多個hash型別key的field的值
  • HGETALL:獲取一個hash型別的key中的所有的field和value
  • HKEYS:獲取一個hash型別的key中的所有的field
  • HVALS:獲取一個hash型別的key中的所有的value
  • HINCRBY:讓一個hash型別key的欄位值自增並指定步長
  • HSETNX:新增一個hash型別的key的field值,前提是這個field不存在,否則不執行

List 型別

List 型別介紹

Redis 中的 List 型別與 Java 中的 LinkedList 類似,可以看做是一個雙向連結串列結構。既可以支援正向檢索和也可以支援反向檢索。其特徵也與 LinkedList 類似。

List 型別常用命令

  • LPUSH key element ... :向列表左側插入一個或多個元素
  • LPOP key:移除並返回列表左側的第一個元素,沒有則返回nil
  • RPUSH key element ... :向列表右側插入一個或多個元素
  • RPOP key:移除並返回列表右側的第一個元素
  • LRANGE key star end:返回一段角標範圍內的所有元素
  • BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil

Set 型別

Set 型別介紹

Redis的Set結構與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特徵。

Set 型別常用命令

  • SADD key member ... :向set中新增一個或多個元素
  • SREM key member ... : 移除set中的指定元素
  • SCARD key: 返回set中元素的個數
  • SISMEMBER key member:判斷一個元素是否存在於set中
  • SMEMBERS:獲取set中的所有元素
  • SINTER key1 key2 ... :求key1與key2的交集
  • SDIFF key1 key2 ... :求key1與key2的差集
  • SUNION key1 key2 ..:求key1和key2的並集

SortedSet 型別

SortedSet 型別介紹

Redis的SortedSet是一個可排序的set集合,與Java中的TreeSet有些類似,但底層資料結構卻差別很大。SortedSet中的每一個元素都帶有一個score屬性,可以基於score屬性對元素排序,底層的實現是一個跳錶(SkipList)加 hash表。

其具備以下特徵:

  • 可排序
  • 元素不重複
  • 查詢速度快

因為SortedSet的可排序特性,經常被用來實現排行榜這樣的功能。

SortedSet 型別常用命令

  • ZADD key score member:新增一個或多個元素到sorted set ,如果已經存在則更新其score值
  • ZREM key member:刪除sorted set中的一個指定元素
  • ZSCORE key member : 獲取sorted set中的指定元素的score值
  • ZRANK key member:獲取sorted set 中的指定元素的排名
  • ZCARD key:獲取sorted set中的元素個數
  • ZCOUNT key min max:統計score值在給定範圍內的所有元素的個數
  • ZINCRBY key increment member:讓sorted set中的指定元素自增,步長為指定的increment值
  • ZRANGE key min max:按照score排序後,獲取指定排名範圍內的元素
  • ZRANGEBYSCORE key min max:按照score排序後,獲取指定score範圍內的元素
  • ZDIFF、ZINTER、ZUNION:求差集、交集、並集

注意:所有的排名預設都是升序,如果要降序則在命令的Z後面新增REV即可