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

在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服務器的配置參數node

  • config set parameter value #設置redis服務器的配置參數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爲了解決輸出緩衝區消息大量堆積的隱患,設置了一些保護機制,主要採用兩種限制措施:docker

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

該配置項格式以下: 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策略的配置)這是它最大的缺點。當業務量很大時,將丟失不少數據bash

# 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文件,這點和快照有點相似app

#開啓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

# 與第1、第二種狀況類似,有序序列也能夠用一種特別的編碼方式來處理,可節省大量空間。這種編碼只適合長度和元素都符合下面限制的有序序列:
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"
        複製代碼
相關文章
相關標籤/搜索