redis 命令

Redis是用C語言實現的,通常來講C語言實現的程序「距離」操做系統更近,執行速度相對會更快。css

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

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

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

1.字符串

1.設置鍵shell

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.批量獲取值swift

mget key [key ...]

4.計數安全

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

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

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...]]:遷移多個鍵,例如要遷移key一、key二、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 #不一樣步

配置完記得重啓!

相關文章
相關標籤/搜索