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即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/499123.html
標籤:NoSQL
上一篇:MongoDB 學習筆記
下一篇:Redis的Java客戶端
