最全面的Redis命令行查閱手冊(收藏查看)


 

Redis是用C語言實現的,一般來說C語言實現的程序“距離”操作系統更近,執行速度相對會更快。

Redis使用了單線程架構,預防了多線程可能產生的競爭問題。

作者對於Redis源代碼可以說是精打細磨,曾經有人評價Redis是少有的集性能和優雅於一身的開源代碼。

本文比較詳細且全面的梳理了Redis使用過程中涉及的全部增刪改查!

1.字符串

1.設置鍵

set key value [ex seconds] [px milliseconds] [nx|xx] setex key seconds value setnx key value
  • ex seconds:為鍵設置秒級過期時間。
  • px milliseconds:為鍵設置毫秒級過期時間。
  • nx:鍵必須不存在,才可以設置成功,用於添加。
  • xx:與nx相反,鍵必須存在,才可以設置成功,用於更新。

2.批量設置值

mset key value [key value ...]

3.批量獲取值

mget key [key ...]

4.計數

incr key
  • 值不是整數,返回錯誤。
  • 值是整數,返回自增后的結果。
  • 鍵不存在,按照值為0自增,返回結果為1

decr(自減)、incrby(自增指定數字)、
decrby(自減指定數字)、incrbyfloat(自增浮點數)

4.追加值

append key value

5.字符串長度

strlen key

6.設置並返回原值

getset key value

7.設置指定位置的字符

setrange key offeset value

8.獲取部分字符串

getrange key start end

2.哈希

1.設置值

hset key field value

2.獲取值

hget key field

3.刪除filed

hdel key field [field ...]

4.計算field個數

hlen key

5.批量設置或獲取field-value

hmget key field [field ...] hmset key field value [field value ...]

6.判斷field是否存在

hexists key field

7.獲取所有field

hkeys key

8.獲取所有value

hvals key

9.獲取所有的field-value

hgetall key

10.hincrby hincrbyfloat

hincrby key field hincrbyfloat key field

11.計算value的字符串長度

hstrlen key field

3.列表

1)添加

left/right

1.從右邊插入元素

rpush key value [value ...]

lrange listkey 0 -1 可以從左到右獲取列表的所有元素

2.從左邊插入元素

lpush key value [value ...]

3.向某個元素前或者后插入元素

linsert key before|after pivot value

2)查找

1.獲取指定范圍內的元素列表

lrange key start end

2.獲取列表指定索引下標的元素

lindex key index

3.獲取列表長度

llen key

3)刪除

1.從列表左側彈出元素

lpop key

2.從列表右側彈出

rpop key

3.刪除指定元素

lrem key count value
  • count>0,從左到右,刪除最多count個元素。
  • count<0,從右到左,刪除最多count絕對值個元素。
  • count=0,刪除所有。

4.按照索引范圍修剪列表

ltrim key start end

4)修改

修改指定索引下標的元素

lset key index newValue

5)阻塞操作

blpop key [key ...] timeout brpop key [key ...] timeout
  • key[key...]:多個列表的鍵
  • timeout:阻塞時間(單位:秒)

開發技巧

  • lpush+lpop=Stack(棧)
  • lpush+rpop=Queue(隊列)
  • lpsh+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息隊列)

4.集合

集合(set)類型也是用來保存多個的字符串元素,但和列表類型不一樣的是,集合中不允許有重復元素,並且集合中的元素是無序的,不能通過索引下標獲取元素。

1.添加元素

sadd key element [element ...]

2.刪除元素

srem key element [element ...]

3.計算元素個數

scard key

4.判斷元素是否在集合中

sismember key element

5.隨機從集合返回指定個數元素

srandmember key [count]

6.從集合隨機彈出元素

spop key

7.獲取所有元素

smembers key

8.求多個集合的交集

sinter key [key ...]

9.求多個集合的並集

suinon key [key ...]

10.求多個集合的差集

sdiff key [key ...]

11.將交集、並集、差集的結果保存

sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...]

三個命令(原命令+store)將集合間交集、並集、差集的結果保存在destination中

5.有序集合

1.添加成員

zadd key score member [score member ...]

Redis3.2為zadd命令添加了nx、xx、ch、incr四個選項:

  • nx:member必須不存在,才可以設置成功,用於添加。
  • xx:member必須存在,才可以設置成功,用於更新。
  • ch:返回此次操作后,有序集合元素和分數發生變化的個數。
  • incr:對score做增加,相當於后面介紹的zincrby。

2.計算成員個數

zcard key

3.計算某個成員的分數

zscore key member

4.計算成員的排名

zrank key member zrevrank key member

5.刪除成員

zrem key member [member ...]

6.增加成員的分數

zincrby key increment member zincrby user:ranking 9 tom

7.返回指定排名范圍的成員

zrange key start end [withscores] zrevrange key start end [withscores]

zrange是從低到高返回,zrevrange反之。

8.返回指定分數范圍的成員

zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores] [limit offset count]

其中zrangebyscore按照分數從低到高返回,zrevrangebyscore反之。

同時min和max還支持開區間(小括號)和閉區間(中括號),-inf和+inf分別代表無限小和無限大。

9.返回指定分數范圍成員個數

zcount key min max

10.刪除指定排名內的升序元素

zremrangebyrank key start end

11.刪除指定分數范圍的成員

zremrangebyscore key min max

12.交集

zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
  • destination:交集計算結果保存到這個鍵。
  • numkeys:需要做交集計算鍵的個數。
  • key[key...]:需要做交集計算的鍵。
  • weights weight[weight...]:每個鍵的權重,在做交集計算時,每個鍵中的每個member會將自己分數乘以這個權重,每個鍵的權重默認是1。
  • aggregate sum|min|max:計算成員交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做匯總,默認值是sum。
zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 weights 1 0.5 aggregate max

13.並集

zunionstore destination numkeys key [key ...] [weights weight [weight ...]][aggregate sum|min|max]

6.鍵管理

鍵重命名

rename key newkey

隨機返回一個鍵

randomkey

7.鍵過期

  • expire key seconds:鍵在seconds秒后過期。
  • expireat key timestamp:鍵在秒級時間戳timestamp后過期。
set hello world expire hello 10 ttl hello

通過ttl觀察它的過期剩余時間(s),返回結果為-2時,代表已被刪除。

ttl 和 ptll都可以查詢鍵的剩余時間,但是pttl的精度可以達到毫秒級別,有3種返回值:

  • 大於等於0的整數:鍵剩余的過期時間(ttl是秒,pttl是毫秒)
  • -1:鍵沒有設置過期時間
  • -2:鍵不存在

expireat命令可以設置鍵的秒級過期時間戳,例如如果需要將鍵hello在2016-08-0100:00:00(秒級時間戳為1469980800)過期,可以執行如下操作:

expireat hello 1469980800

除此之外,Redis2.6版本后提供了毫秒級的過期方案:

  • pexpire key milliseconds:鍵在milliseconds毫秒后過期。
  • pexpireat key milliseconds-timestamp鍵在毫秒級時間戳timestamp后過
    期。

但無論是使用過期時間還是時間戳,秒級還是毫秒級,在Redis內部最終使用的都是pexpireat。

  1. 如果expire key的鍵不存在,返回結果為0
  2. 如果過期時間為負值,鍵會立即被刪除,猶如使用del命令一樣
  3. persist命令可以將鍵的過期時間清除:persist hello
  4. 對於字符串類型鍵,執行set命令會去掉過期時間
  5. Redis不支持二級數據結構(例如哈希、列表)內部元素的過期功能,例如不能對列表類型的一個元素做過期時間設置
  6. setex命令作為set+expire的組合,不但是原子執行,同時減少了一次網絡通訊的時間。

8.遷移鍵

1)move key db

僅限於內部數據庫的遷移

2)dump+restore

dump key
restore key ttl value

分為兩步:

1.在源Redis上,dump命令會將鍵值序列化,格式采用的是RDB格式。

2.在目標Redis上,restore命令將上面序列化的值進行復原,其中ttl參數代表過期時間,如果ttl=0代表沒有過期時間。

示例:

1在源Redis上執行dump:

127.0.0.1:6379> set hello world OK 127.0.0.1:6379> dump hello "\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa"

2在目標Redis上執行restore

127.0.0.1:6379> get hello (nil) 127.0.0.1:6379> restore hello 0 "\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa" OK 127.0.0.1:6379> get hello "world"

上面兩步對應的偽代碼為

Redis sourceRedis = new Redis("sourceMachine", 6379); Redis targetRedis = new Redis("targetMachine", 6379); targetRedis.restore("hello", 0, sourceRedis.dump(key));

3)migrate(推薦)

migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key]]

下面對migrate的參數進行逐個說明:

  • host:目標Redis的IP地址。
  • port:目標Redis的端口。
  • key|"":在Redis3.0.6版本之前,migrate只支持遷移一個鍵,所以此處是
    要遷移的鍵,但Redis3.0.6版本之后支持遷移多個鍵,如果當前需要遷移多個鍵,此處為空字符串""。
  • destination-db:目標Redis的數據庫索引,例如要遷移到0號數據庫,這里就寫0。
  • timeout:遷移的超時時間(單位為毫秒)。
  • [copy]:如果添加此選項,遷移后並不刪除源鍵。
  • [replace]:如果添加此選項,migrate不管目標Redis是否存在該鍵都會
    正常遷移進行數據覆蓋。
  • [keys key[key...]]:遷移多個鍵,例如要遷移key1、key2、key3,此處填
    寫“keys key1 key2 key3”。

第一,整個過程是原子執行的,不需要在多個Redis實例上開啟客戶端的,只需要在源Redis上執行migrate命令即可。

第二,migrate命令的數據傳輸直接在源Redis和目標Redis上完成的。

第三,目標Redis完成restore后會發送OK給源Redis,源Redis接收后會根據migrate對應的選項來決定是否在源Redis上刪除對應的鍵。

示例:

1源Redis有,目標沒有

migrate 127.0.0.1 6380 hello 0 1000

2源Redis和目標Redis都有鍵hello

migrate 127.0.0.1 6379 hello 0 1000 replace

源Redis批量添加多個鍵

mset key1 value1 key2 value2 key3 value3

源Redis執行如下命令完成多個鍵的遷移

migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3

9.遍歷鍵

1)全量遍歷鍵

keys pattern

示例:

keys *
  • *代表任意字符
  • ?代表一個字符
  • []代表匹配部分字符,例如[1,3]代表匹配1,3
  • \x用來做轉義,例如要匹配星號、問號需要進行轉義

如果Redis包含了大量的鍵,執行keys命令很可能會造成Redis阻塞,所以一般建議不要在生產環境下使用keys命令。

2)漸進式遍歷

每次執行scan,可以想象成只掃描一個字典中的一部分鍵,直到將字典中的所有鍵遍歷完畢。

scan cursor [match pattern] [count number]
  • cursor是必需參數,實際上cursor是一個游標,第一次遍歷從0開始,每次scan遍歷完都會返回當前游標的值,直到游標值為0,表示遍歷結束。

  • match pattern是可選參數,它的作用的是做模式的匹配,這點和keys的模式匹配很像。

  • count number是可選參數,它的作用是表明每次要遍歷的鍵個數,默認值是10,此參數可以適當增大。

10.數據庫管理

1.切換數據庫

select dbIndex

默認有16個

2.flushdb/flushall

flushdb只清除當前數據庫,flushall會清除所有數據庫。

11.慢查詢分析

所謂慢查詢日志就是系統在命令執行前后計算每條命令的執行時間,當超過預設閥值,就將這條命令的相關信息(例如:發生時間,耗時,命令的詳細信息)記錄下來。慢查詢功能可以有效地幫助我們找到Redis可能存在的瓶頸.

12.Pipeline

Pipeline(流水線)機制它能將一組Redis命令進行組裝,通過一次RTT傳輸給Redis,再將這組Redis命令的執行結果按順序返回給客戶端。

13.事務

熟悉關系型數據庫的讀者應該對事務比較了解,簡單地說,事務表示一組動作,要么全部執行,要么全部不執行。

Redis提供了簡單的事務功能,將一組需要一起執行的命令放到multi和exec兩個命令之間。如果要停止事務的執行,可以使用discard命令代替exec命令即可。

14.關機

shutdown

Redis關閉的過程:斷開與客戶端的連接、持久化文件生成,是一種相對優雅的關閉方式。

也可以kill掉,但不要kill -9,shutdown參數有nosave|save

15.安全

設置密碼("":無)

config set requirepass "password"

登錄

auth "password"

獲取密碼

config get requirepass

16.持久化

所有的數據都存在內存中,從內存當中同步到硬盤上,這個過程叫做持久化過程。
持久化操作,兩種方式:rdb方式、aof方式,可以單獨使用或者結合使用。

RDB持久化方式能夠在指定的時間間隔能對你的數據進行快照存儲.

AOF持久化方式記錄每次對服務器寫的操作,當服務器重啟的時候會重新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操作到文件末尾。Redis還能對AOF文件進行后台重寫,使得AOF文件的體積不至於過大。

RDB配置

在redis.conf中的配置

save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir ./

意思是在900秒內有1個key發生變化,就寫一次硬盤。

Linux保存在 redis.conf 同級目錄

AOF配置

# 默認不開啟AOF appendonly no #使用改成yes  # 同步策略 # appendfsync always #修改一次 (推薦) appendfsync everysec #每秒同步 # appendfsync no #不同步

配置完記得重啟!


免責聲明!

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



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