Redis常用命令與常用配置速查手冊

國貓發表於2019-05-08

在bin下的可執行檔案

  • redis-server :Redis的服務端
  • redis-cli :命令列客戶端
  • redis-benchmark :Redis效能測試工具
  • redis-check-aof :AOF檔案修復工具
  • redis-check-dump :RDB檔案檢測工具
  • redis-sentinel : 用於做主備

啟動和停止redis

  • 啟動方式有以下幾種
    • 不載入配置啟動:redis-server
    • 載入配置啟動:redis-server /etc/redis.conf
    • 使用docker啟動:run -d --rm -v /root/test/redis.conf:/redis.conf --name redis-test -p 6379:6379 redis:5.0.0
  • 停止方式有以下幾種
    • 命令列連上redis以後執行shutdown
    • 直接結束redis程式:kill ...
    • 停止docker啟動的redis:docker stop redis-test

命令返回值型別

  1. 狀態回覆
    • 寫一個SET命令回覆ok
    • PING命令回覆“pong”
  2. 錯誤回覆
    • 都以 (error) 開頭
  3. 整數回覆
    • 都以 (integer) 開頭,例如遞增命令
  4. 字串回覆
    • GET一個key(鍵)返回一個value(值)
  5. 多行字串回覆
    • 每行都會以序列號開頭
    • 例如命令KEYS *獲取目前資料庫中的key名
  6. 回覆空結果
    • GET一個不存在的key,或者GET一個值為空的key,則返回(nil)

配置選項

  1. 可以動態設定(啟動服務的時候設定,或啟動後修改),或者通過配置檔案設定。動態的設定會覆蓋配置檔案的設定
  2. 可以通過命令 CONFIG GET 配置名稱 來獲得當前值,一般返回結果中第一行是配置名稱,第二行是值
  3. 通過CONFIG SET 配置名 value修改配置的值

常用簡單命令

連線操作常用命令

#關閉連線
>quit

#簡單密碼認證
>auth xxxxx

#返回redis伺服器的各種資訊和統計資料
#info [section]
> INFO CPU
# CPU
used_cpu_sys:0.082652
used_cpu_user:0.125159
used_cpu_sys_children:0.000949
used_cpu_user_children:0.002533
複製程式碼
  • 以人類可讀的方式,返回所有的連線客戶端資訊和統計資料
> client list 
id=3 addr=127.0.0.1:57516 fd=8 name= age=101 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client
複製程式碼
  • 將資料同步儲存到磁碟,然後關閉服務停止程式
>shutdown
複製程式碼
  • 實時列印出redis伺服器接收到的指令
>monitor
OK

複製程式碼

持久化常用命令

  • 將資料同步儲存到磁碟
> save
OK
複製程式碼
  • 將資料非同步儲存到磁碟
> bgsave                             
Background saving started
複製程式碼
  • 返回最近一次成功將資料儲存到磁碟的Unix時戳
> lastsave
(integer) 1557285566
複製程式碼

配置相關常用命令

  • config get parameter #取得執行redis伺服器的配置引數

  • config set parameter value #設定redis伺服器的配置引數

  • 獲得當前日誌級別配置

> CONFIG GET loglevel
1) "loglevel"
2) "notice"  
複製程式碼
  • 獲得埠配置
> CONFIG GET port
1) "port"
2) "6379"
複製程式碼
  • 修改日誌級別(支援的日誌級別 debug、verbose、notice、warning)
>CONFIG SET loglevel debug
OK
複製程式碼
  • 將記憶體中的redis配置寫入磁碟的redis.conf檔案
>config rewrite
複製程式碼

慢日誌相關命令

  • 重置慢日誌記錄
> SLOWLOG RESET
OK
複製程式碼
  • 查詢慢日誌內容
查詢前10個慢日誌(預設為10個)
> SLOWLOG GET 10
(empty list or set)
複製程式碼
  • 返回慢日誌條數
> SLOWLOG LEN
(integer) 0
複製程式碼

資料庫操作常用命令

  • 進入資料庫,在redis中資料庫以數字命名,第一個資料庫的編號是0,例如進入資料庫1
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> 
複製程式碼
  • 查詢當前庫所有KEY
>KEYS *
複製程式碼
  • 隨機返回一個key
>randomkey
複製程式碼
  • 查詢KEY總數直接獲取redis內建的鍵總數變數
>dbsize
複製程式碼
  • 獲取資料庫中的所有key
127.0.0.1:6379[1]> KEYS *
(empty list or set)
127.0.0.1:6379[1]> 
複製程式碼
  • 清空當前資料庫中的所有KEY
>FLUSHDB
複製程式碼
  • 清空所有資料庫中的所有KEY
>FLUSHALL
複製程式碼
  • 遷移KEY
#Dump+restore可以實現在不同的redis例項之間進行資料遷移的功能,整個遷移的過程分為兩步;
#1)在源redis上,dump命令會將鍵值序列化,格式採用的是RDB格式
#2)在目標redis上,restore命令將上面序列化的值進行復原,其中ttl引數代表過期時間,ttl=0代表沒有過期時間
192.168.225.129:6379> get redis
"world"
192.168.225.129:6379> dump redis
"\x00\x05world\a\x00\xe6\xe3\xe9w\xd8c\xa7\xd8"
目標redis
192.168.225.128:6379> get redis
(nil)
192.168.225.128:6379> restore redis 0 "\x00\x05world\a\x00\xe6\xe3\xe9w\xd8c\xa7\xd8"
OK
192.168.225.128:6379> get redis
"world"

#migrate,實際上是吧dump、restore、del 3個命令進行組合,從而簡化步驟。
#Migrate host port key [ key ......] destination-db timeout [replace]
#源redis中執行(將鍵flower遷移至目標192.168.225.128:6379的庫0中,超時時間為1000毫秒,replace表示目標庫如果存在鍵flower,則覆蓋)
192.168.225.129:6379> migrate 192.168.225.128 6379 flower 0 1000 replace
複製程式碼

主備常用命令

  • 將該redis例項作為slave,清空當前資料並從master例項複製資料過來。
  • 語法slaveof <masterip> <masterport>
>slaveof 192.168.0.100 6379
複製程式碼
  • 將slave提升為master,該操作將刪除原有的slaveof <masterip> <masterport>配置與readonly配置
>slaveof no one
複製程式碼

配置檔案redis.conf

基本配置

#監聽埠
port 6379

#以守護程式方式啟動
daemonize yes

#監聽的ip
bind 127.0.0.1

#設定redis公開哪個IP給訪問者(在nat網路環境下使用)
cluster-announce-ip "192.168.0.8"

#客戶端不操作等待多久自動斷開,設定0為不自動斷開
timeout 0

#日誌級別
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice

#設定pid檔案存放路徑
pidfile "/cache1/redis/data/redis.pid"

#指定日誌記錄方式,可以寫一個路徑,也可以放空輸出到stdout。但是如果以守護程式方式執行但又放空的話,日誌會寫給/dev/null
logfile ""

#限制可設定資料庫的數量,預設只允許16個,第一個資料庫的編號是0
databases 16

#允許使用的最大記憶體(需要配合maxmemory-policy使用),設定為0表示不限制;當redis記憶體資料集快到達maxmemory時,redis會實行資料淘汰策略
maxmemory 0

#Redis提供6種資料淘汰策略:
#volatile-lru:從已設定過期時間的記憶體資料集中挑選最近最少使用的資料 淘汰;
#volatile-ttl: 從已設定過期時間的記憶體資料集中挑選即將過期的資料 淘汰;
#volatile-random:從已設定過期時間的記憶體資料集中任意挑選資料 淘汰;
#allkeys-lru:從記憶體資料集中挑選最近最少使用的資料 淘汰;
#allkeys-random:從資料集中任意挑選資料 淘汰;
#no-enviction(驅逐):禁止驅逐資料。(預設淘汰策略。當redis記憶體資料達到maxmemory,在該策略下,直接返回OOM錯誤)
maxmemory-policy volatile-lru

#為了防止某個指令碼執行時間過長導致Redis無法提供服務(比如陷入死迴圈),Redis提供了lua-time-limit引數限制指令碼的最長執行時間,預設為5秒鐘。當指令碼執行時間超過這一限制後,Redis將開始接受其他命令但不會執行(以確保指令碼的原子性,因為此時指令碼並沒有被終止),而是會返回“BUSY”錯誤。
lua-time-limit 5000

#設定最多同時可連線的客戶端數量。預設為0沒有限制,該配置關係到Redis程式能夠開啟的檔案描述符數量
#如果到達了限制,Redis會關閉所有新連線並返回錯誤“max number of clients reached”
maxclients 10000

#讀入多個配置檔案,當有標準配置模板但是每個redis例項又需要個性設定的時候很有用
include /path/to/local.conf
include /path/to/other.conf

複製程式碼

慢查詢相關配置

#單位為微秒,當命令執行時間超過該值則會被redis記錄為慢查詢
#配置為負數則禁用慢查詢日誌
#配置為0則記錄所有命令
slowlog-log-slower-than 10000

#設定慢查詢日誌的長度,如果已滿則會刪掉最舊的保留最新的
#可以用命令 SLOWLOG RESET 來釋放記憶體
slowlog-max-len 128
複製程式碼

緩衝區相關配置

Redis為了解決輸出緩衝區訊息大量堆積的隱患,設定了一些保護機制,主要採用兩種限制措施:

  • 大小限制,當某一客戶端緩衝區超過設定值後直接關閉連線;
  • 持續性限制,當某一客戶端緩衝區持續一段時間佔用過大空間時關閉連線。

該配置項格式如下: client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

具體引數含義如下:

  • class : 客戶端種類,normal、slave、pubsub。
  • mormal:普通的客戶端
  • slave: 從庫的複製客戶端
  • pub/sub: 釋出與訂閱的客戶端的
  • hard limit: 緩衝區大小的硬限制。
  • soft limit: 緩衝區大小的軟限制。
  • soft seconds: 緩衝區大小達到了(超過)soft limit值的持續時間,單位秒。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
複製程式碼

與RDB快照有關的配置

快照方法在redis程式異常死掉時,最近的資料會丟失(丟失資料的多少視你save策略的配置)這是它最大的缺點。當業務量很大時,將丟失很多資料


#   save <seconds> <changes>

#900秒內有一個key被修改,就儲存快照(持久化落盤)到磁碟上的資料庫檔案裡
save 900 1

#300秒內有10個更改就快照
save 300 10

#69秒內有1萬個更改就快照
save 60 10000

#儲存本地資料庫時是否使用壓縮,預設yes,使用LZF演算法。壓縮消耗cpu,不壓縮消耗磁碟空間
rdbcompression yes

# The filename where to dump the DB。本地資料庫的磁碟中的檔名
dbfilename dump.rdb

#從版本RDB版本5開始,一個CRC64的校驗就被放在了檔案末尾。
#這會讓格式更加耐攻擊,但是當儲存或者載入rbd檔案的時候會有一個10%左右的效能下降,  
#所以,為了達到效能的最大化,你可以關掉這個配置項。  
#沒有校驗的RDB檔案會有一個0校驗位,來告訴載入程式碼跳過校驗檢查。  
rdbchecksum yes

#指定本地儲存資料庫的路徑,預設當前目錄
dir ./

#如果配置 yes 當後臺持久化失敗,Redis會停止接受更新操作。如果持久化程式再次工作則會恢復允許更新操作
#如果配置 no 當後臺持久化失敗,Redis更新操作仍然繼續處理
stop-writes-on-bgsave-error yes

複製程式碼

與AOF持久化相關的配置

  • Append-only方法可以做到全部資料不丟失,但redis的效能就要差些。 原理是以日誌的形式來記錄每個寫操作,將redis執行過的所有寫指令記錄下來(讀操作不記錄),只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作。

  • rewrite重寫機制是什麼: AOF採用檔案追加方式,檔案會越來越大為避免出現此種情況,新增了重寫機制, 當AOF檔案的大小超過所設定的閾值時,Redis就會啟動AOF檔案的內容壓縮,只保留可以恢復資料的最小指令集.可以使用命令bgrewriteaof

  • 重寫原理 AOF檔案持續增長而過大時,會fork出一條新程式來將檔案重寫(也是先寫臨時檔案最後再rename),遍歷新程式的記憶體中資料,每條記錄有一條的Set語句。重寫aof檔案的操作,並沒有讀取舊的aof檔案,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof檔案,這點和快照有點類似

#開啟AOF
appendonly yes
#設定AOF檔名
appendfilename "appendonly.aof"

#AOF落盤方式可選引數有:
#always 總是寫入aof檔案,並完成磁碟同步
#everysec 每一秒寫入aof檔案,並完成磁碟同步
#no 寫入aof檔案,不等待磁碟同步
#從持久化角度講,always是最安全的。從效率上講,no是最快的。而redis預設設定進行了折中,選擇了everysec。
appendfsync always

#在rewrite給AOF檔案減肥的時候,appendfsync請求只寫入緩衝區不落盤。(如果當前AOF檔案很大,那麼相應的rewrite時間會變長,appendfsync被阻塞的時間也會更長,這時候服務異常會丟失這段時間內的資料)
no-appendfsync-on-rewrite yes

#當AOF檔案大小超過上次rewrite後的100%(一倍)並且檔案大於64M時觸發rewrite
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#redis在恢復時忽略最後一條可能存在問題的指令,預設值yes。在aof寫入時突然斷電可能會出現指令寫錯(寫了一半),這種情況下yes會log並繼續,而no會直接恢復失敗
aof-load-truncated yes
複製程式碼

安全相關配置

#當以sentinel主備redis執行時或者cluster執行時,slave例項需要訪問master,所以需要在slave例項配置master例項的密碼
masterauth "d9s@@ddd"

#本Redis的密碼
requirepass "saseawe"

#將危險的命令重新命名,或者禁用
#例如禁用FLUSHALL
rename-command FLUSHALL ""

#重新命名FLUSHDB,重新命名後必須用新命令來操作,否則伺服器會報錯 unknown command
rename-command FLUSHDB  qf69aZbLAX3cf3ednHM3SOlbpH71yEXLAX3cf3e

複製程式碼

主從相關配置

#配置在備庫,配置主庫的ip與埠。表備庫從哪個主庫複製來資料。如果原本已有資料的備庫開啟了該設定,則會清空備庫自身資料後再開始複製
slaveof 192.168.0.100 6379

# 作為從伺服器,預設情況下是隻讀的(yes),可以修改成NO,用於寫(不建議)
slave-read-only yes

#slave與master連線中斷時
#yes 代表slave會繼續應答來自client的請求,即使這些資料已過期(因為連線中斷無法從master更新資料)
#no 除了INFO與SLAVEOF外的所有客戶端請求都只響應"SYNC with master in progress"的應答,直到該slave與master的連線重建成功或該slave被提升為master
slave-serve-stale-data yes

#Redis部署為Replication模式後,slave會以預定週期(預設10s)發PING包給master,該配置可以更改這個預設週期
repl-ping-slave-period 10

#有2種情況的超時均由該配置指定:1) Bulk transfer I/O timeout; 2) master data or ping response timeout。
# 需要特別注意的是:若修改預設值,則使用者輸入的值必須大於repl-ping-slave-period的配置值,否則在主從鏈路延時較高時,會頻繁timeout。
repl-timeout 30

#當配置yes時會禁用NO_DELAY,TCP協議棧會合並小包統一傳送,這樣可以減少主從節點間的包數量並節省頻寬,但會增加資料同步到slave的時間
#當配置no時啟用NO_DELAY,TCP協議棧不會延遲小包的傳送時機,這樣資料同步的延時會減少,會消耗更多頻寬
#在頻寬充足的情況下建議配置為no,以降低同步時延
repl-disable-tcp-nodelay no

#存在多個slave的情況下,當master當機時Redis seninel將選拔priority值最小的slave提升為master
#如果該配置為 0 則永遠不會被sentinel提升為master
slave-priority 4
複製程式碼

Redis-cluster相關配置

#開啟叢集模式
cluster-enabled yes
#叢集的配置檔案存放路徑
cluster-config-file "nodes.conf"
#叢集的超時時間
cluster-node-timeout 5000
複製程式碼

高階優化配置

# 當有大量資料時,適合用雜湊編碼hashtable(需要更多的記憶體),元素數量上限不能超過給定限制。你可以通過下面的選項來設定這些限制:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

#與雜湊相類似,資料元素較少的情況下,可以用另一種方式來編碼ziplist從而節省大量空間。這種方式只有在符合下面限制的時候才可以用:
list-max-ziplist-entries 512
list-max-ziplist-value 64

# 資料全是64位無符號整型數字構成的字串。下面這個配置項就是用來限制這種情況下使用這種編碼的最大上限的。
set-max-intset-entries 512

# 與第一、第二種情況相似,有序序列也可以用一種特別的編碼方式來處理,可節省大量空間。這種編碼只適合長度和元素都符合下面限制的有序序列:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# 預設是每秒鐘進行10次雜湊表重新整理,用來重新整理字典,然後儘快釋放記憶體。
# 建議:如果你對延遲比較在意的話就用 "activerehashing no";如果你不太在意延遲而希望儘快釋放記憶體的話就設定 "activerehashing yes"。
activerehashing yes

# 對客戶端輸出緩衝進行限制可以強迫那些不從伺服器讀取資料的客戶端斷開連線。
# 對於normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client預設取消限制,因為如果沒有尋問,他們是不會接收資料的。
client-output-buffer-limit normal 0 0 0

# 對於slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續60秒,那麼伺服器就會立即斷開客戶端連線。
client-output-buffer-limit slave 256mb 64mb 60

# 對於pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續60秒,那麼伺服器就會立即斷開客戶端連線。
client-output-buffer-limit pubsub 32mb 8mb 60
複製程式碼

配置檔案sentinel.conf

在一主多從的redis環境中,可以使用多個sentinel(哨兵)來維護slave保證資料的安全 哨兵會同時監控主資料庫和從資料庫,哨兵之間也會相互監控

具體配置如下

#以守護程式方式啟動
daemonize yes

#監聽埠預設26379
port 26379

#master資料庫的ip與埠號,當master發生變化時sentinel會自動修改該配置
#末尾的2代表執行故障恢復操作前至少需要幾個哨兵節點同意,一般設定為N/2+1(N為哨兵總數)
sentinel monitor redis-master 192.168.1.51 7000 2

#指定了 Sentinel 認為伺服器已經斷線所需的毫秒數
sentinel down-after-milliseconds redis-master 5000

#等待該配置內的時間後master還沒有恢復響應,則sentinel會排除掉故障的例項,一段時間後再探測如果已恢復則把之前故障的master作為slave處理
sentinel failover-timeout redis-master 900000

#選項指定了在執行故障轉移時, 最多可以有多少個從伺服器同時對新的主伺服器進行同步, 這個數字越小, 完成故障轉移所需的時間就越長。
sentinel parallel-syncs redis-master 2

#master的訪問密碼
sentinel auth-pass redis-master 123456

#log檔案路徑
logfile "./sentinel.log"
複製程式碼

Redis中的資料型別與資料操作命令

String 字串型別

一個key最多隻能儲存512MB

  • 相關命令
    • SET 設定key對應的值為value,EX設定key的存活時間,PX設定存活時間單位為毫秒,NX當key不存在的時候才生效,XX當key已存在的時候才生效
      • 語法 SET Key value [EX seconds] [PX millisconds] [NX|XX]
        • >SET testStr1 'this is a test'
          OK
          >SET testS2 'test2'
          OK
          > SET username xiaoming EX 10
          OK
          > SET username xiaoming PX 1000000000
          OK
          > PTTL username
          (integer) 999986009
          > GET username
          "xiaoming"
          > SET username erha NX 
          (nil)
          > GET username
          "xiaoming"
          > SET username erha XX
          OK
          > GET username
          "erha"
          複製程式碼
    • GET根據key找到對應值
      • 如果返回結果為空的話將會返回(nil)
      • 如果鍵值不是字串型別則會返回報錯(error) WRONGTYPE Operation against a key holding the wrong kind of value
      • >GET testStr1
        "this is a test"
        >LPUSH testList1 a b c
        (integer) 3
        > GET testList1
        (error) WRONGTYPE Operation against a key holding the  wrong kind of value
        複製程式碼
    • GETRANGE返回得字串的一部分
      • 語法 GETRANGE key 起始點 結束點
      • >GET testStr2
        "meizitu"
        #返回第一個字元到第5個字元
        >GETRANGE testStr2 0 4
        "meizi"
        #返回第一個字元到倒數第二個字元
        >GETRANGE testStr2 0 -2
        "meizit"
        #返回第一個字元到倒數第三個字元
        >GETRANGE testStr2 0 -3
         "meizi"
         #返回倒數第4個字元到倒數第2個字元
        >GETRANGE testStr2 -4 -2
        "zit"
        #如果結束點比起始點更靠前的話,只會返回空結果
        >GETRANGE testStr2 -4 -5
        ""
        #如果結束點設定的比字串還長的話,只會返回到字串結尾
        >GETRANGE testStr2 0 1000
        "meizitu"
        複製程式碼
    • GETSET設定指定key的值,並返回舊值
      • 語法GETSET key value
      • >SET testStr3 'winter'
        OK
        >GET testStr3
        "winter"
        >SET testStr3 'is'
        OK
        >GETSET testStr3 'comming'
        "is"
        #如果getset一個原本沒有的key,則會返回(nil)
        >GETSET testStr4 'this is a test'
        (nil)
        複製程式碼
    • MSET一次設定多個鍵值對
      • 語法MSET key value [ key value ...]
      • >MSET  testStr5 'king' testStr6 'meizi' testStr7 'queen'
        OK
        複製程式碼
    • MGET一次獲取多個鍵值對
      • 語法MGET key key key ...
      • > MGET testStr5 testStr6 testStr7 testStr8
        1) "king"
        2) "meizi"
        3) "queen"
        4) (nil)
        複製程式碼
    • STRLEN獲取key字串長度
      • 語法:STRLEN key
      • > SET testStr5 'king'
        OK
        > STRLEN testStr5
        (integer) 4
        #如果對不存在的key使用,則返回長度0
        > STRLEN testStr6
        (integer) 0
        複製程式碼
    • SETRANGE將字串中的某一部分替換成其他值,並返回修改後的字串長度
      • 語法SETRANGE key offset value
      • #如果原本設定的字元位置為空,則按照空字元做處理
        > SET testStr9 "hello king"
        OK
        > SETRANGE testStr9 6 'queen'
        (integer) 11
        > GET testStr9
        "hello queen"
        #檢測key是否存在,返回0代表不存在,返回1代表存在
        > EXISTS testStr10
        (integer) 0
        > EXISTS testStr9
        (integer) 1
        #對不存在的key使用SETRANGE,會返回以0字元來填充
        > SETRANGE testStr10 5 'king'
        (integer) 9
        > GET testStr10
        "\x00\x00\x00\x00\x00king"
        複製程式碼
    • SETNXNS代表not exist,只有key不存在的時候才能設定成功,避免覆蓋
      • 語法SETNX key value
      • #當key不存在的時候可以設定成功,並返回整型1
        >EXISTS testStr11
        (integer) 0
        >SETNX testStr11 'meizi'
        (integer) 1
        >GET testStr11
        "meizi"
        #當key已存在的時候設定失敗,返回整形0
        >SETNX testStr11 'king'
        (integer) 0
        >GET testStr11
        "meizi"
        複製程式碼
    • SETEX是原子性操作,設定key的過期時間,設定生存時間與設定值在同一個動作內完成
      • 語法 SETEX key seconds時間 value值
      • >SETEX expireStr 60 'testExpire'
        OK
        #使用TTL命令檢視key還剩下多少時間過期
        > TTL expireStr
        (integer) 51
        #過期後,key不存在,TTL會返回整形-2
        > TTL expireStr
        (integer) -2
        > GET expireStr
        (nil)
        #將這兩個行為拆開操作的話
        >SET expireStr1 'test1'
        OK
        >EXPIRE expireStr1 10
        (integer) 1
        >TTL expireStr1
        (integer) 5
        #如果對一個已存在的key使用SETEX,則會覆蓋原本的值和超時時間
        >SETEX test12 1000 'a'
        OK
        >GET test12
        "a"
        >TTL test12
        (integer) 991
        >SETEX test12 100 'b'
        OK
        >TTL test12
        (integer) 97
        >GET test12
        "b"
        複製程式碼
    • MSETNX一次設定多個key的值,類似MSET,但只有key不存在的時候才能設定成功,當有一個key是已存在的,那麼所有key都會設定失敗,成功返回整形1,失敗返回整形0
      • 語法MSETNX key value [key value ...]
      • >MSETNX test13 'a' test14 'b' test15 'c'
        (integer) 1
        >MGET test13 test14 test15
        1) "a"
        2) "b"
        3) "c"
        >MSETNX test15 'aa' test16 'bb' test17 'cc'
        (integer) 0
        >MGET test13 test14 test15 test16 test17
        1) "a"
        2) "b"
        3) "c"
        4) (nil)
        5) (nil)
        複製程式碼
    • PSETEX 與setex相似,P代表以毫秒為單位設定key的生存時間,使用PTTL獲得key剩餘存活時間
      • 語法`PSETEX key milliseconds value'
      • >PSETEX test16 2000 'hello world'
        OK
        >PTTL test16
        (integer) 210
        >PTTL test16
        (integer) -2
        複製程式碼
    • INCR 對key中儲存的數字+1,如果key不存在的時候會先初始化為0,再執行INCR。如果值超出了範圍或者非整數則會報錯
      • 語法 INCR key
      • >SET counter 1
        OK
        >INCR counter
         (integer) 2
        >INCR counter
        (ingeger) 3
        #當對不存在的key使用INCR時會當作值初始為0使用INCR
         > GET test
         (nil)
         > EXISTS test
        (integer) 0
        > INCR test
        (integer) 1
        #對字串使用INCR,報錯
        > SET test20 'hello google'
         OK
        > INCR test20
        (error) ERR value is not an integer or out of range
        複製程式碼
    • INCRBY將key中儲存的數字加上指定整形增量(只支援整形數字,不支援浮點數)
      • 語法INCRBY key number
      • > SET counter2 10
        OK
        > INCRBY counter2 5
        (integer) 15
        複製程式碼
    • INCRBYFLOAT將key中儲存的數字加上指定浮點增量(也可以加上整形數字)
      • 語法``INCRBY key INCREMENT`
      • > SET counter3 1
        OK
        > INCRBYFLOAT counter3 1.2
        "2.2"
        > INCRBYFLOAT counter3 5
        "7.2"
        複製程式碼
    • DECR 將key中儲存的數字減1
      • 語法DECR key
      • >SET counter2 12
        >DECR counter2
        (integer) 13
        複製程式碼
    • DECRBY 將key中儲存的數字遞增指定的整形數字(只支援整形,不支援浮點)
      • 語法DECRBY key decrement
      • >GET counter2
        "13"
        >DECRBY counter2 3
        (integer) 10
        #
        > DECRBY counter2 1.2
        (error) ERR value is not an integer or out of range
        複製程式碼
    • APPEND 在值的末尾追加字串,如果key不存在則相當於執行SET操作
      • 語法 APPEND key value
      • >GET testStr11
        "meizi"
        >APPEND testStr11 'edu'
        (integer) 8
        >GET testStr11
        "meiziedu"
        >APPEND noExistsStr 'this is a test'
        (integer) 14
        >GET noExistsStr
        "this is a test"
        複製程式碼

Hash型別

又稱為雜湊表。也是一個鍵值對的集合。適用於儲存物件。將物件存入hash能節省記憶體

  • 相關配置檔案:
    • hash-max-ziplist-entries 512 #hash型別儲存的最大值,512個位元組
    • hash-max-ziplist-value 64 #hash型別儲存的欄位數目。預設64個
  • 相關命令
    • HSET 將hash表key中的域field設定成指定的value
      • 語法HSET key field value
      • #當field不存在的時候,將新建field,將返回整形1
        > HSET userInfo1 username 'king'
        (integer) 1
        #當field已存在的時候,將重新賦值並返回整形0
        > HSET userInfo1 username 'king2'
        (integer) 0
        > HSET userInfo1 password '123456'
        (integer) 1
        > HSET userInfo1 email '123@qq.com'
        (integer) 1
        複製程式碼
    • HGET 返回hash表key中指定field的值
      • 語法HGET key field
      • > HGET userInfo1 username
        "king"
        > HGET userInfo2 username
        (nil)
        複製程式碼
    • HSETNX hash表中的field不存在的時候才賦值,相當於not exsist
      • 語法HSETNX key field value
      • >HSETNX testHash1 test 'a' 
        (integer) 1
        >HSETNX testHash1 test '111'
        (integer) 0
        複製程式碼
    • HMSET同時將多個field-value設定到hash表的key中
      • 語法HMSET key field value field value ...
      • >HMSET userInfo2 username 'king' password '123' nickname 'smart king' email '222@qq.com'
        OK
        #如果欄位已經存在,重新執行則會被覆蓋
        > HMSET userInfo2 username 'queen' role 'admin'
        OK
        複製程式碼
    • HMGET 一次獲得hash表key中多個field的值,如果key中的field不存在會返回nil
      • 語法 HMGET key field field field ...
      • > HMGET userInfo2 username password email nickname test
        1) "queen"
        2) "123"
        3) "222@qq.com"
        4) "smart king"
        5) (nil)
        複製程式碼
    • HGETALL返回hash表key中所有的field和value,奇數行是key,偶數行是value
      • 語法HGETALL key
      • >HGETALL userInfo2 
        1) "username"
        2) "queen"
        3) "password"
        4) "123"
        5) "nickname"
        6) "smart king"
        7) "email"
        8) "222@qq.com"
        9) "role"
        10) "admin"
        複製程式碼

List型別

(列表型別,是一個簡單的字串列表,通過插入順序排序,最多儲存2的32次方減1個元素,通過雙向連結串列實現,獲取越接近兩端的元素速度越快)(列表通過索引訪問元素,如果列表不存在則會先建立)

  • 相關命令
    • LPUSH 向列表左端新增元素,可以一次新增一個或多個
      • 語法`LPUSH key value value ..."
      • #確認列表不存在
        > EXISTS myList1
        (integer) 0
        #給列表新增3個元素
        > LPUSH myList a b c 
        (integer) 3
        #再給列表新增3個元素,目前總共6個元素
        > LPUSH myList c d e
        (integer) 6
        #檢視從第一個元素到最後一個元素
        > LRANGE myList 0 -1
        1) "e"
        2) "d"
        3) "c"
        4) "c"
        5) "b"
        6) "a"
        複製程式碼
    • RPUSH 向列表右端新增元素
      • 語法RPUSH key value ...
      • > RPUSH myList test1 test2 test3
        (integer) 9
        > LRANGE myList 0 -1
        1) "e"
        2) "d"
        3) "c"
        4) "c"
        5) "b"
        6) "a"
        7) "test1"
        8) "test2"
        9) "test3"
        複製程式碼
    • RPUSHX LPUSHX與上面一樣,但是隻有key存在的時候才新增元素
      • > RPUSHX myList test1 test2 test3
        (integer) 12
        > LPUSHX myList test1 test2 test3
        (integer) 15
        > LRANGE myList 0 -1
         1) "test3"
         2) "test2"
         3) "test1"
         4) "e"
         5) "d"
         6) "c"
         7) "c"
         8) "b"
         9) "a"
        10) "test1"
        11) "test2"
        12) "test3"
        13) "test1"
        14) "test2"
        15) "test3"
        > LPUSHX myList2 test1 test2 test3
        (integer) 0
        複製程式碼
    • LPOP 將列表頭部的一個元素彈出
      • 語法 LPOP key
      • > LRANGE myList 0 -1
        1) "test3"
        2) "e"
        3) "c"
        4) "test3"
        #彈出頭部的test3
        > LPOP myList 
        "test3"
        > LRANGE myList 0 -1
        1) "test3"
        2) "e"
        3) "c"
        4) "test3"
        複製程式碼
    • RPOP 將列表尾巴的一個元素彈出
      • 語法 RPOP key
    • LLEN 得到列表的長度,也就是列出元素的數量
      • 語法LLEN key
      • > LRANGE myList 0 -1
         1) "test2"
         2) "test1"
         3) "e"
         4) "d"
         5) "c"
         6) "c"
         7) "b"
         8) "a"
         9) "test1"
        10) "test2"
        11) "test3"
        12) "test1"
        13) "test2"
        14) "test3"
        >LLEN myList
        (integer) 14
        #如果列表不存在就返回0
        > LLEN myList4
        (integer) 0
        複製程式碼
    • LRANGE 獲取列表片段,0代表列表的第一個元素,1代表列表的第二個元素,-1代表最後一個元素,複數代表從後往前數
      • 語法LRANGE key start stop
      • > LRANGE myList 0 -1
         1) "test2"
         2) "test1"
         3) "e"
         4) "d"
         5) "c"
         6) "c"
         7) "b"
         8) "a"
         9) "test1"
        10) "test2"
        11) "test3"
        12) "test1"
        13) "test2"
        14) "test3"
        #獲取第一個元素
        > LRANGE myList 0 0
        1) "test2"
        127.0.0.1:6379> LRANGE myList 0 2
        1) "test2"
        2) "test1"
        3) "e"
        #獲取元素只能從左到右,順序錯了就會報錯
        > LRANGE myList -1 -3
        (empty list or set)
        #獲取末尾3個元素
        > LRANGE myList -3 -1
        1) "test1"
        2) "test2"
        3) "test3"
        複製程式碼
    • LREM 刪除列表中的指定引數,
      • 語法 LREM key count value
      • count有以下幾種:
        • count 大於 0 從列表的頭開始,向尾搜尋,移除與value相等數量的元素,移除count個
        • count 小於 0 從尾部向頭部搜尋,移除與value相等的元素,移除count個
        • count 等於 0 移除列表中所有與value相等的值
      • #建立一個列表並賦值
        > LPUSH myList2 a b c d a e b c d b e f b g e b
        (integer) 16
        > LLEN myList2
        (integer) 16
        #從頭搜尋刪除2個b
        > LREM myList2 2 b
        (integer) 2
        127.0.0.1:6379> LRANGE myList2 0 -1
         1) "e"
         2) "g"
         3) "f"
         4) "e"
         5) "b"
         6) "d"
         7) "c"
         8) "b"
         9) "e"
        10) "a"
        11) "d"
        12) "c"
        13) "b"
        14) "a"
        #從尾部搜尋刪除2個a
        127.0.0.1:6379> LREM myList2 -2 a
        (integer) 2
        127.0.0.1:6379> LRANGE myList2 0 -1
         1) "e"
         2) "g"
         3) "f"
         4) "e"
         5) "b"
         6) "d"
         7) "c"
         8) "b"
         9) "e"
        10) "d"
        11) "c"
        12) "b"
        #刪除列表裡所有的e
        127.0.0.1:6379> LREM myList2 0 e
        (integer) 3
        127.0.0.1:6379> LRANGE myList2 0 -1
        1) "g"
        2) "f"
        3) "b"
        4) "d"
        5) "c"
        6) "b"
        7) "d"
        8) "c"
        9) "b"
        複製程式碼
    • LINDEX 獲得指定索引元素的值,根據索引找到值,命令後面要跟上一個整形數字,可以是正數也可以是負數
      • 語法LINDEX key index start
      • > LRANGE myList2 0 -1
        1) "g"
        2) "f"
        3) "b"
        4) "d"
        5) "c"
        6) "b"
        7) "d"
        8) "c"
        9) "b"
        > LINDEX myList2 5
        "b"
        > LINDEX myList2 -3
        "d"
        > LINDEX myList2 0
        "g"
        複製程式碼
    • LSET 設定指定索引元素的值,根據索引設定值
      • 語法LSET
      • > LRANGE myList2 0 -1
        1) "g"
        2) "f"
        3) "b"
        4) "d"
        5) "c"
        6) "b"
        7) "d"
        8) "c"
        9) "b"
        > LSET myList2 0 king
        OK
        > LRANGE myList2 0 -1
        1) "king"
        2) "f"
        3) "b"
        4) "d"
        5) "c"
        6) "b"
        7) "d"
        8) "c"
        9) "b"
        #超出範圍
        > LSET myList2 110 king
        (error) ERR index out of range
        #不存在的key
        > LSET myList3 1 king
        (error) ERR no such key
        複製程式碼
    • LTRIM 只保留列表的片段,其他都刪除,只保留起始點到結束點之間的元素,其他都刪掉
      • 語法LTRIM key start stop
      • > LRANGE myList3 0 -1
        1) "log5"
        2) "log4"
        3) "log3"
        4) "log2"
        5) "log1"
        127.0.0.1:6379> LTRIM myList3 0 1
        OK
        127.0.0.1:6379> LRANGE myList3 0 -1
        1) "log5"
        2) "log4"
        複製程式碼
    • LINSERT 向列表插入元素,插入pivot之前或者之後,當pivot不存在時不做操作
      • 語法LINSERT key BEFORE|AFTER pivot value
      • > LPUSH myList5 a b c d
        (integer) 4
        #將king插入b的前面
        > LINSERT myList5 BEFORE 'b' 'king'
        (integer) 5
        > LRANGE myList5 0 -1
        1) "d"
        2) "c"
        3) "king"
        4) "b"
        5) "a"
        > LRANGE myList5 0 -1
        1) "d"
        2) "c"
        3) "king"
        4) "b"
        5) "a"
        > LINSERT myList5 AFTER 'd' 'queen'
        (integer) 6
        > LRANGE myList5 0 -1
        1) "d"
        2) "queen"
        3) "c"
        4) "king"
        5) "b"
        6) "a"
        複製程式碼
  • Set集合型別
  • Zset有序集合型別
  • 其他常用命令
    • KEYS 返回所有給定模式的key
      • 語法KEYS pattern
      • 萬用字元
        • * 匹配任意個字元
        • ? 匹配一個任意字元
        • [] 匹配[]之間的一個字元
        • \ 轉譯特殊字元
    • EXISTS 檢測指定key是否存在
    • 語法EXISTS key
    • TYPE 返回key所儲存的型別
    • 語法TYPE key
    • 返回型別
      • 不存在的key返回none
      • string
      • hash
      • set
      • zset
      • list
    • EXPIRE 設定key的過期時間,如果對已經帶有國企時間的key使用命令則會重置時間。2.4版本中過期後的1秒內key還有效,2.6版本開始過期後的時間改為1毫秒內可訪問
      • 語法EXPIRE key seconds
      • #設定失敗返回0
        > EXPIRE cache_page 100
        (integer) 0
        > SET cache_page sl
        OK
        #設定成功返回1
        > EXPIRE cache_page 100
        (integer) 1
        #使用TTL檢視剩餘時間
        >TTL cache_page
        (integer) 88
        複製程式碼
    • EXPIREAT 設定key的過期時間,設定具體時間點(時間戳),而不是時間範圍
      • 語法EXPIREAT key timestamp
      • >SET cache_page1 'www.qq.com'
        OK
        >EXPIREAT cache_page1 1431868110
        (integer) 1
        #使用TTL檢視剩餘時間
        >TTL cache_page1
        (integer) 88
        複製程式碼
    • PEXPIRE 設定key的過期時間,以毫秒為單位
      • 語法PEXPIRE key milliseconds
      • 使用PTTL查詢剩餘時間
    • PEXPIREAT 設定key的過期時間,設定具體時間戳,而不是範圍
      • 語法PEXPIREAT key timestamp
    • TTL 以秒為單位返回key的剩餘過期時間
      • 語法TTL key
      • 如果key沒有設定過期時間,會返回 -1
      • 如果key不存在,會返回 -2
    • PTTL 以毫秒為單位返回key的剩餘過期時間
    • PERSIST 將有過期時間的key轉為永久不過期的key
      • 語法PERSIST
      • > SET cache 'testCache'
        OK
        > TTL cache
        (integer) -1
        > EXPIRE cache 100
        (integer) 1
        > TTL cache
        (integer) 96
        > PERSIST cache
        (integer) 1
        > TTL cache
        (integer) -1
        複製程式碼
    • DEL 刪除key
      • 語法DEL key ...
      • #成功刪除了幾個key則返回數字幾
        >DEL cache1 cache2 cache3
        (integer) 1
        >DEL one two three four
        (integer) 4
        複製程式碼
    • RANDOMKEY 隨機從當前資料庫中返回一個key
      • 語法 RANDOMKEY
    • RENAME 將一個key重新命名
      • 語法RENAME key key
      • > SET testRename1 'rename1'
        OK
        127.0.0.1:6379> RENAME testRename1 testRename2
        OK
        127.0.0.1:6379> GET testRename1
        (nil)
        127.0.0.1:6379> GET testRename2
        "rename1"
        127.0.0.1:6379> RENAME testRename2 testRename2
        OK
        #如果源key不存在會報錯
        > RENAME testRens testRename2
        (error) ERR no such key
        複製程式碼
    • RENAMENX 被重新命名的新名稱不存在的時候才有效
      • 語法`RENAMENX key newkey'
    • DUMP 序列化給定的key,返回序列化之後的值
      • 語法DEMP key
      • > SET testDump 'this is a test'
        OK
        > DUMP testDump
        "\x00\x0ethis is a test\t\x00 \x88)\xc7\xcef\xce\xda"
        複製程式碼
    • RESTORE 反序列化給定的key,返回反序列化後的值
      • 語法RESTORE key ttl value
      • #反序列化的時候會設定過期時間
        > RESTORE testDump3 50000 "\x00\x0ethis is a test\t\x00 \x88)\xc7\xcef\xce\xda"
        OK
        127.0.0.1:6379> GET testDump3
        "this is a test"
        127.0.0.1:6379> PTTL testDump3
        (integer) 42520
        複製程式碼
    • MOVE 將當前資料庫中的key移動到另外的資料庫,如果目標資料庫已存在則會移動失敗返回整形0,當移動一個不存在的資料庫則會失敗報錯
      • 語法MOVE key dbID
      • #開啟0號資料庫
        127.0.0.1:6379> SELECT 0
        OK
        127.0.0.1:6379> SET testMove 'aaaa'
        OK
        127.0.0.1:6379> GET testMove
        "aaaa"
        #開啟資料庫1
        127.0.0.1:6379> SELECT 1
        OK
        127.0.0.1:6379[1]> KEYS *
        (empty list or set)
        127.0.0.1:6379[1]> SELECT 0
        OK
        127.0.0.1:6379> MOVE testMove 1
        (integer) 1
        127.0.0.1:6379> GET testMove
        (nil)
        127.0.0.1:6379> SELECT 1
        OK
        127.0.0.1:6379[1]> GET testMove
        "aaaa"
        複製程式碼

相關文章