redis基本操作命令

redis基本操作命令

redis是一個(gè)key-value存儲(chǔ)系統(tǒng)。和Memcached類似,它支持存儲(chǔ)的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是redis會(huì)周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。

一:redis鍵值對的管理和操作

1 DEL key
該命令用于在 key 存在時(shí)刪除 key。
2 DUMP key
序列化給定 key ,并返回被序列化的值。
3 EXISTS key
檢查給定 key 是否存在。
4 EXPIRE key seconds
為給定 key 設(shè)置過期時(shí)間。
5 EXPIREAT key timestamp
EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設(shè)置過期時(shí)間。 不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳(unix timestamp)。
6 PEXPIRE key milliseconds
設(shè)置 key 的過期時(shí)間以毫秒計(jì)。
7 PEXPIREAT key milliseconds-timestamp
設(shè)置 key 過期時(shí)間的時(shí)間戳(unix timestamp) 以毫秒計(jì)
8 KEYS pattern
查找所有符合給定模式( pattern)的 key 。
9 MOVE key db
將當(dāng)前數(shù)據(jù)庫的 key 移動(dòng)到給定的數(shù)據(jù)庫 db 當(dāng)中。
10 PERSIST key
移除 key 的過期時(shí)間,key 將持久保持。
11 PTTL key
以毫秒為單位返回 key 的剩余的過期時(shí)間。
12 TTL key
以秒為單位,返回給定 key 的剩余生存時(shí)間(TTL, time to live)。
13 RANDOMKEY
從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key 。
14 RENAME key newkey
修改 key 的名稱
15 RENAMENX key newkey
僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey 。
16 TYPE key
返回 key 所儲(chǔ)存的值的類型。

二:redis哈希的操作

HDEL key field2 [field2] 
刪除一個(gè)或多個(gè)哈希表字段
HEXISTS key field 
查看哈希表 key 中,指定的字段是否存在。
HGET key field 
獲取存儲(chǔ)在哈希表中指定字段的值。
HGETALL key 
獲取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment 
為哈希表 key 中的指定字段的整數(shù)值加上增量 increment 。
HINCRBYFLOAT key field increment 
為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment 。
HKEYS key 
獲取所有哈希表中的字段
HLEN key 
獲取哈希表中字段的數(shù)量
HMGET key field1 [field2] 
獲取所有給定字段的值
HMSET key field1 value1 [field2 value2 ] 
同時(shí)將多個(gè) field-value (域-值)對設(shè)置到哈希表 key 中。
HSET key field value 
將哈希表 key 中的字段 field 的值設(shè)為 value 。
HSETNX key field value 
只有在字段 field 不存在時(shí),設(shè)置哈希表字段的值。
HVALS key 
獲取哈希表中所有值HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。

三:redis列表操作

BLPOP key1 [key2 ] timeout 
移出并獲取列表的第一個(gè)元素, 如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
BRPOP key1 [key2 ] timeout 
移出并獲取列表的最后一個(gè)元素, 如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
BRPOPLPUSH source destination timeout 
從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它; 如果列表沒有元素會(huì)阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止。
LINDEX key index 
通過索引獲取列表中的元素
LINSERT key BEFORE|AFTER pivot value 
在列表的元素前或者后插入元素
LLEN key 
獲取列表長度
LPOP key 
移出并獲取列表的第一個(gè)元素
LPUSH key value1 [value2] 
將一個(gè)或多個(gè)值插入到列表頭部
LPUSHX key value 
將一個(gè)或多個(gè)值插入到已存在的列表頭部
LRANGE key start stop 
獲取列表指定范圍內(nèi)的元素
LREM key count value 
移除列表元素
LSET key index value 
通過索引設(shè)置列表元素的值
LTRIM key start stop 
對一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除。
RPOP key 
移除并獲取列表最后一個(gè)元素
RPOPLPUSH source destination 
移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回
RPUSH key value1 [value2] 
在列表中添加一個(gè)或多個(gè)值
RPUSHX key value 
為已存在的列表添加值

四:redis集合

SADD key member1 [member2] 
向集合添加一個(gè)或多個(gè)成員
SCARD key 
獲取集合的成員數(shù)
SDIFF key1 [key2] 
返回給定所有集合的差集
SDIFFSTORE destination key1 [key2] 
返回給定所有集合的差集并存儲(chǔ)在 destination 中
SINTER key1 [key2] 
返回給定所有集合的交集
SINTERSTORE destination key1 [key2] 
返回給定所有集合的交集并存儲(chǔ)在 destination 中
SISMEMBER key member 
判斷 member 元素是否是集合 key 的成員
SMEMBERS key 
返回集合中的所有成員
SMOVE source destination member 
將 member 元素從 source 集合移動(dòng)到 destination 集合
SPOP key 
移除并返回集合中的一個(gè)隨機(jī)元素
SRANDMEMBER key [count] 
返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)
SREM key member1 [member2] 
移除集合中一個(gè)或多個(gè)成員
SUNION key1 [key2] 
返回所有給定集合的并集
SUNIONSTORE destination key1 [key2] 
所有給定集合的并集存儲(chǔ)在 destination 集合中
SSCAN key cursor [MATCH pattern] [COUNT count] 
迭代集合中的元素

五:有序集合

ZADD key score1 member1 [score2 member2] 
向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
ZCARD key 
獲取有序集合的成員數(shù)
ZCOUNT key min max 
計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)
ZINCRBY key increment member 
有序集合中對指定成員的分?jǐn)?shù)加上增量 increment
ZINTERSTORE destination numkeys key [key ...] 
計(jì)算給定的一個(gè)或多個(gè)有序集的交集并將結(jié)果集存儲(chǔ)在新的有序集合 key 中
ZLEXCOUNT key min max 
在有序集合中計(jì)算指定字典區(qū)間內(nèi)成員數(shù)量
ZRANGE key start stop [WITHSCORES] 
通過索引區(qū)間返回有序集合成指定區(qū)間內(nèi)的成員
ZRANGEBYLEX key min max [LIMIT offset count] 
通過字典區(qū)間返回有序集合的成員
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 
通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員
ZRANK key member 
返回有序集合中指定成員的索引
ZREM key member [member ...] 
移除有序集合中的一個(gè)或多個(gè)成員
ZREMRANGEBYLEX key min max 
移除有序集合中給定的字典區(qū)間的所有成員
ZREMRANGEBYRANK key start stop 
移除有序集合中給定的排名區(qū)間的所有成員
ZREMRANGEBYSCORE key min max 
移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員
ZREVRANGE key start stop [WITHSCORES] 
返回有序集中指定區(qū)間內(nèi)的成員,通過索引,分?jǐn)?shù)從高到底
ZREVRANGEBYSCORE key max min [WITHSCORES] 
返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序
ZREVRANK key member 
返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序
ZSCORE key member 
返回有序集中,成員的分?jǐn)?shù)值
ZUNIONSTORE destination numkeys key [key ...] 
計(jì)算給定的一個(gè)或多個(gè)有序集的并集,并存儲(chǔ)在新的 key 中
ZSCAN key cursor [MATCH pattern] [COUNT count] 
迭代有序集合中的元素(包括元素成員和元素分值)

六:redis事物的實(shí)現(xiàn)

DISCARD 
取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所有命令。
EXEC 
執(zhí)行所有事務(wù)塊內(nèi)的命令。
MULTI 
標(biāo)記一個(gè)事務(wù)塊的開始。
UNWATCH 
取消 WATCH 命令對所有 key 的監(jiān)視。
WATCH key [key ...] 
監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷。

Redis 事務(wù)

事務(wù)相關(guān)命令

MULTI

自1.2.0可用。

時(shí)間復(fù)雜度:O(1)。

語法:MULTI

說明:

標(biāo)記一個(gè)事務(wù)塊的開始。

事務(wù)塊內(nèi)的多條命令會(huì)按照先后順序被放進(jìn)一個(gè)隊(duì)列當(dāng)中,最后由 EXEC 命令原子性(atomic)地執(zhí)行。

返回值:

總是返回 OK

示例:

# 下面命令在 客戶端1 中執(zhí)行
coderknock> MULTI
OK
coderknock> SET testMULTI 0
QUEUED
coderknock> INCR testMULTI
QUEUED
coderknock> INCR testMULTI
QUEUED
coderknock> INCR testMULTI
QUEUED

# 這個(gè)時(shí)候從另一個(gè) 客戶端(我們稱呼為客戶端2) 執(zhí)行以下:
coderknock> GET testMULTI
(nil)
# 此時(shí)我們可以看到 客戶端1 的命令還沒有執(zhí)行
# 下面切換到 客戶端1 執(zhí)行 EXEC
coderknock> EXEC
1) OK
2) (integer) 1
3) (integer) 2
4) (integer) 3
# 此時(shí)在 客戶端2 中就可以訪問到 該數(shù)據(jù)了
coderknock> GET testMULTI
"3"

DISCARD

自2.0.0可用。

時(shí)間復(fù)雜度:O(1)。

語法:DISCARD

說明:

取消事務(wù),放棄執(zhí)行事務(wù)塊內(nèi)的所有命令。

如果正在使用 WATCH 命令監(jiān)視某個(gè)(或某些) key,那么取消所有監(jiān)視,等同于執(zhí)行命令 UNWATCH 。

返回值:

總是返回 OK

示例:

# 當(dāng)沒有事務(wù)開啟時(shí)
coderknock> DISCARD
(error) ERR DISCARD without MULTI

coderknock> MULTI
OK
# ping 用來查詢狀態(tài) 測試該客戶端處于隊(duì)列狀態(tài)(開啟事務(wù)時(shí)命令只是裝入隊(duì)列并不會(huì)執(zhí)行)
coderknock> PING
QUEUED
coderknock> SET testDISCARD
(error) ERR wrong number of arguments for 'set' command
coderknock> SET testDISCARD a
QUEUED
# 退出事務(wù)
coderknock> DISCARD
OK
# 狀態(tài)恢復(fù)正常狀態(tài)
coderknock> PING
PONG
# 事務(wù)中的命令沒有執(zhí)行
coderknock> GET testDISCARD
(nil)

WATCH

自2.2.0可用。

時(shí)間復(fù)雜度:O(1)。

語法:WATCH key [key ...]

說明:

監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動(dòng),那么事務(wù)將被打斷。

返回值:

總是返回 OK

UNWATCH

自2.2.0可用。

時(shí)間復(fù)雜度:O(1)。

語法:UNWATCH

說明:

取消 WATCH 命令對所有 key 的監(jiān)視。

如果在執(zhí)行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被執(zhí)行了的話,那么就不需要再執(zhí)行 UNWATCH 了。

因?yàn)?EXEC 命令會(huì)執(zhí)行事務(wù),因此 WATCH 命令的效果已經(jīng)產(chǎn)生了;而 DISCARD 命令在取消事務(wù)的同時(shí)也會(huì)取消所有對 key 的監(jiān)視,因此這兩個(gè)命令執(zhí)行之后,就沒有必要執(zhí)行 UNWATCH 了。

返回值:

總是返回 OK

EXEC

自1.2.0可用。

時(shí)間復(fù)雜度:事務(wù)塊內(nèi)所有命令的時(shí)間復(fù)雜度的總和。

語法:EXEC

說明:

執(zhí)行所有事務(wù)塊內(nèi)的命令。

假如某個(gè)(或某些) key 正處于 WATCH 命令的監(jiān)視之下,且事務(wù)塊中有和這個(gè)(或這些) key 相關(guān)的命令,那么 EXEC 命令只在這個(gè)(或這些) key 沒有被其他命令所改動(dòng)的情況下執(zhí)行并生效,否則該事務(wù)被打斷(abort)。

返回值:

事務(wù)塊內(nèi)所有命令的返回值,按命令執(zhí)行的先后順序排列。

當(dāng)操作被打斷時(shí),返回空值 nil

示例:

# 在 MULTI 命令的實(shí)例中我們演示了事務(wù)正常執(zhí)行的情況
# 客戶端1
# 使用 WATCH 監(jiān)視 key 且正常執(zhí)行成功
coderknock> WATCH testWATCH
OK
coderknock> MULTI
OK
coderknock> SET testWATCH 2123
QUEUED
coderknock> EXEC
1) OK
# 使用 WATCH 監(jiān)視 key 且未正常執(zhí)行
coderknock> WATCH testWATCH
OK
coderknock> SET testWATCH a
OK
coderknock> GET test WATCH
(error) ERR wrong number of arguments for 'get' command
coderknock> GET testWATCH
"a"
coderknock> DEL testWATCH
(integer) 1
coderknock> MUTLI
(error) ERR unknown command 'MUTLI'
coderknock> MULTI
OK
coderknock> SET testWATCH a
QUEUED
coderknock> SET testWATCH ccc
QUEUED
# 客戶端2
coderknock> SET testWATCH abc
OK
# 客戶端1
coderknock> EXEC
(nil)
coderknock> GET testWATCH
"abc"
# 只要有在 WATCH 之后在非事務(wù)中對 key 有操作就不可以,無論是你哪個(gè)客戶端
coderknock> WATCH testWATCH
OK
coderknock> SET testWATCH a
OK
coderknock> MULTI
OK
coderknock> SET testWATCH qwe
QUEUED
coderknock> EXEC
(nil)
# 語法錯(cuò)誤會(huì)造成整個(gè)事務(wù)無法執(zhí)行
coderknock> WATCH testWATCH
OK
coderknock> MULTI
OK
coderknock> SET testWATCH aaa
QUEUED
coderknock> EXEC \
    (error) ERR unknown command 'EXEC\'
coderknock> EXEC
(error) EXECABORT Transaction discarded because of previous errors.

事務(wù)中錯(cuò)誤處理

  • 語法錯(cuò)誤會(huì)造成整個(gè)事務(wù)無法執(zhí)行(示例中 EXEC 命令錯(cuò)誤)
  • 運(yùn)行時(shí)錯(cuò)誤:非語法錯(cuò)誤,只是使用命令方式不正確比如使用 SADD 操作字符類型等等,只是錯(cuò)誤部分報(bào)錯(cuò),其他正常執(zhí)行,且最后不會(huì)回滾事務(wù)。

Redis 提供了簡單的事務(wù),之所以說它簡單,主要是因?yàn)樗恢С质聞?wù)中的回滾特性,同時(shí)無法實(shí)現(xiàn)命令之間的邏輯關(guān)系計(jì)算,當(dāng)然也體現(xiàn)了 Redis 的 “keep it simple” 的特性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,204評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內(nèi)容