Redis基本操作命令


很多網站教程都介紹的很詳細的,這里只把主要的介紹一下。對於操作命令大小寫不區分(DEL  del  Del是一樣的。對於輸入正確的命令,會自動出現后續輸入參數提示),但是key是區分大小寫的。

key操作

注:Redis是一個key-value的鍵值對的內存數據庫。最基本的一些操作就是對這些key的操作。

DEL

刪除Key,  del key1 key2

EXISTS

檢查key是否存在, EXISTS key

EXPIRE

設置或者更新到期時間,到期后自動清除,單位 設置為-1表示永不過期。 EXPIRE key

PERSIST

移除過期時間,key永久保存。其實就是過期時間設置為-1,永不過期

PTTL

毫秒為單位返回key剩余的過期時間。

TTL

為單位,返回給定key的剩余生存時間。

EXPIREAT

設置key的過期時間,不過設置的是時間戳。

PEXPIRE

設置key的過期時間,不過是毫秒單位。

PEXPIREAT

設置key的過期時間,不過是時間戳,以毫秒統計。

KEYS   pattern

查找匹配給定模式pattern的所有key。

KEYS * 匹配數據庫中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符號用 \ 隔開

MOVE key db

把指定的key移動到數據庫db中。(默認的redis有16個數據庫)

SELECT index

切換數據庫(redis默認16個數據庫  編號從0開始)

RANDOMKEY

隨機獲取一個key

RENAME key newkey

修改key名字。如果newkey已經存在,則刪除newkey。

RENAMENX key newkey

僅當newkey不存在時,將key改名為newkey。

TYPE key

返回key的類型

string

GET

獲取

MGET

獲取多個

SET

設置(新增  修改)

MSET

設置一個

GETRANGE

獲取范圍段

比如一個value是   qwertyuiop

正序  倒序兩種情況。

getrange key 0 4      (qwert)

getrange key -1 -5      (yuiop)

getrange key 0 -1      (qwertyuiop)

------------------------------------------------

  q    w    e    r    t    y    u    i    o    p 

  0   1     2   3    4   5    6    7   8    9

-10  -9   -8  -7  -6  -5   -4  -3  -2   -1

------------------------------------------------

GETSET

設置一個值,然后在返回原來老值。

SETEX key seconds value

設置一個key,並制定他的過期時間,單位秒

PSETEX key milliseconds value

設置一個key,並制定他的過期時間,單位毫秒

SETNX

只有在KEY不存在時設置value。就是新增一個(不包含更新)。

MSETNX

同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。

APPEND key value

追加到末尾。

STRLEN key

長度

INCR key

把key中的數字值增加1

INCRBY key increment

將key所存儲的值增加一定數量。

INCRBYFLOAT key increment

增加一定的浮點數。

DECR key

將key存儲數字鍵1

DECRBY key decrement

減去給你的減量值

hash

hash使我們最常用的,因為他可以存儲對象,字典等。hash里面是一個string類型的key value映射集合,每一個都叫做域。

HMSET key field value [field value ...]

同時將多個 field-value (域-值)對設置到哈希表 key 中。
此命令會覆蓋哈希表中已存在的域。

HSET key field value

將哈希表 key 中的域 field 的值設為 value 。
如果 key 不存在,一個新的哈希表被創建並進行 HSET 操作。
如果域 field 已經存在於哈希表中,舊值將被覆蓋。

HSETNX key field value

將哈希表 key 中的域 field 的值設置為 value ,當且僅當域 field 不存在。
若域 field 已經存在,該操作無效。
如果 key 不存在,一個新哈希表被創建並執行 HSETNX 命令。

就是不能更新操作。

HMGET key field [field ...]

返回哈希表 key 中,一個或多個給定域的值。
如果給定的域不存在於哈希表,那么返回一個 nil 值。
因為不存在的 key 被當作一個空哈希表來處理,所以對一個不存在的 key 進行 HMGET 操作將返回一個只帶有 nil 值的表。

HGET key field

返回哈希表 key 中給定域 field 的值。

HGETALL key

返回哈希表 key 中,所有的域和值。
在返回值里,緊跟每個域名(field name)之后是域的值(value),所以返回值的長度是哈希表大小的兩倍

HEXISTS key field

查看哈希表 key 中,給定域 field 是否存在。
如果哈希表含有給定域,返回 1 。
如果哈希表不含有給定域,或 key 不存在,返回 0 。

HDEL key field [field ...]

刪除域

HKEYS key

返回哈希表 key 中的所有域。

HVALS key

返回哈希表 key 中所有域的值。

HLEN key

返回哈希表 key 中域的數量。

HINCRBY key field increment

為哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以為負數,相當於對給定域進行減法操作。
如果 key 不存在,一個新的哈希表被創建並執行 HINCRBY 命令。
如果域 field 不存在,那么在執行命令前,域的值被初始化為 0 。

HINCRBYFLOAT key field increment

為哈希表 key 中的域 field 加上浮點數增量 increment 。
如果哈希表中沒有域 field ,那么 HINCRBYFLOAT 會先將域 field 的值設為 0 ,然后再執行加法操作。
如果鍵 key 不存在,那么 HINCRBYFLOAT 會先創建一個哈希表,再創建域 field ,最后再執行加法操作。

list

列表的特點就是可以頭部(左邊)或者尾部(右邊)插入。入棧push  出棧pop 操作

LPUSH key value [value ...]

將一個或多個值 value 插入到列表 key 的表頭

如果 key 不存在,一個空列表會被創建並執行 LPUSH 操作。
當 key 存在但不是列表類型時,返回一個錯誤。

LSET key index value

通過索引設置值

LPUSHX key value

將值 value 插入到列表 key 的表頭,當且僅當 key 存在並且是一個列表

RPUSH key value [value ...]

將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
如果 key 不存在,一個空列表會被創建並執行 RPUSH 操作。

RPUSHX key value

將值 value 插入到列表 key 的表尾,當且僅當 key 存在並且是一個列表。

LPOP key

移除並返回列表 key 的頭元素。

RPOP key

移除並返回列表 key 的尾元素。

BLPOP key [key ...] timeout

移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。

BRPOP key [key ...] timeout

移出並獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。

 

RPOPLPUSH source destination

 

移除列表的最后一個元素,並將該元素添加到另一個列表並返回

BRPOPLPUSH source destination timeout

從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。

LINDEX key index

返回列表 key 中,下標為 index 的元素。

LINSERT key BEFORE|AFTER pivot value

將值 value 插入到列表 key 當中,位於值 pivot 之前或之后。
當 pivot 不存在於列表 key 時,不執行任何操作。多個pivot時只操作第一個。
當 key 不存在時, key 被視為空列表,不執行任何操作。
如果 key 不是列表類型,返回一個錯誤。

LLEN key

列表數量。

LREM key count value

移除前count個value值。

LRANGE key start stop

查看范圍段的value。(可以用來分頁)

lrange list 0 5        (第一個到第六個)

LTRIM key start stop

對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。

set

Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重復的數據。

集合除了增刪改操作外,主要的是一些集合的運算操作。

SADD key member [member ...]

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
假如 key 不存在,則創建一個只包含 member 元素作成員的集合。

SCARD key

返回集合 key 的基數(集合中元素的數量)

SISMEMBER key member

判斷 member 元素是否集合 key 的成員。返回1 表示存在  0表示不存在。

SMEMBERS key

返回集合 key 中的所有成員。
不存在的 key 被視為空集合。

SMOVE source destination member

將 member 元素從 source 集合移動到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,並添加到 destination 集合中去。
當 destination 集合已經包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。
當 source 或 destination 不是集合類型時,返回一個錯誤。

SPOP key

移除並返回集合中的一個隨機元素。

如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用 SRANDMEMBER 命令。

SRANDMEMBER key [count]

如果命令執行時,只提供了 key 參數,那么返回集合中的一個隨機元素。

從 Redis 2.6 版本開始, SRANDMEMBER 命令接受可選的 count 參數:
如果 count 為正數,且小於集合基數,那么命令返回一個包含 count 個元素的數組,數組中的元素各不相同。如果 count 大於等於集合基數,那么返回整個集合。
如果 count 為負數,那么命令返回一個數組,數組中的元素可能會重復出現多次,而數組的長度為 count 的絕對值。
該操作和 SPOP 相似,但 SPOP 將隨機元素從集合中移除並返回,而 SRANDMEMBER 則僅僅返回隨機元素,而不對集合進行任何改動。

SREM key member [member ...]

移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
當 key 不是集合類型,返回一個錯誤。

 

 

集合運算

SDIFF key [key ...]

返回一個集合的全部成員,該集合是所有給定集合之間的差集

SDIFFSTORE destination key [key ...]

這個命令的作用和 SDIFF 類似,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。(如果destination不存在  則新建一個)

SINTER key [key ...]

 

返回一個集合的全部成員,該集合是所有給定集合的交集
不存在的 key 被視為空集。
當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。

SDIFFSTORE destination key [key ...]

 

這個命令的作用和 SDIFF 類似,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 集合已經存在,則將其覆蓋。
destination 可以是 key 本身。

SUNION key [key ...]

返回一個集合的全部成員,該集合是所有給定集合的並集
不存在的 key 被視為空集。

SUNIONSTORE destination key [key ...]

這個命令類似於 SUNION 命令,但它將結果保存到 destination 集合,而不是簡單地返回結果集。
如果 destination 已經存在,則將其覆蓋。
destination 可以是 key 本身。

zset

Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。

zset和set操作基本一本,比set多了一點。

ZADD key score member [[score member] [score member] ...] 

將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
如果某個 member 已經是有序集的成員,那么更新這個 member 的 score 值,並通過重新插入這個 member 元素,來保證該 member 在正確的位置上。
score 值可以是整數值或雙精度浮點數。
如果 key 不存在,則創建一個空的有序集並執行 ZADD 操作。
當 key 存在但不是有序集類型時,返回一個錯誤。

ZCARD key

返回有序集 key 的個數。

ZSCORE key member

返回有序集 key 中,成員 member 的 score 值。
如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。

ZCOUNT key min max

返回有序集 key 中, score 值在 min 和 max 之間(默認包括 score 值等於 min 或 max )的成員的數量。
關於參數 min 和 max 的詳細使用方法,請參考 ZRANGEBYSCORE 命令。

ZINCRBY key increment member

為有序集 key 的成員 member 的 score 值加上增量 increment 。
可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
當 key 不是有序集類型時,返回一個錯誤。
score 值可以是整數值或雙精度浮點數。

ZRANGE key start stop [WITHSCORES]

這個可以用來做分頁。

通過索引區間返回有序集合成指定區間內的成員。

返回有序集 key 中,指定區間內的成員。
其中成員的位置按 score 值遞增(從小到大)來排序。
具有相同 score 值的成員按字典序(lexicographical order )來排列。
如果你需要成員按 score 值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。
下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。
你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。
超出范圍的下標並不會引起錯誤。
比如說,當 start 的值比有序集的最大下標還要大,或是 start > stop 時, ZRANGE 命令只是簡單地返回一個空列表。
另一方面,假如 stop 參數的值比有序集的最大下標還要大,那么 Redis 將 stop 當作最大下標來處理。
可以通過使用 WITHSCORES 選項,來讓成員和它的 score 值一並返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
客戶端庫可能會返回一些更復雜的數據類型,比如數組、元組等。

ZREVRANGE key start stop [WITHSCORES]

可以做分頁

返回有序集 key 中,指定區間內的成員。
其中成員的位置按 score 值遞減(從大到小)來排列。
具有相同 score 值的成員按字典序的逆序(reverse lexicographical order)排列。
除了成員按 score 值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。
具有相同 score 值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。
可選的 LIMIT 參數指定返回結果的數量及區間(就像SQL中的 SELECT LIMIT offset, count ),注意當 offset 很大時,定位 offset 的操作可能需要遍歷整個有序集,此過程最壞復雜度為 O(N) 時間。
可選的 WITHSCORES 參數決定結果集是單單返回有序集的成員,還是將有序集成員及其 score 值一起返回。
該選項自 Redis 2.0 版本起可用。

ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

返回有序集 key 中, score 值介於 max 和 min 之間(默認包括等於 max 或 min )的所有的成員。有序集成員按 score 值遞減(從大到小)的次序排列。
具有相同 score 值的成員按字典序的逆序(reverse lexicographical order )排列。
除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。

ZRANK key member

返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞增(從小到大)順序排列。
排名以 0 為底,也就是說, score 值最小的成員排名為 0 。
使用 ZREVRANK 命令可以獲得成員按 score 值遞減(從大到小)排列的排名。

ZREVRANK key member

返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞減(從大到小)排序。
排名以 0 為底,也就是說, score 值最大的成員排名為 0 。
使用 ZRANK 命令可以獲得成員按 score 值遞增(從小到大)排列的排名。

ZLEXCOUNT KEY MIN MAX

計算有序集合中指定字典區間內成員數量。

ZREM key member [member ...]

移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。
當 key 存在但不是有序集類型時,返回一個錯誤。

ZREMRANGEBYRANK key start stop

移除有序集 key 中,指定排名(rank)區間內的所有成員。
區間分別以下標參數 start 和 stop 指出,包含 start 和 stop 在內。
下標參數 start 和 stop 都以 0 為底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。
你也可以使用負數下標,以 -1 表示最后一個成員, -2 表示倒數第二個成員,以此類推。

ZREMRANGEBYSCORE key min max

移除有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。
自版本2.1.6開始, score 值等於 min 或 max 的成員也可以不包括在內,詳情請參見 ZRANGEBYSCORE 命令。

 

 

下面 集合運算

ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

計算給定的一個或多個有序集的交集其中給定 key 的數量必須以 numkeys 參數指定,並將該交集(結果集)儲存到 destination 。
默認情況下,結果集中某個成員的 score 值是所有給定集下該成員 score 值之和.
關於 WEIGHTS 和 AGGREGATE 選項的描述,參見 ZUNIONSTORE 命令。

ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 參數指定,並將該並集(結果集)儲存到 destination 。
默認情況下,結果集中某個成員的 score 值是所有給定集下該成員 score 值之 和 。
WEIGHTS
使用 WEIGHTS 選項,你可以為 每個 給定有序集 分別 指定一個乘法因子(multiplication factor),每個給定有序集的所有成員的 score 值在傳遞給聚合函數(aggregation function)之前都要先乘以該有序集的因子
如果沒有指定 WEIGHTS 選項,乘法因子默認設置為 1 。
AGGREGATE
使用 AGGREGATE 選項,你可以指定並集的結果集的聚合方式。
默認使用的參數 SUM ,可以將所有集合中某個成員的 score 值之 和 作為結果集中該成員的 score 值;使用參數 MIN ,可以將所有集合中某個成員的 最小 score 值作為結果集中該成員的 score 值;而參數 MAX 則是將所有集合中某個成員的 最大 score 值作為結果集中該成員的 score 值。

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。 基數估計就是在誤差可接受的范圍內,快速計算基數。

 

PFADD key element [element ...]

將元素參數添加到 HyperLogLog 數據結構中。重復的元素不能插進去。(也就是取到基數)

PFCOUNT key [key ...]

返回給定 HyperLogLog 的基數值(插入的個數),如果多個 HyperLogLog 則返回基數估值之和。

PFMERGE destkey sourcekey [sourcekey ...]

將多個 HyperLogLog 合並為一個 HyperLogLog ,合並后的 HyperLogLog 的基數估算值是通過對所有 給定 HyperLogLog 進行並集計算得出的。

發布訂閱

可以作為消息隊列中間件 MQ。其他重型中間件有有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。

Pub/Sub 從字面上理解就是發布(Publish)與訂閱(Subscribe),在Redis中,你可以設定對某一個key值進行消息發布及消息訂閱,當一個key值上進行了消息發布后,所有訂閱它的客戶端都會收到相應的消息。

發布訂閱就像收音機一樣。里面有很多電台,然后很多人拿着收音機收聽電台。

Redis 的 SUBSCRIBE 命令可以讓客戶端訂閱任意數量的頻道, 每當有新信息發送到被訂閱的頻道時, 信息就會被發送給所有訂閱指定頻道的客戶端。

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

digraph pubsub_relation {

    rankdir = BT;

    node [style = filled];

    edge [style = bold];

    channel1 [label = "channel1", fillcolor = "#A8E270"];

    node [shape = box, fillcolor = "#95BBE3"];

    client2 [label = "client2"];
    client5 [label = "client5"];
    client1 [label = "client1"];

    client2 -> channel1 [label = "subscribe"];
    client5 -> channel1 [label = "subscribe"];
    client1 -> channel1 [label = "subscribe"];
}

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

digraph send_message_to_subscriber {
    
    node [style = filled];

    edge [style = "dashed, bold"];
    
    message [label = "PUBLISH channel1 message", shape = plaintext, fillcolor = "#FADCAD"];

    message -> channel1 [color = "#B22222]"];

    channel1 [label = "channel1", fillcolor = "#A8E270"];

    node [shape = box];

    client2 [label = "client2", fillcolor = "#95BBE3"];
    client5 [label = "client5", fillcolor = "#95BBE3"];
    client1 [label = "client1", fillcolor = "#95BBE3"];

    /*
    client2 -> channel1 [label = "subscribe"];
    client5 -> channel1 [label = "subscribe"];
    client1 -> channel1 [label = "subscribe"];
    */

    channel1 -> client2 [label = "message", color = "#B22222"];
    channel1 -> client5 [label = "message", color = "#B22222"];
    channel1 -> client1 [label = "message", color = "#B22222"];
}

在后面的內容中, 我們將探討 SUBSCRIBE 和 PUBLISH 命令的實現, 以及這套訂閱與發布機制的運作原理。

SUBSCRIBE channel [channel ...]

訂閱一個或者多個頻道。

 subscribe channel1 channel2

 PSUBSCRIBE pattern [pattern ...]

訂閱一個或多個符合給定模式的頻道。
每個模式以 * 作為匹配符,比如 it* 匹配所有以 it 開頭的頻道( itnews 、 it.blog 、 ittweets 等等), news.* 匹配所有以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類。

 

PUBLISH channel message

將信息 message 發送到指定的頻道 channel 。

UNSUBSCRIBE [channel [channel ...]]

指示客戶端退訂給定的頻道。
如果沒有頻道被指定,也即是,一個無參數的 UNSUBSCRIBE 調用被執行,那么客戶端使用 SUBSCRIBE 命令訂閱的所有頻道都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的頻道。

PUNSUBSCRIBE [pattern [pattern ...]]

指示客戶端退訂所有給定模式。
如果沒有模式被指定,也即是,一個無參數的 PUNSUBSCRIBE 調用被執行,那么客戶端使用 PSUBSCRIBE 命令訂閱的所有模式都會被退訂。在這種情況下,命令會返回一個信息,告知客戶端所有被退訂的模式。

 PUBSUB <subcommand> [argument [argument ...]]

 查看訂閱與發布系統狀態,它由數個不同格式的子命令組成。

推薦文章:

http://redisbook.readthedocs.io/en/latest/feature/pubsub.html

https://www.cnblogs.com/yitudake/p/6747995.html

http://blog.csdn.net/fly910905/article/details/78495971

http://blog.csdn.net/cws1214/article/details/52922267

事物

redis事物簡介鎖事物

redis中把事物把所有命令序列化 放入隊列緩存 然后按順序執行,事物執行過程中不會接受其他命令執行。

事物執行過程

開始事物

命令隊列

執行事務

MULTI

標記一個事務塊的開始。
事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由 EXEC 命令原子性(atomic)地執行。

EXEC

執行所有事務塊內的命令。
假如某個(或某些) key 正處於 WATCH 命令的監視之下,且事務塊中有和這個(或這些) key 相關的命令,那么 EXEC 命令只在這個(或這些) key 沒有被其他命令所改動的情況下執行並生效,否則該事務被打斷(abort)。(所有受監控的鍵都沒有被修改時,才會執行事務)

 WATCH key [key ...]

監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。(就像單例模式中的設計一樣)

 

看完官方解釋和官方demo並沒有什么卵用,感覺還是不懂。

其實exec的時候,只有監控的值沒有被修改(在事物里面修改的不算)才能執行事物。監控過期的鍵也是會執行事務的。

WATCH命令可以被調用多次。簡單說來,所有的WATCH命令都會在被調用之時立刻對相應的鍵進行監控,直到EXEC命令被調用之時為止(不管事物是否被終止)。你可以在單條的WATCH命令之中,使用任意數量的鍵作為命令參數。

 當執行完exec后,會自動釋放所有的watch

 

 

UNWATCH

取消 WATCH 命令對所有 key 的監視。
如果在執行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被執行了的話,那么就不需要再執行 UNWATCH 了。
因為 EXEC 命令會執行事務,因此 WATCH 命令的效果已經產生了;而 DISCARD 命令在取消事務的同時也會取消所有對 key 的監視,因此這兩個命令執行之后,就沒有必要執行 UNWATCH 了。

DISCARD

取消事務,放棄執行事務塊內的所有命令。
如果正在使用 WATCH 命令監視某個(或某些) key,那么取消所有監視,等同於執行命令 UNWATCH 。(因為不執行exec了,所以他也要釋放所有監控)

 

異常處理

事物執行過程中會有兩種類型的異常,第一種放入隊列中時發生異常,第二種在執行過程中發生異常。

第一種:當把命令放入隊列中的時候發生錯誤。

這一種是很簡單的語法檢查。命令名字、參數數量、臨界值等(編譯時  編譯器可以檢查出來。)

處理結果:事物中所有的命令都不執行。

 

第二種:執行過程中發生錯誤(redis事物不支持回滾)。

exec執行后逐行的執行 加入隊列的命令時,例如對一些類型使用了錯誤的操作執行(運行時錯誤)

處理結果:錯誤的命令不執行,正確的命令照常執行,即使出現錯誤,中間不會終止,會把所有出現的錯誤記錄下來,最后返回回來。

不支持回滾

上面說到錯誤的時候,已經說了不支持回滾,  所以生產環境  一定要理清邏輯,不要出現邏輯性錯誤。

推薦文章:https://www.cnblogs.com/kyrin/p/5967620.html

服務連接

Redis客戶端連接服務器。

使用redis自帶客戶端redis-cli.exe

啟動bat文件指令

 redis-cli.exe -h 127.0.0.1 -p 8888  -a 123456

-h服務器地址           -p端口              -a密碼

 使用第三方客戶端Redis Desk Manager

 

缺點,有很多數據類型操作不能用。

客戶端指令

 

推薦學習網站:

http://www.runoob.com/redis/redis-tutorial.html

http://www.redis.net.cn/order/

http://doc.redisfans.com/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM