NoSQL 1. 定義 NoSQL(Not Only SQL)即不僅僅是 SQL,泛指非關係型的資料庫 2. 為什麼使用 NoSQL? 傳統關係資料庫在應付動態網站、特別是超大規模和高併發的純動態網站已經顯得力不從心了,如商品網站中對商品數據的頻繁查詢、熱搜商品的排行統計、訂單超時問題。雖然能實現功 ...
NoSQL
1. 定義
NoSQL(Not Only SQL)即不僅僅是 SQL,泛指非關係型的資料庫
2. 為什麼使用 NoSQL?
傳統關係資料庫在應付動態網站、特別是超大規模和高併發的純動態網站已經顯得力不從心了,如商品網站中對商品數據的頻繁查詢、熱搜商品的排行統計、訂單超時問題。雖然能實現功能,但性能不樂觀,而且實現異常複雜,nosql 的出現更好地解決了這些問題
3. 分類
鍵值存儲資料庫:
- 說明:主要使用哈希表,這個表有一個特定的鍵和一個指針指向特定的數據
- 特點:簡單易部署,海量數據下對其中部分值進行查詢或更新時,效率低下
- 相關產品:Redis、SSDB
列存儲資料庫:
- 說明:通常用來應付分散式存儲的海量數據
- 特點:鍵依然存在,但一個鍵指向多個列,由路由鍵決定實際指向哪一個列
- 相關產品:HBase
文檔型資料庫:
- 說明:同第一種鍵值存儲類似,該類型的數據模型是版本化的文檔,以特定格式存儲,比如 JSON
- 特點:以文檔形式存儲,允許嵌套鍵值,可以存儲與表現更複雜的數據,查詢效率更高
- 相關產品:MongoDB
圖形資料庫:
- 說明:使用靈活的圖形模型,並且能擴展到多個伺服器
- 特點:可以存儲靈活的數據模型,比如地圖
- 相關產品:InfoGrid
4. 應用場景
- 數據模型比較簡單
- 系統靈活性要求高
- 對資料庫性能要求較高
- 不需要高度的數據一致性(Nosql產品對於事務支持不是特別好)
Redis 概述
1. 什麼是 Redis?
Redis 是一個開源的基於記憶體數據存儲結構,通常用於資料庫,緩存和消息中間件
2. 特點
- 高性能 key-value 記憶體型資料庫
- 支持豐富的數據類型(String、List、Set、Hash)
- 支持數據持久化
- 單進程,單線程,不存在併發問題,線程安全
- 效率高,自身有優化非同步處理
3. windows 環境安裝
該項目已經多年未更新了,不過作為學習測試還是足夠的,下載 Redis-x64-3.2.100.zip 並解壓,進入解壓目錄
打開 cmd 指令視窗,輸入命令
.\redis-server.exe .\redis.windows-service.conf
即可運行 Redis
4. Linux 環境安裝
以 Ubuntu 18.04.5 為例,安裝方法有三種:
4.1 apt-get 方式安裝
安裝命令
apt-get install -y redis-server
查看 Redis 狀態
service redis-server status
可以看到 Redis 狀態是 active(running),正在運行當中
啟動、停止、重啟命令如下
service redis-server start
service redis-server stop
service redis-server restart
預設配置文件位於 /etc/redis/redis.conf
卸載 Redis 命令如下
apt-get purge --auto-remove redis-server
4.2 源碼方式安裝
下載源碼壓縮包並解壓
wget https://download.redis.io/releases/redis-7.0.4.tar.gz
tar -zxvf redis-7.0.4.tar.gz
由於 Redis 使用 C 語言編寫,所以我們需要先安裝 gcc 依賴才能完成編譯
apt-get update
apt-get install build-essential
進入解壓縮目錄執行命令,開始編譯
make MALLOC=libc
編譯完成後會生成一些可執行文件,執行如下命令進行安裝
# 表示安裝位置在 /usr/redis
make install PREFIX=/usr/redis
進入 /usr/redis/bin 目錄啟動 Redis 服務
./redis-server # 使用預設配置
進入 /usr/redis/bin 目錄啟動 Redis 客戶端
# raw 參數的作用是顯示中文
./redis-cli -h localhost -p 6379 --raw
預設 redis 伺服器沒有開啟遠程連接,也就是預設拒絕所有遠程客戶端連接,需要修改配置開啟遠程連接
vim redis.conf
# 允許一切客戶端連接
bind 127.0.0.1 修改為 0.0.0.0
預設安裝目錄沒有任何配置文件,如果需要指定配置文件啟動,要在源碼目錄複製 redis.conf 到安裝目錄,再執行命令
./redis-server ../redis.conf
加上 & 可讓 redis 服務後臺啟動
redis-server ./redis.conf &
Redis 操作
1. 庫(database)
存放數據的一個基本單元,一個庫可以存放 key-value 鍵值對,redis 中每個庫都有一個唯一名稱,編號從 0 開始,預設庫的個數為 16 個,預設使用 0 號庫,庫與庫之間彼此隔離
# 切換庫
SELECT 0
# 清除當前庫
FLUSHDB
# 清除全部庫
FLUSHALL
2. 操作 key
-- DEL 指令
-- 語法:DEL key [key..]
-- 作用:刪除給定的一個或多個 key。不存在的 key 會被忽略。
-- 返回值:被刪除 key 的數量
--EXISTS 指令
-- 語法:EXISTS key
-- 作用:檢查給定 key 是否存在
-- 返回值:設置成功返回 1
-- EXPIRE 指令
-- 語法:EXPIRE key seconds
-- 作用:為給定 key 設置過期時間,以秒計,超期自動刪除
-- 返回值:設置成功返回 1
-- KEYS 指令
-- 語法:KEYS pattern
-- 作用:查找所有符合給定模式(pattern)的 key
-- 返回值:符合給定模式的 key 列表
-- MOVE 指令
-- 語法:MOVE key db
-- 作用:將當前資料庫的 key 移動到給定的資料庫 db 當中
-- 返回值:移動成功返回 1,失敗返回 0
-- PEXPIRE 指令
-- 語法:EXPIRE key milliseconds
-- 作用:設置 key 的過期時間以毫秒計
-- 返回值:設置成功返回 1
-- PEXPIREAT 指令
-- 語法:PEXPIREAT key milliseconds-timestamp
-- 作用:設置 key 過期時間的時間戳 (unix timestamp) 以毫秒計
-- 返回值:設置成功返回 1,設置失敗或 key 不存在時返回 0
-- TTL 指令
-- 語法:TTL key
-- 作用:以秒為單位,返回給定 key 的剩餘生存時間(TTL, time to live)
-- 返回值
-- 當 key 不存在時返回 -2
-- 當 key 存在但沒有設置剩餘生存時間時返回 -1
-- 否則以秒為單位返回 key 的剩餘時間
-- PTTL 指令
-- 語法:PTTL key
-- 作用:以毫秒為單位返回 key 的剩餘的過期時間
-- 返回值
-- 當 key 不存在時返回 -2
-- 當 key 存在但沒有設置剩餘生存時間時返回 -1
-- 否則以秒為單位返回 key 的剩餘時間
-- RANDOMKEY 指令
-- 語法:RANDOMKEY
-- 作用:從當前資料庫中隨機返回一個 key
-- 返回值:當資料庫不為空時返回一個 key,否則返回 nil
-- RENAME 指令
-- 語法:RENAME key newkey
-- 作用:修改 key 的名稱為 newkey。當 key 和 newkey 相同或者 key 不存在時,返回一個錯誤。
當 newkey 存在時,RENAME 命令將覆蓋舊值
-- 返回值:改名成功提示 OK,失敗返回一個錯誤
-- TYPE 指令
-- 語法:TYPE key
-- 作用:返回 key 所存儲值得類型
-- 返回值:
-- none(key 不存在)
-- string(字元串)
-- list(列表)
-- set(集合)
-- zset(有序集合)
-- hash(哈希表)
3. 操作 String
-- SET key value
-- 設置指定 key 的值
-- GET key
-- 獲取指定 key 的值
-- MSET key value [key value ...]
-- 同時設置一個或多個 key-value 對
-- MGET key1 [key2..]
-- 獲取所有(一個或多個)給定 key 的值
-- GETSET key value
-- 將給定 key 的值設為 value ,並返回 key 的舊值
-- STRLEN key
-- 返回 key 所儲存的字元串值的長度
-- APPEND key value
-- 如果 key 已經存在並且是一個字元串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾
-- GETRANGE key start end
-- 返回 key 中字元串值的子字元
-- SETEX key seconds value
-- 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)
-- PSETEX key milliseconds value
-- 這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位
-- SETNX key value
-- 只有在 key 不存在時設置 key 的值
-- MSETNX key value [key value ...]
-- 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在
-- DECR key
-- 將 key 中儲存的數字值減一
-- DECRBY key decrement
-- key 所儲存的值減去給定的減量值
-- INCR key
-- 將 key 中儲存的數字值增一
-- INCRBY key increment
-- 將 key 所儲存的值加上給定的增量值
-- INCRBYFLOAT key increment
-- 將 key 所儲存的值加上給定的浮點增量值
-- GETBIT key offset
-- 對 key 所儲存的字元串值,獲取指定偏移量上的位
-- SETBIT key offset value
-- 對 key 所儲存的字元串值,設置或清除指定偏移量上的位(bit)
-- SETRANGE key offset value
-- 用 value 參數覆寫給定 key 所儲存的字元串值,從偏移量 offset 開始
4. 操作 List
-- LPUSH key value1 [value2]
-- 將一個或多個值插入到列表頭部
-- LPUSHX key value
-- 將一個值插入到已存在的列表頭部
-- RPUSH key value1 [value2]
-- 在列表中添加一個或多個值
-- RPUSHX key value
-- 為已存在的列表添加值
-- LPOP key
-- 移出並獲取列表的第一個元素
-- RPOP key
-- 移除列表的最後一個元素,返回值為移除的元素
-- LRANGE key start stop
-- 獲取列表指定範圍內的元素
-- LLEN key
-- 獲取列表長度
-- LSET key index value
-- 通過索引設置列表元素的值
-- LINDEX key index
-- 通過索引獲取列表中的元素
-- LREM key count value
-- 移除列表元素
-- LTRIM
-- 保留列表特定區間內的元素
-- LINSERT key BEFORE|AFTER pivot value
-- 在列表的元素前或者後插入元素
-- BLPOP key1 [key2 ] timeout
-- 移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
-- BRPOP key1 [key2 ] timeout
-- 移出並獲取列表的最後一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
-- BRPOPLPUSH source destination timeout
-- 從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它。如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止
-- LTRIM key start stop
-- 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除
-- RPOPLPUSH source destination
-- 移除列表的最後一個元素,並將該元素添加到另一個列表並返回
5. 操作 Set
1 SADD key member1 [member2]
向集合添加一個或多個成員
2 SCARD key
獲取集合的成員數
3 SDIFF key1 [key2]
返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2]
返回給定所有集合的差集並存儲在 destination 中
5 SINTER key1 [key2]
返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2]
返回給定所有集合的交集並存儲在 destination 中
7 SISMEMBER key member
判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key
返回集合中的所有成員
9 SMOVE source destination member
將 member 元素從 source 集合移動到 destination 集合
10 SPOP key
移除並返回集合中的一個隨機元素
11 SRANDMEMBER key [count]
返回集合中一個或多個隨機數
12 SREM key member1 [member2]
移除集合中一個或多個成員
13 SUNION key1 [key2]
返回所有給定集合的並集
14 SUNIONSTORE destination key1 [key2]
所有給定集合的並集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
6. 操作 ZSet
元素可排序,不可以重覆
1 ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key
獲取有序集合的成員數
3 ZCOUNT key min max
計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member
有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max
在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES]
通過索引區間返回有序集合指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count]
通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通過分數返回有序集合指定區間內的成員
10 ZRANK key member
返回有序集合中指定成員的索引
11 ZREM key member [member ...]
移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max
移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop
移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max
移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到低
16 ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member
返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member
返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key ...]
計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成員和元素分值
7. 操作 Hash
value 是一個 map 結構,無序
1 HDEL key field1 [field2]
刪除一個或多個哈希表欄位
2 HEXISTS key field
查看哈希表 key 中,指定的欄位是否存在。
3 HGET key field
獲取存儲在哈希表中指定欄位的值。
4 HGETALL key
獲取在哈希表中指定 key 的所有欄位和值
5 HINCRBY key field increment
為哈希表 key 中的指定欄位的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment
為哈希表 key 中的指定欄位的浮點數值加上增量 increment 。
7 HKEYS key
獲取所有哈希表中的欄位
8 HLEN key
獲取哈希表中欄位的數量
9 HMGET key field1 [field2]
獲取所有給定欄位的值
10 HMSET key field1 value1 [field2 value2 ]
同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value
將哈希表 key 中的欄位 field 的值設為 value 。
12 HSETNX key field value
只有在欄位 field 不存在時,設置哈希表欄位的值。
13 HVALS key
獲取哈希表中所有值。
14 HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。