主頁 > 資料庫 > Redis(一)

Redis(一)

2020-11-09 20:46:18 資料庫

Redis

Redis簡介

  • REmote DIctionary Server(Redis) 是一個key-value存盤系統,Redis是一個開源的使用ANSI C語言撰寫、遵守BSD協議、支持網路、可基于記憶體亦可持久化的日志型、Key-Value資料庫,并提供多種語言的API,它通常被稱為資料結構服務器,因為值(value)可以是 字串(String), 哈希(Hash), 串列(list), 集合(sets) 和 有序集合(sorted sets)等型別,

  • Redis 與其他 key - value 快取產品有以下三個特點:

    • Redis支持資料的持久化,可以將記憶體中的資料保存在磁盤中,重啟的時候可以再次加載進行使用,
    • Redis不僅僅支持簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的存盤,
    • Redis支持資料的備份,即master-slave模式的資料備份,
  • Redis 優勢

    • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s ,
    • 豐富的資料型別 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作,
    • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行,單個操作是原子性的,多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來,
    • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性,
  • Redis與其他key-value存盤有什么不同?

    • Redis有著更為復雜的資料結構并且提供對他們的原子性操作,這是一個不同于其他資料庫的進化路徑,Redis的資料型別都是基于基本資料結構的同時對程式員透明,無需進行額外的抽象,
    • Redis運行在記憶體中但是可以持久化到磁盤,所以在對不同資料集進行高速讀寫時需要權衡記憶體,因為資料量不能大于硬體記憶體,在記憶體資料庫方面的另一個優點是,相比在磁盤上相同的復雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情,同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問,

Ubuntu apt 命令安裝

  • 在 Ubuntu 系統安裝 Redis 可以使用以下命令:
# sudo apt update
# sudo apt install redis-server
  • 啟動 Redis
# redis-server
  • 查看 redis 是否啟動?
# redis-cli
  • 以上命令將打開以下終端:
redis 127.0.0.1:6379>
  • 127.0.0.1 是本機 IP ,6379 是 redis 服務埠,現在我們輸入 PING 命令,
redis 127.0.0.1:6379> ping
PONG

以上說明我們已經成功安裝了redis,

Redis 配置

Redis 的組態檔位于 Redis 安裝目錄下,檔案名為 redis.conf(Windows 名為 redis.windows.conf),

你可以通過 CONFIG 命令查看或設定配置項,

  • 語法Redis CONFIG 命令格式如下redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

實體

redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"
  • 使用 * 號獲取所有配置項:

實體

redis 127.0.0.1:6379> CONFIG GET *

  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "unixsocket"
  8) ""
  9) "logfile"
 10) ""
 11) "pidfile"
 12) "/var/run/redis.pid"
 13) "maxmemory"
 14) "0"
 15) "maxmemory-samples"
 16) "3"
 17) "timeout"
 18) "0"
 19) "tcp-keepalive"
 20) "0"
 21) "auto-aof-rewrite-percentage"
 22) "100"
 23) "auto-aof-rewrite-min-size"
 24) "67108864"
 25) "hash-max-ziplist-entries"
 26) "512"
 27) "hash-max-ziplist-value"
 28) "64"
 29) "list-max-ziplist-entries"
 30) "512"
 31) "list-max-ziplist-value"
 32) "64"
 33) "set-max-intset-entries"
 34) "512"
 35) "zset-max-ziplist-entries"
 36) "128"
 37) "zset-max-ziplist-value"
 38) "64"
 39) "hll-sparse-max-bytes"
 40) "3000"
 41) "lua-time-limit"
 42) "5000"
 43) "slowlog-log-slower-than"
 44) "10000"
 45) "latency-monitor-threshold"
 46) "0"
 47) "slowlog-max-len"
 48) "128"
 49) "port"
 50) "6379"
 51) "tcp-backlog"
 52) "511"
 53) "databases"
 54) "16"
 55) "repl-ping-slave-period"
 56) "10"
 57) "repl-timeout"
 58) "60"
 59) "repl-backlog-size"
 60) "1048576"
 61) "repl-backlog-ttl"
 62) "3600"
 63) "maxclients"
 64) "4064"
 65) "watchdog-period"
 66) "0"
 67) "slave-priority"
 68) "100"
 69) "min-slaves-to-write"
 70) "0"
 71) "min-slaves-max-lag"
 72) "10"
 73) "hz"
 74) "10"
 75) "no-appendfsync-on-rewrite"
 76) "no"
 77) "slave-serve-stale-data"
 78) "yes"
 79) "slave-read-only"
 80) "yes"
 81) "stop-writes-on-bgsave-error"
 82) "yes"
 83) "daemonize"
 84) "no"
 85) "rdbcompression"
 86) "yes"
 87) "rdbchecksum"
 88) "yes"
 89) "activerehashing"
 90) "yes"
 91) "repl-disable-tcp-nodelay"
 92) "no"
 93) "aof-rewrite-incremental-fsync"
 94) "yes"
 95) "appendonly"
 96) "no"
 97) "dir"
 98) "/home/deepak/Downloads/redis-2.8.13/src"
 99) "maxmemory-policy"
100) "volatile-lru"
101) "appendfsync"
102) "everysec"
103) "save"
104) "3600 1 300 100 60 10000"
105) "loglevel"
106) "notice"
107) "client-output-buffer-limit"
108) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
109) "unixsocketperm"
110) "0"
111) "slaveof"
112) ""
113) "notify-keyspace-events"
114) ""
115) "bind"
116) ""

編輯配置

你可以通過修改 redis.conf 檔案或使用 CONFIG set 命令來修改配置,

  • 語法

CONFIG SET 命令基本語法:

redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

實體

redis 127.0.0.1:6379> CONFIG SET loglevel "notice"
OK
redis 127.0.0.1:6379> CONFIG GET loglevel

1) "loglevel"
2) "notice"

引數配置

  • redis.conf 配置項說明如下:
序號 配置項 說明
1 daemonize no Redis 默認不是以守護行程的方式運行,可以通過該配置項修改,使用 yes 啟用守護行程(Windows 不支持守護執行緒的配置為 no )
2 pidfile /var/run/redis.pid 當 Redis 以守護行程方式運行時,Redis 默認會把 pid 寫入 /var/run/redis.pid 檔案,可以通過 pidfile 指定
3 port 6379 指定 Redis 監聽埠,默認埠為 6379,為什么選用 6379 作為默認埠?,6379在是手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字,MERZ長期以來被Redis作者antirez及其朋友當作愚蠢的代名詞,后來Redis作者在開發Redis時就選用了這個埠,
——Alessia Merz 是一位意大利舞女、女演員, Redis 作者 Antirez 早年看電視節目,覺得 Merz 在節目中的一些話愚蠢可笑,Antirez 喜歡造“梗”用于平時和朋友們交流,于是造了一個詞 “MERZ”,形容愚蠢,與 “stupid” 含義相同,
——后來 Antirez 重新定義了 “MERZ” ,形容”具有很高的技術價值,包含技藝、耐心和勞動,但仍然保持簡單本質“,
——到了給 Redis 選擇一個數字作為默認埠號時,Antirez 沒有多想,把 “MERZ” 在手機鍵盤上對應的數字 6379 拿來用了,
4 bind 127.0.0.1 系結的主機地址
5 timeout 300 當客戶端閑置多長秒后關閉連接,如果指定為 0 ,表示關閉該功能
6 loglevel notice 指定日志記錄級別,Redis 總共支持四個級別:debug、verbose、notice、warning,默認為 notice
7 logfile stdout 日志記錄方式,默認為標準輸出,如果配置 Redis 為守護行程方式運行,而這里又配置為日志記錄方式為標準輸出,則日志將會發送給 /dev/null
8 databases 16 設定資料庫的數量,默認資料庫為0,可以使用SELECT 命令在連接上指定資料庫id
9 save Redis 默認組態檔中提供了三個條件:
save 900 1
save 300 10
save 60 10000
分別表示 900 秒(15 分鐘)內有 1 個更改,300 秒(5 分鐘)內有 10 個更改以及 60 秒內有 10000 個更改,
指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合
10 rdbcompression yes 指定存盤至本地資料庫時是否壓縮資料,默認為 yes,Redis 采用 LZF 壓縮,如果為了節省 CPU 時間,可以關閉該選項,但會導致資料庫檔案變的巨大
11 dbfilename dump.rdb 指定本地資料庫檔案名,默認值為 dump.rdb
12 dir ./ 指定本地資料庫存放目錄
13 slaveof 設定當本機為 slave 服務時,設定 master 服務的 IP 地址及埠,在 Redis 啟動時,它會自動從 master 進行資料同步
14 masterauth 當 master 服務設定了密碼保護時,slav 服務連接 master 的密碼
15 requirepass foobared 設定 Redis 連接密碼,如果配置了連接密碼,客戶端在連接 Redis 時需要通過 AUTH 命令提供密碼,默認關閉
16 maxclients 128 設定同一時間最大客戶端連接數,默認無限制,Redis 可以同時打開的客戶端連接數為 Redis 行程可以打開的最大檔案描述符數,如果設定 maxclients 0,表示不作限制,當客戶端連接數到達限制時,Redis 會關閉新的連接并向客戶端回傳 max number of clients reached 錯誤資訊
17 maxmemory 指定 Redis 最大記憶體限制,Redis 在啟動時會把資料加載到記憶體中,達到最大記憶體后,Redis 會先嘗試清除已到期或即將到期的 Key,當此方法處理 后,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作,Redis 新的 vm 機制,會把 Key 存放記憶體,Value 會存放在 swap 區
18 appendonly no 指定是否在每次更新操作后進行日志記錄,Redis 在默認情況下是異步的把資料寫入磁盤,如果不開啟,可能會在斷電時導致一段時間內的資料丟失,因為 redis 本身同步資料檔案是按上面 save 條件來同步的,所以有的資料會在一段時間內只存在于記憶體中,默認為 no
19 appendfilename appendonly.aof 指定更新日志檔案名,默認為 appendonly.aof
20 appendfsync everysec 指定更新日志條件,共有 3 個可選值:no:表示等作業系統進行資料快取同步到磁盤(快)always:表示每次更新操作后手動呼叫 fsync() 將資料寫到磁盤(慢,安全)everysec:表示每秒同步一次(折中,默認值)
21 vm-enabled no 指定是否啟用虛擬記憶體機制,默認值為 no,簡單的介紹一下,VM 機制將資料分頁存放,由 Redis 將訪問量較少的頁即冷資料 swap 到磁盤上,訪問多的頁面由磁盤自動換出到記憶體中(在后面的文章我會仔細分析 Redis 的 VM 機制)
22 vm-swap-file /tmp/redis.swap 虛擬記憶體檔案路徑,默認值為 /tmp/redis.swap,不可多個 Redis 實體共享
23 vm-max-memory 0 將所有大于 vm-max-memory 的資料存入虛擬記憶體,無論 vm-max-memory 設定多小,所有索引資料都是記憶體存盤的(Redis 的索引資料 就是 keys),也就是說,當 vm-max-memory 設定為 0 的時候,其實是所有 value 都存在于磁盤,默認值為 0
24 vm-page-size 32 Redis swap 檔案分成了很多的 page,一個物件可以保存在多個 page 上面,但一個 page 上不能被多個物件共享,vm-page-size 是要根據存盤的 資料大小來設定的,作者建議如果存盤很多小物件,page 大小最好設定為 32 或者 64bytes;如果存盤很大大物件,則可以使用更大的 page,如果不確定,就使用默認值
25 vm-pages 134217728 設定 swap 檔案中的 page 數量,由于頁表(一種表示頁面空閑或使用的 bitmap)是在放在記憶體中的,,在磁盤上每 8 個 pages 將消耗 1byte 的記憶體,
26 vm-max-threads 4 設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那么所有對swap檔案的操作都是串行的,可能會造成比較長時間的延遲,默認值為4
27 glueoutputbuf yes 設定在向客戶端應答時,是否把較小的包合并為一個包發送,默認為開啟
28 hash-max-zipmap-entries 64 hash-max-zipmap-value 512 指定在超過一定的數量或者最大的元素超過某一臨界值時,采用一種特殊的哈希演算法
29 activerehashing yes 指定是否激活重置哈希,默認為開啟(后面在介紹 Redis 的哈希演算法時具體介紹)
30 include /path/to/local.conf 指定包含其它的組態檔,可以在同一主機上多個Redis實體之間使用同一份組態檔,而同時各個實體又擁有自己的特定配置

Redis 資料型別

Redis支持五種資料型別:string(字串),hash(哈希),list(串列),set(集合)及zset(sorted set:有序集合),


String(字串)

string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value,

string 型別是二進制安全的,意思是 redis 的 string 可以包含任何資料,比如jpg圖片或者序列化的物件,

string 型別是 Redis 最基本的資料型別,string 型別的值最大能存盤 512MB,

實體

redis 127.0.0.1:6379> SET runoob "huahua"
OK
redis 127.0.0.1:6379> GET runoob
"huahua"

在以上實體中我們使用了 Redis 的 SETGET 命令,鍵為 runoob,對應的值為 huahua

注意:一個鍵最大能存盤 512MB,

Redis 字串命令詳解

下表列出了常用的 redis 字串命令:

序號 命令及描述
1 SET key value 設定指定 key 的值
2 GET key 獲取指定 key 的值,
3 GETRANGE key start end 回傳 key 中字串值的子字符
4 GETSET key value 將給定 key 的值設為 value ,并回傳 key 的舊值(old value),
5 GETBIT key offset 對 key 所儲存的字串值,獲取指定偏移量上的位(bit),
6 [MGET key1 key2..] 獲取所有(一個或多個)給定 key 的值,
7 SETBIT key offset value 對 key 所儲存的字串值,設定或清除指定偏移量上的位(bit),
8 SETEX key seconds value 將值 value 關聯到 key ,并將 key 的過期時間設為 seconds (以秒為單位),
9 SETNX key value 只有在 key 不存在時設定 key 的值,
10 SETRANGE key offset value 用 value 引數覆寫給定 key 所儲存的字串值,從偏移量 offset 開始,
11 STRLEN key 回傳 key 所儲存的字串值的長度,
12 [MSET key value key value ...] 同時設定一個或多個 key-value 對,
13 [MSETNX key value key value ...] 同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在,
14 PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設定 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位,
15 INCR key 將 key 中儲存的數字值增一,
16 INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) ,
17 INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) ,
18 DECR key 將 key 中儲存的數字值減一,
19 DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) ,
20 APPEND key value 如果 key 已經存在并且是一個字串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾,

Hash(哈希)

Redis hash 是一個鍵值(key=>value)對集合,

Redis hash 是一個 string 型別的 field 和 value 的映射表,hash 特別適合用于存盤物件,

DEL runoob 用于洗掉前面測驗用過的 key,不然會報錯:(error) WRONGTYPE Operation against a key holding the wrong kind of value

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> HMSET runoob field1 "Hello" field2 "World"
"OK"
redis 127.0.0.1:6379> HGET runoob field1
"Hello"
redis 127.0.0.1:6379> HGET runoob field2
"World"

實體中我們使用了 Redis HMSET, HGET 命令,HMSET 設定了兩個 field=>value 對, HGET 獲取對應 field 對應的 value

每個 hash 可以存盤 232 -1 鍵值對(40多億),

Redis hash 命令詳解

下表列出了 redis hash 基本的相關命令:

序號 命令及描述
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] 迭代哈希表中的鍵值對,

List(串列)

Redis 串列是簡單的字串串列,按照插入順序排序,你可以添加一個元素到串列的頭部(左邊)或者尾部(右邊),

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

串列最多可存盤 232 - 1 元素 (4294967295, 每個串列可存盤40多億),

Redis 串列命令詳解

下表列出了串列相關的基本命令:

序號 命令及描述
1 [BLPOP key1 key2 ] timeout 移出并獲取串列的第一個元素, 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止,
2 [BRPOP key1 key2 ] timeout 移出并獲取串列的最后一個元素, 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止,
3 BRPOPLPUSH source destination timeout 從串列中彈出一個值,將彈出的元素插入到另外一個串列中并回傳它; 如果串列沒有元素會阻塞串列直到等待超時或發現可彈出元素為止,
4 LINDEX key index 通過索引獲取串列中的元素
5 LINSERT key BEFORE|AFTER pivot value 在串列的元素前或者后插入元素
6 LLEN key 獲取串列長度
7 LPOP key 移出并獲取串列的第一個元素
8 [LPUSH key value1 value2] 將一個或多個值插入到串列頭部
9 LPUSHX key value 將一個值插入到已存在的串列頭部
10 LRANGE key start stop 獲取串列指定范圍內的元素
11 LREM key count value 移除串列元素
12 LSET key index value 通過索引設定串列元素的值
13 LTRIM key start stop 對一個串列進行修剪(trim),就是說,讓串列只保留指定區間內的元素,不在指定區間之內的元素都將被洗掉,
14 RPOP key 移除串列的最后一個元素,回傳值為移除的元素,
15 RPOPLPUSH source destination 移除串列的最后一個元素,并將該元素添加到另一個串列并回傳
16 [RPUSH key value1 value2] 在串列中添加一個或多個值
17 RPUSHX key value 為已存在的串列添加值

Set(集合)

Redis 的 Set 是 string 型別的無序集合,

集合是通過哈希表實作的,所以添加,洗掉,查找的復雜度都是 O(1),

sadd 命令

添加一個 string 元素到 key 對應的 set 集合中,成功回傳 1,如果元素已經在集合中回傳 0,

sadd key member

實體

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob

1) "redis"
2) "rabitmq"
3) "mongodb"

注意:以上實體中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略,

集合中最大的成員數為 232 - 1(4294967295, 每個集合可存盤40多億個成員),

Redis 集合命令

下表列出了 Redis 集合基本命令:

序號 命令及描述
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] 迭代集合中的元素

zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重復的成員,

不同的是每個元素都會關聯一個double型別的分數,redis正是通過分數來為集合中的成員進行從小到大的排序,

zset的成員是唯一的,但分數(score)卻可以重復,

zadd 命令

添加元素到集合,元素在集合中存在則更新對應score

zadd key score member 

實體

redis 127.0.0.1:6379> DEL runoob
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

Redis 有序集合命令

下表列出了 redis 有序集合的基本命令:

序號 命令及描述
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 ...] 計算給定的一個或多個有序集的交集并將結果集存盤在新的有序集合 destination 中
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] 迭代有序集合中的元素(包括元素成員和元素分值)

各個資料型別應用場景

型別 簡介 特性 場景
String(字串) 二進制安全 可以包含任何資料,比如jpg圖片或者序列化的物件,一個鍵最大能存盤512M ---
Hash(字典) 鍵值對集合,即編程語言中的Map型別 適合存盤物件,并且可以像資料庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字串反序列化成物件修改完再序列化存回去) 存盤、讀取、修改用戶屬性
List(串列) 鏈表(雙向鏈表) 增刪快,提供了操作某一段元素的API 1,最新訊息排行等功能(比如朋友圈的時間線) 2,訊息佇列
Set(集合) 哈希表實作,元素不重復 1、添加、洗掉,查找的復雜度都是O(1) 2、為集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大于某個閾值就可以推薦
Sorted Set(有序集合) 將Set中的元素增加一個權重引數score,元素按score有序排列 資料插入集合時,已經進行天然排序

Redis 命令

Redis 命令用于在 redis 服務上執行操作,

要在 redis 服務上執行命令需要一個 redis 客戶端,Redis 客戶端在我們之前下載的的 redis 的安裝包中,

語法

Redis 客戶端的基本語法為:

$ redis-cli

實體

以下實體講解了如何啟動 redis 客戶端:

啟動 redis 服務器,打開終端并輸入命令 redis-cli,該命令會連接本地的 redis 服務,

$ redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

在以上實體中我們連接到本地的 redis 服務并執行 PING 命令,該命令用于檢測 redis 服務是否啟動,


在遠程服務上執行命令

如果需要在遠程 redis 服務上執行命令,同樣我們使用的也是 redis-cli 命令,

語法

$ redis-cli -h host -p port -a password

實體

以下實體演示了如何連接到主機為 127.0.0.1,埠為 6379 ,密碼為 mypass 的 redis 服務上,

$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

Redis 鍵(key)

Redis 鍵命令用于管理 redis 的鍵,

語法

Redis 鍵命令的基本語法如下:

redis 127.0.0.1:6379> COMMAND KEY_NAME

實體

redis 127.0.0.1:6379> SET runoobkey redis
OK
redis 127.0.0.1:6379> DEL runoobkey
(integer) 1

在以上實體中 DEL 是一個命令, runoobkey 是一個鍵, 如果鍵被洗掉成功,命令執行后輸出 (integer) 1,否則將輸出 (integer) 0


Redis keys 命令

下表給出了與 Redis 鍵相關的基本命令:

序號 命令及描述
1 DEL key 該命令用于在 key 存在時洗掉 key,
2 DUMP key 序列化給定 key ,并回傳被序列化的值,
3 EXISTS key 檢查給定 key 是否存在,
4 EXPIRE key seconds 為給定 key 設定過期時間,以秒計,
5 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設定過期時間, 不同在于 EXPIREAT 命令接受的時間引數是 UNIX 時間戳(unix timestamp),
6 PEXPIRE key milliseconds 設定 key 的過期時間以毫秒計,
7 PEXPIREAT key milliseconds-timestamp 設定 key 過期時間的時間戳(unix timestamp) 以毫秒計
8 KEYS pattern 查找所有符合給定模式( pattern)的 key ,
9 MOVE key db 將當前資料庫的 key 移動到給定的資料庫 db 當中,
10 PERSIST key 移除 key 的過期時間,key 將持久保持,
11 PTTL key 以毫秒為單位回傳 key 的剩余的過期時間,
12 TTL key 以秒為單位,回傳給定 key 的剩余生存時間(TTL, time to live),
13 RANDOMKEY 從當前資料庫中隨機回傳一個 key ,
14 RENAME key newkey 修改 key 的名稱
15 RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey ,
16 [SCAN cursor MATCH pattern] [COUNT count] 迭代資料庫中的資料庫鍵,
17 TYPE key 回傳 key 所儲存的值的型別,

Redis HyperLogLog

Redis 在 2.8.9 版本添加了 HyperLogLog 結構,

Redis HyperLogLog 是用來做基數統計的演算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定 的、并且是很小的,

在 Redis 里面,每個 HyperLogLog 鍵只需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基 數,這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比,

但是,因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,回傳輸入的各個元素,


什么是基數?

比如資料集 {1, 3, 5, 7, 5, 7, 8}, 那么這個資料集的基數集為 {1, 3, 5 ,7, 8}, 基數(不重復元素)為5, 基數估計就是在誤差可接受的范圍內,快速計算基數,


實體

以下實體演示了 HyperLogLog 的作業程序:

redis 127.0.0.1:6379> PFADD runoobkey "redis"

1) (integer) 1

redis 127.0.0.1:6379> PFADD runoobkey "mongodb"

1) (integer) 1

redis 127.0.0.1:6379> PFADD runoobkey "mysql"

1) (integer) 1

redis 127.0.0.1:6379> PFCOUNT runoobkey

(integer) 3

Redis HyperLogLog 命令

下表列出了 redis HyperLogLog 的基本命令:

序號 命令及描述
1 [PFADD key element element ...] 添加指定元素到 HyperLogLog 中,
2 [PFCOUNT key key ...] 回傳給定 HyperLogLog 的基數估算值,
3 [PFMERGE destkey sourcekey sourcekey ...] 將多個 HyperLogLog 合并為一個 HyperLogLog

Redis 發布訂閱

Redis 發布訂閱 (pub/sub) 是一種訊息通信模式:發送者 (pub) 發送訊息,訂閱者 (sub) 接收訊息,

Redis 客戶端可以訂閱任意數量的頻道,

下圖展示了頻道 channel1 , 以及訂閱這個頻道的三個客戶端 —— client2 、 client5 和 client1 之間的關系:

當有新訊息通過 PUBLISH 命令發送給頻道 channel1 時, 這個訊息就會被發送給訂閱它的三個客戶端:


實體

以下實體演示了發布訂閱是如何作業的,需要開啟兩個 redis-cli 客戶端,

在我們實體中我們創建了訂閱頻道名為 runoobChat:

第一個 redis-cli 客戶端

redis 127.0.0.1:6379> SUBSCRIBE runoobChat

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3)(integer) 1

現在,我們先重新開啟個 redis 客戶端,然后在同一個頻道 runoobChat 發布兩次訊息,訂閱者就能接收到訊息,

第二個 redis-cli 客戶端

redis 127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test"

(integer) 1

redis 127.0.0.1:6379> PUBLISH runoobChat "Learn redis by runoob.com"

(integer) 1

\# 訂閱者的客戶端會顯示如下訊息
 1) "message"
2) "runoobChat"
3) "Redis PUBLISH test"
 1) "message"
2) "runoobChat"
3) "Learn redis by runoob.com"
  • 開啟本地 Redis 服務,開啟兩個 redis-cli 客戶端,
  • 第一個 redis-cli 客戶端輸入 SUBSCRIBE runoobChat,意思是訂閱 runoobChat 頻道,
  • 第二個 redis-cli 客戶端輸入 PUBLISH runoobChat "Redis PUBLISH test" 往 runoobChat 頻道發送訊息,這個時候在第一個 redis-cli 客戶端就會看到由第二個 redis-cli 客戶端發送的測驗訊息,

Redis 發布訂閱命令

下表列出了 redis 發布訂閱常用命令:

序號 命令及描述
1 [PSUBSCRIBE pattern pattern ...] 訂閱一個或多個符合給定模式的頻道,
2 [PUBSUB subcommand argument [argument ...]] 查看訂閱與發布系統狀態,
3 PUBLISH channel message 將資訊發送到指定的頻道,
4 [PUNSUBSCRIBE pattern [pattern ...]] 退訂所有給定模式的頻道,
5 [SUBSCRIBE channel channel ...] 訂閱給定的一個或多個頻道的資訊,
6 [UNSUBSCRIBE channel [channel ...]] 指退訂給定的頻道,

Redis 事務

Redis 事務可以一次執行多個命令, 并且帶有以下三個重要的保證:

  • 批量操作在發送 EXEC 命令前被放入佇列快取,
  • 收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行,
  • 在事務執行程序,其他客戶端提交的命令請求不會插入到事務執行命令序列中,

一個事務從開始到執行會經歷以下三個階段:

  • 開始事務,
  • 命令入隊,
  • 執行事務,

實體

以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然后將多個命令入隊到事務中, 最后由 EXEC 命令觸發事務, 一并執行事務中的所有命令:

redis 127.0.0.1:6379> MULTI
OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED

redis 127.0.0.1:6379> GET book-name
QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED

redis 127.0.0.1:6379> SMEMBERS tag
QUEUED

redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
   2) "C++"
   3) "Programming"

單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行并不是原子性的,

事務可以理解為一個打包的批量執行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成后續的指令不做,

這是官網上的說明 From redis docs on transactions:

It's important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.

比如:

redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK

如果在 set b bbb 處失敗,set a 已成功不會回滾,set c 還會繼續執行,


Redis 事務命令

下表列出了 redis 事務的相關命令:

序號 命令及描述
1 DISCARD 取消事務,放棄執行事務塊內的所有命令,
2 EXEC 執行所有事務塊內的命令,
3 MULTI 標記一個事務塊的開始,
4 UNWATCH 取消 WATCH 命令對所有 key 的監視,
5 [WATCH key key ...] 監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷,

Redis 腳本

Redis 腳本使用 Lua 解釋器來執行腳本, Redis 2.6 版本通過內嵌支持 Lua 環境,執行腳本的常用命令為 EVAL

語法

Eval 命令的基本語法如下:

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

實體

以下實體演示了 redis 腳本作業程序:

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

1) "key1"
2) "key2"
3) "first"
4) "second"

Redis 腳本命令

下表列出了 redis 腳本常用命令:

序號 命令及描述
1 [EVAL script numkeys key key ...] arg [arg ...] 執行 Lua 腳本,
2 [EVALSHA sha1 numkeys key key ...] arg [arg ...] 執行 Lua 腳本,
3 [SCRIPT EXISTS script script ...] 查看指定的腳本是否已經被保存在快取當中,
4 SCRIPT FLUSH 從腳本快取中移除所有腳本,
5 SCRIPT KILL 殺死當前正在運行的 Lua 腳本,
6 SCRIPT LOAD script 將腳本 script 添加到腳本快取中,但并不立即執行這個腳本,

Redis 連接

Redis 連接命令主要是用于連接 redis 服務,

實體

以下實體演示了客戶端如何通過密碼驗證連接到 redis 服務,并檢測服務是否在運行:

redis 127.0.0.1:6379> AUTH "password"
OK
redis 127.0.0.1:6379> PING
PONG

Redis 連接命令

下表列出了 redis 連接的基本命令:

序號 命令及描述
1 AUTH password 驗證密碼是否正確
2 ECHO message 列印字串
3 PING 查看服務是否運行
4 QUIT 關閉當前連接
5 SELECT index 切換到指定的資料庫

Redis服務器

Redis服務器命令主要是用于管理redis服務,

實體

以下實體演示了如何獲取redis服務器的統計資訊:

redis 127.0.0.1:6379>資訊

#服務器
redis_version:2.8.13
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c2238b38b1edb0e2
redis_mode:獨立
os:Linux 3.5.0-48-通用x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.7.2
process_id:3856
run_id:0e61abd297771de3fe812a3c21027732ac9f41fe
tcp_port:6379
uptime_in_seconds:11554
uptime_in_days:0
時區:10
lru_clock:16651447
config_file:

#客戶
connected_clients:1
client-longest_output_list:0
client-biggest_input_buf:0
blocked_clients:0

#記憶
used_memory:589016
used_memory_human:575.21K
used_memory_rss:2461696
used_memory_peak:667312
used_memory_peak_human:651.67K
used_memory_lua:33792
mem_fragmentation_ratio:4.18
mem_allocator:jemalloc-3.6.0

#持久性
加載:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1409158561
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:好的
aof_last_write_status:好的

#統計
total_connections_received:24
total_commands_processed:294
Instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:41
keyspace_misses:82
pubsub_channels:0
pubsub_patterns:0
Latest_fork_usec:264

#復制
角色:主人
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# 中央處理器
used_cpu_sys:10.49
used_cpu_user:4.96
used_cpu_sys_children:0.00
used_cpu_user_children:0.01

#鍵空間
db0:keys = 94,expires = 1,avg_ttl = 41638810
db1:keys = 1,expires = 0,avg_ttl = 0
db3:keys = 1,expires = 0,avg_ttl = 0

Redis服務器命令

宣布上市了redis服務器的相關命令:

序號 命令及描述
1個 BGREWRITEAOF 異步執行一個AOF(附加檔案)檔案重寫操作
2 BGSAVE 在后臺初始化保存當前資料庫的資料到磁盤
3 [CLIENT KILL ip:port] [ID client-id] 關閉客戶端連接
4 客戶端串列 獲取連接到服務器的客戶端連接串列
5 CLIENT GETNAME 獲取連接的名稱
6 客戶端暫停超時 在指定時間終止運行來自客戶端的命令
7 CLIENT SETNAME connection-name 設定當前連接的名稱
8 集群插槽獲取累積的二進制的映射陣列
9 COMMAND 獲取Redis命令清單
10 命令計數 獲取Redis命令總數
11 命令GETKEYS 獲取給定命令的所有鍵
12 TIME 回傳當前服務器時間
13 [COMMAND INFO命令名command-name ...] 獲取指定Redis命令描述的陣列
14 CONFIG GET parameter 獲取指定配置引數的值
15 CONFIG REWRITE 對啟動Redis服務器時所指定的redis.conf組態檔進行改寫
16 CONFIG SET引數值 修改redis配置引數,無需重啟
17 CONFIG RESETSTAT 重置資訊命令中的某些統計資料
18歲 DBSIZE 回傳當前資料庫的鍵的數量
19 DEBUG OBJECT鍵 獲取鍵的除錯資訊
20 DEBUG SEGFAULT 讓Redis服務崩潰
21 FLUSHALL 洗掉所有資料庫的所有鍵
22 FLUSHDB 洗掉當前資料庫的所有密鑰
23 [INFO section] 獲取Redis服務器的各種資訊和統計數值
24 LASTSAVE 回傳最近一次Redis成功將資料保存到磁盤上的時間,以UNIX格式表示
25 MONITOR 實時列印出Redis服務器接收到的命令,除錯用
26 ROLE 回傳主從實體所屬的角色
27 SAVE 同步保存資料到硬碟
28 [SHUTDOWN NOSAVE] [SAVE] 初始化保存資料到硬碟,并關閉服務器
29 SLAVEOF主機埠 將當前服務器轉變為指定服務器的從屬服務器(從屬服務器)
30 [SLOWLOG子命令引數] 管理redis的的慢日志
31 SYNC 用于復制功能(復制)的內部命令

Redis Stream

Redis Stream 是 Redis 5.0 版本新增加的資料結構,

Redis Stream 主要用于訊息佇列(MQ,Message Queue),Redis 本身是有一個 Redis 發布訂閱 (pub/sub) 來實作訊息佇列的功能,但它有個缺點就是訊息無法持久化,如果出現網路斷開、Redis 宕機等,訊息就會被丟棄,

簡單來說發布訂閱 (pub/sub) 可以分發訊息,但無法記錄歷史訊息,

而 Redis Stream 提供了訊息的持久化和主備復制功能,可以讓任何客戶端訪問任何時刻的資料,并且能記住每一個客戶端的訪問位置,還能保證訊息不丟失,

Redis Stream 的結構如下所示,它有一個訊息鏈表,將所有加入的訊息都串起來,每個訊息都有一個唯一的 ID 和對應的內容:

每個 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 - 列印流資訊

XADD

使用 XADD 向佇列添加訊息,如果指定的佇列不存在,則創建一個佇列,XADD 語法格式:

XADD key ID field value [field value ...]
  • key :佇列名稱,如果不存在就創建
  • ID :訊息 id,我們使用 * 表示由 redis 生成,可以自定義,但是要自己保證遞增性,
  • field value : 記錄,

實體

redis**>** XADD mystream ***** name Sara surname OConnor
"1601372323627-0"
redis**>** XADD mystream ***** field1 value1 field2 value2 field3 value3
"1601372323627-1"
redis**>** XLEN mystream
**(**integer**)** 2
redis**>** XRANGE mystream - +
1**)** 1**)** "1601372323627-0"
  2**)** 1**)** "name"
   2**)** "Sara"
   3**)** "surname"
   4**)** "OConnor"
2**)** 1**)** "1601372323627-1"
  2**)** 1**)** "field1"
   2**)** "value1"
   3**)** "field2"
   4**)** "value2"
   5**)** "field3"
   6**)** "value3"
redis**>**

XTRIM

使用 XTRIM 對流進行修剪,限制長度, 語法格式:

XTRIM key MAXLEN [~] count
  • key :佇列名稱
  • MAXLEN :長度
  • count :數量

實體

127.0.0.1:6379**>** XADD mystream ***** field1 A field2 B field3 C field4 D
"1601372434568-0"
127.0.0.1:6379**>** XTRIM mystream MAXLEN 2
**(**integer**)** 0
127.0.0.1:6379**>** XRANGE mystream - +
1**)** 1**)** "1601372434568-0"
  2**)** 1**)** "field1"
   2**)** "A"
   3**)** "field2"
   4**)** "B"
   5**)** "field3"
   6**)** "C"
   7**)** "field4"
   8**)** "D"
127.0.0.1:6379**>**

redis**>**

XDEL

使用 XDEL 洗掉訊息,語法格式:

XDEL key ID [ID ...]
  • key:佇列名稱
  • ID :訊息 ID

使用 XDEL 洗掉訊息,語法格式:

XLEN

使用 XLEN 獲取流包含的元素數量,即訊息長度,語法格式:

XLEN key
  • key:佇列名稱

實體

redis**>** XADD mystream ***** item 1
"1601372563177-0"
redis**>** XADD mystream ***** item 2
"1601372563178-0"
redis**>** XADD mystream ***** item 3
"1601372563178-1"
redis**>** XLEN mystream
**(**integer**)** 3
redis**>**

XRANGE

使用 XRANGE 獲取訊息串列,會自動過濾已經洗掉的訊息 ,語法格式:

XRANGE key start end [COUNT count]
  • key :佇列名
  • start :開始值, - 表示最小值
  • end :結束值, + 表示最大值
  • count :數量

實體

redis**>** XADD writers ***** name Virginia surname Woolf
"1601372577811-0"
redis**>** XADD writers ***** name Jane surname Austen
"1601372577811-1"
redis**>** XADD writers ***** name Toni surname Morrison
"1601372577811-2"
redis**>** XADD writers ***** name Agatha surname Christie
"1601372577812-0"
redis**>** XADD writers ***** name Ngozi surname Adichie
"1601372577812-1"
redis**>** XLEN writers
**(**integer**)** 5
redis**>** XRANGE writers - + COUNT 2
1**)** 1**)** "1601372577811-0"
  2**)** 1**)** "name"
   2**)** "Virginia"
   3**)** "surname"
   4**)** "Woolf"
2**)** 1**)** "1601372577811-1"
  2**)** 1**)** "name"
   2**)** "Jane"
   3**)** "surname"
   4**)** "Austen"
redis**>**

XREVRANGE

使用 XREVRANGE 獲取訊息串列,會自動過濾已經洗掉的訊息 ,語法格式:

XREVRANGE key end start [COUNT count]
  • key :佇列名
  • end :結束值, + 表示最大值
  • start :開始值, - 表示最小值
  • count :數量

實體

redis**>** XADD writers ***** name Virginia surname Woolf
"1601372731458-0"
redis**>** XADD writers ***** name Jane surname Austen
"1601372731459-0"
redis**>** XADD writers ***** name Toni surname Morrison
"1601372731459-1"
redis**>** XADD writers ***** name Agatha surname Christie
"1601372731459-2"
redis**>** XADD writers ***** name Ngozi surname Adichie
"1601372731459-3"
redis**>** XLEN writers
**(**integer**)** 5
redis**>** XREVRANGE writers + - COUNT 1
1**)** 1**)** "1601372731459-3"
  2**)** 1**)** "name"
   2**)** "Ngozi"
   3**)** "surname"
   4**)** "Adichie"
redis**>**

XREAD

使用 XREAD 以阻塞或非阻塞方式獲取訊息串列 ,語法格式:

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]
  • count :數量
  • milliseconds :可選,阻塞毫秒數,沒有設定就是非阻塞模式
  • key :佇列名
  • id :訊息 ID

實體

*# 從 Stream 頭部讀取兩條訊息*
**>** XREAD COUNT 2 STREAMS mystream writers 0-0 0-0
1**)** 1**)** "mystream"
  2**)** 1**)** 1**)** 1526984818136-0
     2**)** 1**)** "duration"
      2**)** "1532"
      3**)** "event-id"
      4**)** "5"
      5**)** "user-id"
      6**)** "7782813"
   2**)** 1**)** 1526999352406-0
     2**)** 1**)** "duration"
      2**)** "812"
      3**)** "event-id"
      4**)** "9"
      5**)** "user-id"
      6**)** "388234"
2**)** 1**)** "writers"
  2**)** 1**)** 1**)** 1526985676425-0
     2**)** 1**)** "name"
      2**)** "Virginia"
      3**)** "surname"
      4**)** "Woolf"
   2**)** 1**)** 1526985685298-0
     2**)** 1**)** "name"
      2**)** "Jane"
      3**)** "surname"
      4**)** "Austen"

XGROUP CREATE

使用 XGROUP CREATE 創建消費者組,語法格式:

XGROUP [CREATE key groupname id-or-$] [SETID key groupname id-or-$] [DESTROY key groupname] [DELCONSUMER key groupname consumername]
  • key :佇列名稱,如果不存在就創建
  • groupname :組名,
  • $ : 表示從尾部開始消費,只接受新訊息,當前 Stream 訊息會全部忽略,

從頭開始消費:

XGROUP CREATE mystream consumer-group-name 0-0  

從尾部開始消費:

XGROUP CREATE mystream consumer-group-name $

XREADGROUP GROUP

使用 XREADGROUP GROUP 讀取消費組中的訊息,語法格式:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]
  • group :消費組名
  • consumer :消費者名,
  • count : 讀取數量,
  • milliseconds : 阻塞毫秒數,
  • key : 佇列名,
  • ID : 訊息 ID,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/208301.html

標籤:其他

上一篇:docker 安裝 tomcat 以及一些注意事項的管理

下一篇:安全洗掉Elasticsearch資料節點

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more