【資料庫】redis安裝
redis簡介
REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 儲存系統,是跨平臺的非關係型資料庫。
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支援網路、可基於記憶體、分散式、可選永續性的鍵值對(Key-Value)儲存資料庫,並提供多種語言的 API。
Redis 通常被稱為資料結構伺服器,因為值(value)可以是字串(String)、雜湊(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等型別
redis安裝
brew install redis
redis啟動
brew services start redis
或
redis-server
互動模式
redis-cli -h 127.0.0.1 -p 6379
使用redis-cli連線本地服務
zhouxi@zhouxideMacBook-Pro ~ % redis-cli 127.0.0.1:6379>
執行PING指令
127.0.0.1:6379> PING PONG 127.0.0.1:6379>
關閉redis服務
redis-cli shutdown
強制關閉redis服務
sudo pkill redis-server
新增key-value
127.0.0.1:6379> SET runoobkey redis OK
查詢key-value
127.0.0.1:6379> GET runoobkey "redis"
刪除key-value
127.0.0.1:6379> DEL runoobkey (integer) 1
判斷Key是否存在
127.0.0.1:6379> EXISTS runoobkey (integer) 1
redis雜湊
儲存雜湊值
127.0.0.1:6379> HMSET runoobkey name "redis" description "cac" likes 20 vis 23000 OK
獲取全部屬性
127.0.0.1:6379> HGETALL runoobkey 1) "name" 2) "redis" 3) "description" 4) "cac" 5) "likes" 6) "20" 7) "vis" 8) "23000"
判斷HASH是否存在
HEXISTS runoobkey name
獲取指定屬性
127.0.0.1:6379> HGET runoobkey name "redis"
獲取所有key
127.0.0.1:6379> HKEYS runoobkey 1) "name" 2) "description" 3) "likes" 4) "vis"
修改指定屬性
127.0.0.1:6379> HSET runoobkey name "hello" (integer) 0
修改多個屬性
127.0.0.1:6379> HSET runoobkey name "hello" description "new des" (integer) 0
redis列表
Redis列表是簡單的字串列表,按照插入順序排序
建立列表並新增兩個元素
127.0.0.1:6379> LPUSH runoobkey redis (integer) 1 127.0.0.1:6379> LPUSH runoobkey mongodb (integer) 2
獲取指定index的元素
127.0.0.1:6379> LINDEX runoobkey -1 "redis"
redis集合(set)
向集合中新增值
127.0.0.1:6379> SADD runoobkey redis (integer) 1 127.0.0.1:6379> SADD runoobkey mongodb (integer) 1 127.0.0.1:6379> SADD runoobkey redis (integer) 0
Redis 的 Set 是 String 型別的無序集合。集合成員是唯一的,這就意味著集合中不能出現重複的資料,這裡返回0
redis有序集合(sorted set)
Redis 有序集合和集合一樣也是 string 型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個 double 型別的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重複。
建立和新增屬性
127.0.0.1:6379> ZADD runoobkey 1 redis (integer) 1 127.0.0.1:6379> ZADD runoobkey 2 redis (integer) 0 127.0.0.1:6379> ZADD runoobkey 1 rediss (integer) 1
redis釋出訂閱
Redis 釋出訂閱 (pub/sub) 是一種訊息通訊模式:傳送者 (pub) 傳送訊息,訂閱者 (sub) 接收訊息。
Redis 客戶端可以訂閱任意數量的頻道。
建立一個redis-cli客戶端訂閱訊息
zhouxi@zhouxideMacBook-Pro ~ % redis-cli 127.0.0.1:6379> SUBSCRIBE runoobChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "runoobChat"
建立一個redis-cli客戶端傳送訊息
zhouxi@zhouxideMacBook-Pro ~ % redis-cli 127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test" (integer) 1 127.0.0.1:6379>
這是訂閱端會收到訊息
3) (integer) 1 1) "message" 2) "runoobChat" 3) "Redis PUBLISH test"
redis事務
Redis 事務可以一次執行多個命令, 並且帶有以下三個重要的保證:
- 批量操作在傳送 EXEC 命令前被放入佇列快取。
- 收到 EXEC 命令後進入事務執行,事務中任意命令執行失敗,其餘的命令依然被執行。
- 在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷以下三個階段:
- 開始事務。
- 命令入隊。
- 執行事務。
以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然後將多個命令入隊到事務中, 最後由 EXEC 命令觸發事務, 一併執行事務中的所有命令:
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> SET book-name "hell" QUEUED 127.0.0.1:6379> GET book-name QUEUED 127.0.0.1:6379> EXEC 1) OK 2) "hell" 127.0.0.1:6379>
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行並不是原子性的。
事務可以理解為一個打包的批量執行指令碼,但批量指令並非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成後續的指令不做。
redis stream
Redis Stream 是 Redis 5.0 版本新增加的資料結構。
Redis Stream 主要用於訊息佇列(MQ,Message Queue),Redis 本身是有一個 Redis 釋出訂閱 (pub/sub) 來實現訊息佇列的功能,但它有個缺點就是訊息無法持久化,如果出現網路斷開、Redis 宕機等,訊息就會被丟棄。
簡單來說釋出訂閱 (pub/sub) 可以分發訊息,但無法記錄歷史訊息。
而 Redis Stream 提供了訊息的持久化和主備複製功能,可以讓任何客戶端訪問任何時刻的資料,並且能記住每一個客戶端的訪問位置,還能保證訊息不丟失。
每個 Stream 都有唯一的名稱,它就是 Redis 的 key,在我們首次使用 xadd 指令追加訊息時自動建立。
每個 Stream 都有唯一的名稱,它就是 Redis 的 key,在我們首次使用 xadd 指令追加訊息時自動建立。
上圖解析:
- Consumer Group :消費組,使用 XGROUP CREATE 命令建立,一個消費組有多個消費者(Consumer)。
- last_delivered_id :遊標,每個消費組會有個遊標 last_delivered_id,任意一個消費者讀取了訊息都會使遊標 last_delivered_id 往前移動。
- pending_ids :消費者(Consumer)的狀態變數,作用是維護消費者的未確認的 id。 pending_ids 記錄了當前已經被客戶端讀取的訊息,但是還沒有 ack (Acknowledge character:確認字元)。
訊息佇列相關命令:
- XADD - 新增訊息到末尾
- XTRIM - 對流進行修剪,限制長度
- XDEL - 刪除訊息
- XLEN - 獲取流包含的元素數量,即訊息長度
- XRANGE - 獲取訊息列表,會自動過濾已經刪除的訊息
- XREVRANGE - 反向獲取訊息列表,ID 從大到小
- XREAD - 以阻塞或非阻塞方式獲取訊息列表
消費者組相關命令:
- XGROUP CREATE - 建立消費者組
- XREADGROUP GROUP - 讀取消費者組中的訊息
- XACK - 將訊息標記為"已處理"
- XGROUP SETID - 為消費者組設定新的最後遞送訊息ID
- XGROUP DELCONSUMER - 刪除消費者
- XGROUP DESTROY - 刪除消費者組
- XPENDING - 顯示待處理訊息的相關資訊
- XCLAIM - 轉移訊息的歸屬權
- XINFO - 檢視流和消費者組的相關資訊;
- XINFO GROUPS - 列印消費者組的資訊;
- XINFO STREAM - 列印流資訊
清除所有資料
127.0.0.1:6379> FLUSHALL OK 127.0.0.1:6379>