SQL vs NoSQL
-
結構化
- SQL 是結構化的,一旦定義了表結構,以後在維護資料的時候必須嚴格遵守定義的結構。
- NoSQL 是非結構化的,常見的形式有 Redis 的 Key-Value 儲存形式、Document 文件型儲存形式、Graph 圖型別儲存形式
-
關聯的
-
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 } } ] }
-
-
SQL查詢
- SQL 的查詢有自己的語法,格式固定,語法固定,相容性起強
- NoSQL 的查詢語句不同意,沒有固定的形式
-
事務
- 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即可