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]
迭代哈希表中的鍵值對,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/501226.html
標籤:其他
下一篇:MySQL原始碼決議之執行計劃
