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” 的特性。