Redis服務之經常使用數據類型

  上一篇博客咱們聊了下redis的主從複製、aof持久化、集羣、慢日誌相關配置指令的說明,回顧請參考http://www.javashuo.com/article/p-tgmduubk-ku.html;今天咱們來了解下redis經常使用數據類型的相關操做和說明;html

  Redis做爲數據存儲系統,它支持經常使用的數據類型有字符串(string)、列表(list)、關聯數組(hash)、集合(set)、有序集合(sorted_set)、發佈訂閱(pubsub)等;redis

  字符串相關經常使用操做數據庫

  在redis命令行使用help命令能夠查看指令的幫助信息,若是是查看某一組命令的用法能夠可使用help @組名;例如查看字符串相關命令操做幫助,可使用help @string;以下所示編程

127.0.0.1:6379> help @string

  APPEND key value
  summary: Append a value to a key
  since: 2.0.0

  BITCOUNT key [start end]
  summary: Count set bits in a string
  since: 2.6.0

  BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]
  summary: Perform arbitrary bitfield integer operations on strings
  since: 3.2.0

  BITOP operation destkey key [key ...]
  summary: Perform bitwise operations between strings
  since: 2.6.0

  BITPOS key bit [start] [end]
  summary: Find first bit set or clear in a string
  since: 2.8.7

  DECR key
  summary: Decrement the integer value of a key by one
  since: 1.0.0

  DECRBY key decrement
  summary: Decrement the integer value of a key by the given number
  since: 1.0.0

  GET key
  summary: Get the value of a key
  since: 1.0.0

  GETBIT key offset
  summary: Returns the bit value at offset in the string value stored at key
  since: 2.2.0

  GETRANGE key start end
  summary: Get a substring of the string stored at a key
  since: 2.4.0

  GETSET key value
  summary: Set the string value of a key and return its old value
  since: 1.0.0

  INCR key
  summary: Increment the integer value of a key by one
  since: 1.0.0

  INCRBY key increment
  summary: Increment the integer value of a key by the given amount
  since: 1.0.0

  INCRBYFLOAT key increment
  summary: Increment the float value of a key by the given amount
  since: 2.6.0

  MGET key [key ...]
  summary: Get the values of all the given keys
  since: 1.0.0

  MSET key value [key value ...]
  summary: Set multiple keys to multiple values
  since: 1.0.1

  MSETNX key value [key value ...]
  summary: Set multiple keys to multiple values, only if none of the keys exist
  since: 1.0.1

  PSETEX key milliseconds value
  summary: Set the value and expiration in milliseconds of a key
  since: 2.6.0

  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0

  SETBIT key offset value
  summary: Sets or clears the bit at offset in the string value stored at key
  since: 2.2.0

  SETEX key seconds value
  summary: Set the value and expiration of a key
  since: 2.0.0

  SETNX key value
  summary: Set the value of a key, only if the key does not exist
  since: 1.0.0

  SETRANGE key offset value
  summary: Overwrite part of a string at key starting at the specified offset
  since: 2.2.0

  STRLEN key
  summary: Get the length of the value stored in a key
  since: 2.2.0

127.0.0.1:6379> 

  提示:查看組裏的某一個命令的用法可使用help 指令數組

127.0.0.1:6379> help STRLEN

  STRLEN key
  summary: Get the length of the value stored in a key
  since: 2.2.0
  group: string

127.0.0.1:6379> help MGET

  MGET key [key ...]
  summary: Get the values of all the given keys
  since: 1.0.0
  group: string

127.0.0.1:6379> help SET

  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

127.0.0.1:6379> 

  字符串是全部編程語言中最多見的和最經常使用的數據類型,並且也是 redis 最基本的數據類型之一,並且 redis 中全部的 key 的類型都是字符串。對於string類型的數據經常使用的方法有SET、GET、MSET、MGET、SETEX、SETNX、INCR、DECR、INCRBY、DECRBY、INCRBYFLOAT、APPEND、STRLEN、;bash

  SET:添加一對鍵值數據數據庫;GET:獲取指定鍵對應的值;架構

127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> 

  提示:keys * 表示查看當前數據庫中的全部鍵列表;app

  MSET:添加多個鍵值數據到當前數據庫:MGET:獲取指定多個鍵對應的值;編程語言

127.0.0.1:6379> MSET k2 v2 k3 v3 k4 v4
OK
127.0.0.1:6379> KEYS *
1) "k3"
2) "k2"
3) "k1"
4) "k4"
127.0.0.1:6379> MGET k1 k2 k3 k4
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> 

  SETEX:添加一個有過時時長的鍵值數據到當前數據庫;SETNX:添加一個鍵值數據,只在當添加到鍵不存在當前數據庫時才添加;分佈式

127.0.0.1:6379> SETEX k5 5 v5
OK
127.0.0.1:6379> GET k5
"v5"
127.0.0.1:6379> GET k5
(nil)
127.0.0.1:6379> SET k5 v5 ex 5
OK
127.0.0.1:6379> GET k5
"v5"
127.0.0.1:6379> GET k5
(nil)
127.0.0.1:6379> SETNX k1 v8
(integer) 0
127.0.0.1:6379> SETNX k5 v5
(integer) 1
127.0.0.1:6379> GET k5
"v5"
127.0.0.1:6379>

  提示:給某一個key指定過時時長,可使用setex或者使用set 用ex指定過時時長也是能夠的;setnx是當前數據庫中沒有指定的key就建立,有就不建立;

  INCR:對值是整數型的key作自增(+1);DECR:對值是整數型的key作自減(-1);

127.0.0.1:6379> SET age 0
OK
127.0.0.1:6379> GET age
"0"
127.0.0.1:6379> INCR age
(integer) 1
127.0.0.1:6379> INCR age
(integer) 2
127.0.0.1:6379> INCR age
(integer) 3
127.0.0.1:6379> GET age
"3"
127.0.0.1:6379> DECR age
(integer) 2
127.0.0.1:6379> DECR age
(integer) 1
127.0.0.1:6379> GET age
"1"
127.0.0.1:6379> 

  INCRBY:對值是整數型的key作指定步長的自增;DECRBY:對值是整數型的key作指定步長的自減;

127.0.0.1:6379> GET age
"1"
127.0.0.1:6379> INCRBY age 5
(integer) 6
127.0.0.1:6379> INCRBY age 3
(integer) 9
127.0.0.1:6379> INCRBY age 2
(integer) 11
127.0.0.1:6379> GET age
"11"
127.0.0.1:6379> DECRBY age 5
(integer) 6
127.0.0.1:6379> DECRBY age 3
(integer) 3
127.0.0.1:6379> DECRBY age 2
(integer) 1
127.0.0.1:6379> GET age
"1"
127.0.0.1:6379> 

  INCRBYFLOAT:對值是整數型的key作指定步長爲浮點數的自增;

127.0.0.1:6379> GET age
"1"
127.0.0.1:6379> INCRBYFLOAT age 0.5
"1.5"
127.0.0.1:6379> INCRBYFLOAT age 2.32
"3.82"
127.0.0.1:6379> INCRBYFLOAT age 12.25
"16.07"
127.0.0.1:6379> GET age
"16.07"
127.0.0.1:6379> 

  APPEND:追加一個字符串到指定key的值裏面;STRLEN:查看指定key的值的字符串長度;

127.0.0.1:6379> GET k1
"v1"
127.0.0.1:6379> APPEND k1 abcd
(integer) 6
127.0.0.1:6379> GET k1
"v1abcd"
127.0.0.1:6379> STRLEN k1
(integer) 6
127.0.0.1:6379> STRLEN k2
(integer) 2
127.0.0.1:6379> APPEND kk aaaa
(integer) 4
127.0.0.1:6379> get kk
"aaaa"
127.0.0.1:6379> 

  提示:append若是當前數據指定key不存在則建立,並把指定的字符串看成值賦給指定的key,存在則在對應key的值後面追加指定的字符串;

  列表相關經常使用操做

  列表是一個雙向可讀寫的管道,其頭部是左側尾部是右側,一個列表最多能夠包含 2^32-1 個元素即4294967295 個元素。對於list類型的數據經常使用操做有LPUSH、RPUSH、LPOP、RPOP、LPUSHX、RPUSHX、LRANGE、LINDEX、LSET、LLEN;

  LPUSH:從左側壓入一個或多個元素到指定列表,若是指定列表不存在,則建立;RPUSH:從右側壓入一個多個元素到指定列表,若是指定列表不存在,則建立;

127.0.0.1:6379> LPUSH L1 a1 a2 a3 a4 a5
(integer) 5
127.0.0.1:6379> TYPE L1
list
127.0.0.1:6379> RPUSH L2 b1 b2 b3 b4 b5
(integer) 5
127.0.0.1:6379> TYPE L2
list
127.0.0.1:6379> LPUSH L2 aa bb 
(integer) 7
127.0.0.1:6379> RPUSH L1 aa bb
(integer) 7
127.0.0.1:6379> 

  提示:對於列表來講壓入一個或多個元素到列表,它默認是從左側的第一個元素順序往列表壓入元素;LPUSH是從列表的左側進入列表,RPUSH是從列表的右側進入列表;以下圖所示

  提示:L1=[a5,a4,a3,a2,a1,aa,bb]    L2=[bb,aa,b1,b2,b3,b4,b5]

  LPOP:從列表左側彈出一個元素(取走或者刪除);RPOP:從列表右側彈出一個元素(取走或刪除);

127.0.0.1:6379> KEYS *
1) "k5"
2) "k3"
3) "k2"
4) "kk"
5) "age"
6) "L1"
7) "k4"
8) "L2"
9) "k1"
127.0.0.1:6379> LPOP L1
"a5"
127.0.0.1:6379> LPOP L1
"a4"
127.0.0.1:6379> LPOP L1
"a3"
127.0.0.1:6379> LPOP L1
"a2"
127.0.0.1:6379> LPOP L1
"a1"
127.0.0.1:6379> LPOP L1
"aa"
127.0.0.1:6379> LPOP L1
"bb"
127.0.0.1:6379> LPOP L1
(nil)
127.0.0.1:6379> KEYS L1
(empty list or set)
127.0.0.1:6379> RPOP L2
"b5"
127.0.0.1:6379> RPOP L2
"b4"
127.0.0.1:6379> RPOP L2
"b3"
127.0.0.1:6379> RPOP L2
"b2"
127.0.0.1:6379> RPOP L2
"b1"
127.0.0.1:6379> RPOP L2
"aa"
127.0.0.1:6379> RPOP L2
"bb"
127.0.0.1:6379> RPOP L2
(nil)
127.0.0.1:6379> KEYS L2
(empty list or set)
127.0.0.1:6379> 

  LPUSHX:僅當列表存在時,在列表左側壓入一個元素到列表;RPUSHX:僅當列表存在時,在列表右側壓入一個元素到列表(追加一個元素到列表);

127.0.0.1:6379> KEYS *
1) "k5"
2) "k3"
3) "k2"
4) "kk"
5) "age"
6) "k4"
7) "k1"
127.0.0.1:6379> LPUSHX L1 aa
(integer) 0
127.0.0.1:6379> KEYS L1
(empty list or set)
127.0.0.1:6379> LPUSH L1 a1 a2 a3
(integer) 3
127.0.0.1:6379> LPUSHX L1 aa
(integer) 4
127.0.0.1:6379> RPUSHX L1 bb
(integer) 5
127.0.0.1:6379> LPOP L1 
"aa"
127.0.0.1:6379> RPOP L1
"bb"
127.0.0.1:6379> 

  提示:LPUSHX和RPUSHX都是壓入一個元素到列表,前提是列表存在;

  LRANGE:從列表中獲取指定範圍的元素(切片);LINDEX:獲取指定列表的指定下標的元素;

127.0.0.1:6379> KEYS *
1) "k5"
2) "k3"
3) "k2"
4) "kk"
5) "age"
6) "L1"
7) "k4"
8) "L2"
9) "k1"
127.0.0.1:6379> LLEN L1
(integer) 3
127.0.0.1:6379> LPUSH L1 1 2 3 4 5 6 
(integer) 9
127.0.0.1:6379> LRANGE L1 0 8
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "a3"
8) "a2"
9) "a1"
127.0.0.1:6379> LRANGE L1 4 7
1) "2"
2) "1"
3) "a3"
4) "a2"
127.0.0.1:6379> LINDEX L1 5
"1"
127.0.0.1:6379> LINDEX L1 8
"a1"
127.0.0.1:6379> LINDEX L1 0
"6"
127.0.0.1:6379> 

  提示:列表的索引(下標)是從0開始到元素個數減一結束;

  LSET:在列表指定位置插入一個元素,替換原有位置的元素;LLEN:查看列表長度(元素個數)

127.0.0.1:6379> LLEN L1
(integer) 9
127.0.0.1:6379> LSET L1 10 aaa
(error) ERR index out of range
127.0.0.1:6379> LINDEX L1 8
"a1"
127.0.0.1:6379> LSET L1 8 bb
OK
127.0.0.1:6379> LINDEX L1 8
"bb"
127.0.0.1:6379> 

  提示:lset指定下標是先有列表的下標範圍內,不能超出已有列表下標的範圍;

  集合經常使用操做

  Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。對於set類型的數據經常使用操做有SADD、SMEMBERS、SPOP、SREM、SRANDMEMBER、SINTER、SUNION、SDIFF

  SADD:添加一個或多個元素到一個集合,若是該集合不存在,則建立;SMEMBERS:查看指定集合中的全部元素

127.0.0.1:6379> KEYS *
1) "k5"
2) "k3"
3) "k2"
4) "kk"
5) "age"
6) "L1"
7) "k4"
8) "L2"
9) "k1"
127.0.0.1:6379> SADD s1 a b c d
(integer) 4
127.0.0.1:6379> SADD s1 1 2 3 4
(integer) 4
127.0.0.1:6379> SADD s1 a 
(integer) 0
127.0.0.1:6379> SADD s1 aa
(integer) 1
127.0.0.1:6379> SMEMBERS s1
1) "3"
2) "2"
3) "b"
4) "c"
5) "4"
6) "a"
7) "1"
8) "d"
9) "aa"
127.0.0.1:6379> KEYS *
 1) "k5"
 2) "k3"
 3) "k2"
 4) "s1"
 5) "kk"
 6) "age"
 7) "L1"
 8) "k4"
 9) "L2"
10) "k1"
127.0.0.1:6379> 

  提示:集合中成員是惟一的,因此在集合中已有的成員,再次添加相同的成員會添加不成功的,正由於集合的這種特性,它能夠用來去除重複的元素;

  SPOP:從指定集合中隨機彈出(刪除)一個或多個元素;SREM:從指定集合中刪除一個或多個指定的元素;

127.0.0.1:6379> SMEMBERS s1
1) "3"
2) "2"
3) "b"
4) "c"
5) "4"
6) "a"
7) "1"
8) "d"
9) "aa"
127.0.0.1:6379> SPOP s1 
"a"
127.0.0.1:6379> SPOP s1 
"aa"
127.0.0.1:6379> SMEMBERS s1
1) "d"
2) "b"
3) "1"
4) "2"
5) "3"
6) "c"
7) "4"
127.0.0.1:6379> SPOP s1 2
1) "1"
2) "b"
127.0.0.1:6379> SMEMBERS s1
1) "d"
2) "2"
3) "3"
4) "c"
5) "4"
127.0.0.1:6379> SREM s1 d 2
(integer) 2
127.0.0.1:6379> SMEMBERS s1
1) "3"
2) "c"
3) "4"
127.0.0.1:6379> 

  SRANDMEMBER:從指定集合中隨機獲取一個或多個元素;

127.0.0.1:6379> SMEMBERS s1
1) "3"
2) "c"
3) "4"
127.0.0.1:6379> SADD s1 aa bb dd cc
(integer) 4
127.0.0.1:6379> SRANDMEMBER s1
"bb"
127.0.0.1:6379> SRANDMEMBER s1
"c"
127.0.0.1:6379> SMEMBERS s1
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5) "3"
6) "c"
7) "4"
127.0.0.1:6379> SRANDMEMBER s1 3
1) "3"
2) "bb"
3) "dd"
127.0.0.1:6379> SRANDMEMBER s1 3
1) "cc"
2) "bb"
3) "dd"
127.0.0.1:6379> SRANDMEMBER s1 3
1) "3"
2) "c"
3) "dd"
127.0.0.1:6379> 

  SINTER:求交集,已屬於 A 且屬於 B 的元素稱爲 A 與 B 的交(集);

127.0.0.1:6379> SMEMBERS s1
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5) "3"
6) "c"
7) "4"
127.0.0.1:6379> SMEMBERS s2
1) "cc"
2) "aa"
3) "2"
4) "b"
5) "c"
6) "bb"
7) "a"
8) "1"
9) "3"
127.0.0.1:6379> SINTER s1 s2
1) "bb"
2) "cc"
3) "aa"
4) "3"
5) "c"
127.0.0.1:6379> SINTER s2 s1
1) "bb"
2) "cc"
3) "aa"
4) "3"
5) "c"
127.0.0.1:6379> 

  SUNION:求並集,已屬於 A 或屬於 B 的元素爲稱爲 A 與 B 的並(集);

127.0.0.1:6379> SMEMBERS s1
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5) "3"
6) "c"
7) "4"
127.0.0.1:6379> SMEMBERS s2
1) "bb"
2) "b"
3) "1"
4) "aa"
5) "cc"
6) "2"
7) "3"
8) "c"
9) "a"
127.0.0.1:6379> SUNION s1 s2
 1) "bb"
 2) "b"
 3) "1"
 4) "dd"
 5) "aa"
 6) "cc"
 7) "2"
 8) "3"
 9) "c"
10) "4"
11) "a"
127.0.0.1:6379> SUNION s2 s1
 1) "b"
 2) "bb"
 3) "1"
 4) "dd"
 5) "cc"
 6) "aa"
 7) "2"
 8) "3"
 9) "c"
10) "4"
11) "a"
127.0.0.1:6379>

  SDIFF:求差集,已屬於 A 而不屬於 B 的元素稱爲 A 與 B 的差(集);

127.0.0.1:6379> SMEMBERS s1
1) "bb"
2) "dd"
3) "cc"
4) "aa"
5) "3"
6) "c"
7) "4"
127.0.0.1:6379> SMEMBERS s2
1) "bb"
2) "b"
3) "1"
4) "aa"
5) "cc"
6) "2"
7) "3"
8) "c"
9) "a"
127.0.0.1:6379> SDIFF s1 s2
1) "4"
2) "dd"
127.0.0.1:6379> SDIFF s2 s1
1) "a"
2) "2"
3) "1"
4) "b"
127.0.0.1:6379> 

  提示:差集和順序有關,sdiff s1 s2表示s1有的元素,s2沒有的元素,追蹤結果必定是屬於s1;sdiff s2 s1表示,s2有的元素s1沒有的元素,最終結果必定是屬於s2;若是獲得的結果是空表示兩個集合相等;

  有序集合經常使用操做

  Redis 有序集合和集合同樣也是 string 類型元素的集合,且不容許重複的成員,不一樣的是每一個元素都會關聯一個 double(雙精度浮點型)類型的分數,redis 正是經過分數來爲集合中的成員進行從小到大的排序,有序集合的成員是惟一的,但分數(score)卻能夠重複,集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1), 集合中最大的成員數爲 2^32 - 1 (4294967295, 每一個集合可存儲 40 多億個成員)。對於sorted set類型的數據經常使用操做有ZADD、ZCARD、ZCOUNT、ZRANK、ZRANGE;

  ZADD:向有序集合中添加一個或多個成員,若是已經存在,則更新其分數;ZCARD:獲取指定集合成員個數;

127.0.0.1:6379> ZADD z1 10 aa 20 bb 30 cc
(integer) 3
127.0.0.1:6379> ZADD z1 50 aa
(integer) 0
127.0.0.1:6379> ZCARD z1
(integer) 3
127.0.0.1:6379>

  ZCOUNT:統計給定分數範圍在有序集合中成員個數;ZRANK:查看指定成員在有序集合中的索引;

127.0.0.1:6379> ZCOUNT z1 1 15
(integer) 0
127.0.0.1:6379> ZCOUNT z1 10 20
(integer) 1
127.0.0.1:6379> ZCOUNT z1 10 50
(integer) 3
127.0.0.1:6379> ZRANK z1 aa
(integer) 2
127.0.0.1:6379> ZRANK z1 bb
(integer) 0
127.0.0.1:6379> ZRANK z1 cc
(integer) 1
127.0.0.1:6379> 

  ZRANGE:獲取指定索引範圍內的全部成員;

127.0.0.1:6379> ZRANGE z1 0 2
1) "bb"
2) "cc"
3) "aa"
127.0.0.1:6379> ZRANGE z1 1 2
1) "cc"
2) "aa"
127.0.0.1:6379> ZADD z1 1 aa 5 bb 10 dd 7 xx
(integer) 2
127.0.0.1:6379> ZRANGE z1 0 4
1) "aa"
2) "bb"
3) "xx"
4) "dd"
5) "cc"
127.0.0.1:6379> ZRANGE z1 2 4
1) "xx"
2) "dd"
3) "cc"
127.0.0.1:6379> 

  提示:分數越大,排名(索引)越靠後;

  哈希經常使用操做

  hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象,Redis 中每一個 hash 能夠存儲2^32 - 1個鍵值對(40 多億)。對於hash類型的數據經常使用操做有HSET、HMSET、HGET、HMGET、HKEYS、HVALS、HDEL、HGETALL

  HSET:設置一個hash key和值;HMSET:設置多個hash key和值;

127.0.0.1:6379> HSET h1 name tom
(integer) 1
127.0.0.1:6379> HSET h1 age 18
(integer) 1
127.0.0.1:6379> HMSET h2 name jerry age 22 gender M
OK
127.0.0.1:6379> 

  HGET:獲取一個hash key的值;HMGET:獲取多個hash key的值;

127.0.0.1:6379> HGET h1 name
"tom"
127.0.0.1:6379> HGET h1 age
"18"
127.0.0.1:6379> HMGET h1 name age gender
1) "tom"
2) "18"
3) (nil)
127.0.0.1:6379> HMGET h2 name age gender
1) "jerry"
2) "22"
3) "M"
127.0.0.1:6379> 

  HKEYS:獲取指定hash key的全部key ;HVALS:獲取指定hash key的全部key的值;

127.0.0.1:6379> HKEYS h1
1) "name"
2) "age"
127.0.0.1:6379> HKEYS h2
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> HVALS h1
1) "tom"
2) "18"
127.0.0.1:6379> HVALS h2
1) "jerry"
2) "22"
3) "M"
127.0.0.1:6379> 

  HDEL:刪除一個或多個hash key;HGETALL:獲取指定hash key 的全部key和value;

127.0.0.1:6379> HGETALL h1
1) "name"
2) "tom"
3) "age"
4) "18"
127.0.0.1:6379> HGETALL h2
1) "name"
2) "jerry"
3) "age"
4) "22"
5) "gender"
6) "M"
127.0.0.1:6379> HDEL h1 name 
(integer) 1
127.0.0.1:6379> HDEL h2 gender age
(integer) 2
127.0.0.1:6379> HGETALL h1
1) "age"
2) "18"
127.0.0.1:6379> HGETALL h2
1) "name"
2) "jerry"
127.0.0.1:6379> 

  消息隊列經常使用操做

  消息隊列主要分爲兩種,分別是生產者消費者模式和發佈者訂閱者模式,這兩種模式 Redis 都支持;在生產者消費者(Producer/Consumer)模式下,上層應用接收到的外部請求後開始處理其當前步驟的操做,在執行完成後將已經完成的操做發送至指定的頻道(channel)當中,並由其下層的應用監聽該頻道並繼續下一步的操做,若是其處理完成後沒有下一步的操做就直接返回數據給外部請求,若是還有下一步的操做就再將任務發佈到另一個頻道,由另一個消費者繼續監聽和處理。生產者消費者模式下,多個消費者同時監聽一個隊列,可是一個消息只能被最早搶到消息的消費者消費,即消息任務是一次性讀取和處理,此模式在分佈式業務架構中很是經常使用,比較經常使用的軟件還有RabbitMQ、Kafka、RocketMQ、ActiveMQ 等;

  隊列當中的 消息由不一樣的生產者寫入也會有不一樣的消費者取出進行消費處理,可是一個消息必定是隻能被取出一次也就是被消費一次。

  示例:使用本地鏈接模擬生產者往隊列裏寫入消息,使用遠程鏈接模擬消費者,消費隊列中的消息;

127.0.0.1:6379> LPUSH channel1 msg1
(integer) 1
127.0.0.1:6379> LPUSH channel1 msg2
(integer) 2
127.0.0.1:6379> LPUSH channel1 msg3
(integer) 3
127.0.0.1:6379> LRANGE channel1 0 -1
1) "msg3"
2) "msg2"
3) "msg1"
127.0.0.1:6379> 

  提示:以上在channel1這個消息隊列中寫入了3條信息;

  使用遠程鏈接來模擬消費者到指定隊列消費消息

192.168.0.41:6379> RPOP channel1
"msg1"
192.168.0.41:6379> RPOP channel1
"msg2"
192.168.0.41:6379> RPOP channel1
"msg3"
192.168.0.41:6379> RPOP channel1
(nil)
192.168.0.41:6379> LRANGE channel1 0 -1
(empty array)
192.168.0.41:6379> 

  提示:能夠看到消息隊列裏的消息消費完之後,就空了;

  發佈者訂閱模式

  在發佈者訂閱者模式下,發佈者將消息發佈到指定的 channel 裏面,凡是監聽該 channel 的消費者都會收到一樣的一份消息,這種模式相似因而收音機模式,即凡是收聽某個頻道的聽衆都會收到主持人發佈的相同的消息內容。此模式經常使用語羣聊天、羣通知、羣公告等場景;

  示例:訂閱者監聽頻道

  提示:訂閱者能夠同時監聽多個頻道;

  發佈者發佈

  訂閱者驗證消息

  提示:以上訂閱者只訂閱了一個頻道,若是定義多個頻道能夠在後面添加頻道名稱便可;也可使用PSUBSCRIBE 加模式匹配監聽多個頻道;取消訂閱使用UNSUBSCRIBE 加要取消訂閱的頻道名稱便可;也可使用PUNSUBSCRIBE 加模式匹配 來取消匹配到的頻道;

相關文章
相關標籤/搜索