1. 程式人生 > 實用技巧 >Redis-常用操作詳解

Redis-常用操作詳解

Redis連線

Redis安裝配置,參考上一篇博文

redis資料是以key-value方式儲存,key永遠都是string型別,value可以是String、List、Set、Sorted-Sets、Hash,連線redis伺服器,預設是第一個資料庫

進入目錄cd /usr/local/redis/bin/

連線redis./redis-cli,出現127.0.0.1:6379>則連線成功

預設有16個數據庫,db0~15

切換資料庫select index select 1 索引從0開始

顯示所有的key鍵keys *,可以用tab鍵補全命令,補全命令為大寫

Redis基本命令 String

  • set,設定鍵 set name test1

  • get,獲取鍵值get name

  • exist,判斷鍵是否存在,返回1存在和0不存在exist name

  • append,如果鍵不存在則建立該鍵,返回鍵的值長度;如果鍵存在則追加,返回追加後值長度append name test1

    • 如果值有空格,則需要加引號append name "zhang san"

  • strlen,獲取key的長度strlen name

  • EX、PX表示失效時間,單位為秒和毫秒,不能同時使用,NX表示資料庫中不存在時才能設定,XX表示存在時才能設定set key value [expiration EX seconds|PX milliseconds] [NX|XX]

  • ttl檢視過期剩餘時間,-2表示過期

    127.0.0.1:6379> set job tester1 EX 10 NX
    OK
    127.0.0.1:6379> ttl job
    (integer) 6
    127.0.0.1:6379> ttl job
    (integer) 5
    127.0.0.1:6379> ttl job
    (integer) 4
    127.0.0.1:6379> ttl job
    (integer) 3
    127.0.0.1:6379> ttl job
    (integer) 2
    127.0.0.1:6379> ttl job
    (integer) 2
    127.0.0.1:6379> ttl job
    (integer) 1
    127.0.0.1:6379> ttl job
    (integer) -2
    127.0.0.1:6379> ttl job

    進行第二次set設定,ttl值會顯示-1

    127.0.0.1:6379> set job tester1
    OK
    127.0.0.1:6379> set job tester1 EX 10 NX
    (nil)
    127.0.0.1:6379> ttl job
    (integer) -1
  • flushdb,清空資料庫flushdb 檢視所有key鍵則會顯示(empty list or set)

  • incr,遞增1

    127.0.0.1:6379> set age 22
    OK
    127.0.0.1:6379> incr age
    (integer) 23
    127.0.0.1:6379> get age
    "23"
  • decr,遞減1

    127.0.0.1:6379> get age
    "23"
    127.0.0.1:6379> decr age
    (integer) 22
    127.0.0.1:6379> get age
    "22"
  • del,刪除鍵,刪除後還可以用incr遞增、decr遞減進行操作,但是基於預設值0

    127.0.0.1:6379> del age
    (integer) 1
    127.0.0.1:6379> get age
    (nil)
    127.0.0.1:6379> incr age
    (integer) 1
    127.0.0.1:6379> get age
    "1"
    127.0.0.1:6379> decr age
    (integer) 0
    127.0.0.1:6379> get age
    "0"

    下面字串能轉換為整型

    127.0.0.1:6379> set age "22"
    OK
    127.0.0.1:6379> get age
    "22"
    127.0.0.1:6379> incr age
    (integer) 23
    127.0.0.1:6379> get age
    "23"

    下面字串不能轉換為整型

    127.0.0.1:6379> set age "hello"
    OK
    127.0.0.1:6379> incr age
    (error) ERR value is not an integer or out of range
  • incrby,遞增,可以設定步長

    127.0.0.1:6379> set age 20
    OK
    127.0.0.1:6379> incrby age 5
    (integer) 25
    127.0.0.1:6379> get age
    "25"

    不加步長會報錯

    127.0.0.1:6379> incrby age
    (error) ERR wrong number of arguments for 'incrby' command
  • decrby,遞減,可以設定步長

  • getset,獲取值並設定新的值

    127.0.0.1:6379> get age
    "25"
    127.0.0.1:6379>
    127.0.0.1:6379> getset age 30
    "25"
    127.0.0.1:6379> get age
    "30"
  • setex,設定過期時間

    setex key seconds value,等同於set key value ex seconds

  • setnx,當key不存在時,才能設定,等同於set key value nx,key存在則不能設定

  • setrange,設定指定索引位置的字元,索引0開始

    從索引為6的位置開始替換 setrange key offset value

    127.0.0.1:6379> set age "hello world"
    OK
    127.0.0.1:6379> get age
    "hello world"
    127.0.0.1:6379> setrange age 6 job
    (integer) 11
    127.0.0.1:6379> get age
    "hello jobld"

    超過的長度使用0代替

    127.0.0.1:6379> setrange age 20 job
    (integer) 23
    127.0.0.1:6379> get age
    "hello jobld\x00\x00\x00\x00\x00\x00\x00\x00\x00job"
  • getrange,獲取指定索引位置的字元,索引0開始getrange key start end

    獲取閉合區間裡的值,[1,3]

    127.0.0.1:6379> set age "hello world"
    OK
    127.0.0.1:6379> getrange age 1 3
    "ell"
  • mset,批量設定keymset key value [key value ...]

  • mget,批量獲取keymget key [key ...]

    127.0.0.1:6379> mset job1 1 job2 2 job3 3
    OK
    127.0.0.1:6379> mget job1 job2 job3
    1) "1"
    2) "2"
    3) "3"
  • msetnx,批量設定key,如果key都不存在則成功返回1,若有一個存在則失敗返回0

    msetnx j 1 k 2 l 3 [key

Redis基本命令 List

  • lpush,建立鍵及其關聯的List,然後將引數values從左到右排序

  • lrange獲取從位置0到位置2的元素,0 -1獲取全部元素,-3 -2獲取倒數第3個到第2個元素,0 0獲取第一個元素

    127.0.0.1:6379> lpush age 1 2 3 4
    (integer) 4
    127.0.0.1:6379> lrange age 0 2
    1) "4"
    2) "3"
    3) "2"
    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    127.0.0.1:6379> lrange age -3 -2
    1) "3"
    2) "2"
    127.0.0.1:6379> lrange age 0 0
    1) "4"
  • type,檢視資料型別type age

  • lpushx,鍵存在時才能插入,不存在返回0

    127.0.0.1:6379> lpushx age123 1 2
    (integer) 0
    127.0.0.1:6379> lpushx age 1 2
    (integer) 6
    127.0.0.1:6379> lrange age 0 -1
    1) "2"
    2) "1"
    3) "4"
    4) "3"
    5) "2"
    6) "1"
  • lpop,卻出連結串列頭部的元素,相當於刪除

    127.0.0.1:6379> lrange age 0 -1
    1) "1"
    2) "4"
    3) "3"
    4) "2"
    5) "1"
    127.0.0.1:6379> lpop age
    "1"
    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
  • llen,返回列表長度

    127.0.0.1:6379> lrange age 0 -1
    1) "4"
    2) "3"
    3) "2"
    4) "1"
    127.0.0.1:6379> llen age
    (integer) 4
  • lrem,刪除幾個值等於x的元素,並返回個數

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> lpush age 1 1 2 3 3 4 5
    (integer) 7
    127.0.0.1:6379> lrem age 2 1
    (integer) 2
    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "3"
    5) "2"
  • lindex,獲取索引對應的值

    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "3"
    5) "2"
    127.0.0.1:6379> lindex age 1
    "4"
    127.0.0.1:6379> lindex age 0
    "5"

    索引值超過連結串列中元素數量,則返回nil

  • lset,修改索引對應的元素值

    127.0.0.1:6379> lrange age 0 -1
    1) "5"
    2) "4"
    3) "3"
    4) "3"
    5) "2"
    127.0.0.1:6379> lset age 0 a
    OK
    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "4"
    3) "3"
    4) "3"
    5) "2"

    設定的索引值超過連結串列中的元素數量,則返回error

  • ltrim,僅保留索引之間的元素,索引值倆邊也被保留

    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "4"
    3) "3"
    4) "3"
    5) "2"
    127.0.0.1:6379> ltrim age 0 2
    OK
    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "4"
    3) "3"
  • linset,在具體值前面插入新元素或者後面插入新元素linsert key BEFORE|AFTER pivot value

    127.0.0.1:6379> lrange age 0 -1
    1) "c"
    2) "b"
    3) "a"
    4) "a"
    5) "4"
    6) "3"
    127.0.0.1:6379> linsert age before c d
    (integer) 7
    127.0.0.1:6379> lrange age 0 -1
    1) "d"
    2) "c"
    3) "b"
    4) "a"
    5) "a"
    6) "4"
    7) "3"
    127.0.0.1:6379> linsert age after c ff
    (integer) 8
    127.0.0.1:6379> lrange age 0 -1
    1) "d"
    2) "c"
    3) "ff"
    4) "b"
    5) "a"
    6) "a"
    7) "4"
    8) "3"
  • rpush,從連結串列尾部插入引數,順序是從右到左依次插入

    127.0.0.1:6379> rpush age a b c d e
    (integer) 5
    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
  • rpushx,將元素插入連結串列尾部

    127.0.0.1:6379> rpushx age f
    (integer) 6
    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    6) "f"
  • rpop,從連結串列尾部取出元素,相當於刪除

    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    6) "f"
    127.0.0.1:6379> rpop age
    "f"
    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
  • rpoplpush,將一個連結串列的元素最後一位取出,新增到另外一個連結串列的頭部

    127.0.0.1:6379> lrange age 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    127.0.0.1:6379> lrange age1 0 -1
    1) "3"
    2) "2"
    3) "1"
    127.0.0.1:6379> rpoplpush age age1
    "e"
    127.0.0.1:6379> lrange age1 0 -1
    1) "e"
    2) "3"
    3) "2"
    4) "1"

    將source和destination設為同一鍵,將連結串列中的尾部元素移到其頭部

    127.0.0.1:6379> lrange age 0 -1
    1) "d"
    2) "a"
    3) "b"
    4) "c"
    127.0.0.1:6379> rpoplpush age age
    "c"
    127.0.0.1:6379> lrange age 0 -1
    1) "c"
    2) "d"
    3) "a"
    4) "b"

Redis基本命令 Set

  • sadd,當鍵不存在,才能成功插入多個元素sadd age 1 2 3

    不能插入重複資料

    127.0.0.1:6379> smembers age
    1) "1"
    2) "2"
    3) "3"
    4) "123"
    127.0.0.1:6379> sadd age 1 4 5
    (integer) 2
    127.0.0.1:6379> smembers age
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "123"
  • smembers,檢視集合中的元素smembers age

  • sismember,判斷元素是否存在,存在返回1,不存在返回0

    127.0.0.1:6379> sismember age 9
    (integer) 0
    127.0.0.1:6379> sismember age 1
    (integer) 1
  • scard,獲取集合元素數量scard age

  • srandmember,隨機返回一個成員,但還是存在集合中srandmember age

  • spop,隨機取出一個成員,集合中就被刪除了spop age

  • srem,從集合中取出元素,只會提取存在的元素

    127.0.0.1:6379> sadd age 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> srem age 1 2 a
    (integer) 2
    127.0.0.1:6379> smembers age
    1) "3"
    2) "4"
    3) "5"
  • smove,將一個集合元素移動到另外一個集合中

    127.0.0.1:6379> smembers age
    1) "3"
    2) "4"
    3) "5"
    127.0.0.1:6379> sadd age1 a b c
    (integer) 3
    127.0.0.1:6379> smembers age1
    1) "c"
    2) "a"
    3) "b"
    127.0.0.1:6379> smove age age1 3
    (integer) 1
    127.0.0.1:6379> smembers age1
    1) "3"
    2) "c"
    3) "a"
    4) "b"
  • sdiff,比較幾個集合中存在差異的元素

    其中4、5是age3中沒有的元素

    127.0.0.1:6379> smembers age
    1) "4"
    2) "5"
    127.0.0.1:6379> smembers age1
    1) "3"
    2) "c"
    3) "a"
    4) "b"
    127.0.0.1:6379> smembers age3
    1) "u"
    2) "i"
    127.0.0.1:6379> sdiff age age1
    1) "4"
    2) "5"
    127.0.0.1:6379> sdiff age age1 age3
    1) "4"
    2) "5"
  • sdiffstore,將三個集合的差異元素儲存在destination關聯的Set中,並返回插入的元素數量

    127.0.0.1:6379> sdiffstore destination age age1 age3
    (integer) 2
    127.0.0.1:6379> smembers destination
    1) "4"
    2) "5"
  • sinter,獲取多個集合直接的交集sinter age age1 age3

  • sinterstore,將三個集合的交集元素儲存在destination關聯的Set中,並返回交集的數量sinterstore age age1 age3

  • sunion,獲取多個集合之間的並集sunion age age1 age3

  • sunionstore,將三個集合的並集元素儲存在destination關聯的Set中,並返回並集的數量sunionstore age age1 age3

Redis基本命令 Sorted Set

也稱為Zset,Redis 有序集合和集合一樣也是string型別元素的集合,且不允許重複的成員,但分數(score)卻可以重複,redis正是通過分數來為集合中的成員進行從小到大的排序。

  • zadd

  • 新增1個分數為10的成員zadd age 10 a

  • 新增2個分數為20,30的成員zadd age 20 b 30 c

  • zrange

  • 通過索引獲取元素,0 -1表示全部元素zrange age 0 -1

  • 加WITHSCORES表示返回結果帶分數zrange age 0 -1 WITHSCORES

  • zcard,獲取test鍵中成員數量zcard age

  • zrank,獲取成員在集合中的索引,從0開始zrank age a

  • zcount,獲取符合條件的成員數量,分數滿足10-20的成員數量zcount age 10 20

  • zrem,刪除成員並返回刪除的數量zrem age a b

  • zscore,獲取成員的分數,返回的是字串形式zscore age c

  • zincrby,增加或減少(-)成員的分數,返回增加後的分數zincrby age 10 c

  • zrangebyscore,通過分數獲取滿足條件的成員zrangebyscore age 10 20

  • ­inf表示第一個成員,+inf表示最後一個成員,limit後面的引數用於限制返回成員的數量, limit 2 2,2表示從位置索引(0­-based)等於2的成員開始,取後面2個成員,成員不足就有多少顯示多少,類似於MySQL中的limit

  • zrangebyscore age -inf +inf

  • zrangebyscore age -inf +inf withscores

  • zrangebyscore age -inf +inf limit 2 2

  • zrangebyscore age -inf +inf withscores limit 2 2

  • zrangebyscore age 10 20 withscores limit 2 2

  • zremrangebyscore,根據分數條件刪除成員並返回刪除數量zremrangebyscore age 10 20

  • zremrangebyrank,根據索引條件刪除成員zremrangebyrank age 0 1

  • zrevrange,按索引高到低獲取成員

  • zrevrange age

  • 獲取前10,zrevange age 0 9

  • zrevrangebyscore,根據索引從高到低根據分數獲取成員

  • zrevrangebyscore age 30 10

  • zrevrank,索引由高到低的排序,獲取成員在集合中的索引

  • zrevrank age a

Redis基本命令 Hash

  • hset,給鍵設定欄位hset me name zhangsan

  • hget,獲取欄位hget me name

  • hlen,獲取欄位數量hlen me

  • hexists,判斷欄位是否存在,存在返回1hexists me height

  • hdel,刪除欄位,成功返回1,重複刪除返回0hdel me name

  • hsetnx,新增新欄位,並設定值hsetnx me age 22

  • hincrby,給欄位的值加1、或者減-1hincrby me age 1

  • hmset,設定多個欄位hmset me height 177 weight 140

  • hmget,獲取多個欄位hmget me height age

  • hgetall,返回所有欄位及值hgetall me

  • hkeys,獲取所有欄位的名字hkeys me

  • hvals,獲取所有欄位的值hvals me

Redis基本命令 Key

  • keys * ,顯示所有的鍵

  • del ,刪除一個或多個鍵

    批量刪除

  • exists,判斷key是否存在,不存在返回0

  • move,將當前資料庫的鍵移動到其它db1資料庫

    127.0.0.1:6379> exists age
    (integer) 1
    127.0.0.1:6379> move age 1
    (integer) 1
    127.0.0.1:6379> EXISTS age
    (integer) 0
    127.0.0.1:6379> select 1
    OK
    127.0.0.1:6379[1]> EXISTS age
    (integer) 1
  • rename,修改鍵的名稱rename age newage

  • renamenx,當新名稱不存在時才執行

    127.0.0.1:6379[1]> set city shanghai
    OK
    127.0.0.1:6379[1]> set newcity hangzhou
    OK
    127.0.0.1:6379[1]> renamenx city newcity
    (integer) 0
    127.0.0.1:6379[1]> get city
    "shanghai"
    127.0.0.1:6379[1]> get newcity
    "hangzhou"
  • ttl,給鍵設定超時時間,單位秒

    set age ex 100

    ttl age檢視剩餘多久

  • persist,將設定超時的鍵改為永久鍵

    persist age 100

    ttl age檢視剩餘時間,返回-1代表該鍵已經變為永久

  • expire,更新鍵超時時間

    expire age 200

  • expireat,unix時間戳格式設定鍵超時時間

    expireat age 1588918492

  • 不同型別的測試資料,用type來檢視資料型別

    127.0.0.1:6379[1]> set name katy
    OK
    127.0.0.1:6379[1]> lpush testlist a b c
    (integer) 3
    127.0.0.1:6379[1]> sadd testset 1 2 3
    (integer) 3
    127.0.0.1:6379[1]> zadd testzset 10 a 20 b
    (integer) 2
    127.0.0.1:6379[1]> hset testhash name zhangsan age 20
    (integer) 2
    127.0.0.1:6379[1]> type name
    string
    127.0.0.1:6379[1]> type testlist
    list
  • randomkey,返回任意鍵

  • flushdb,清空當前資料庫

  • dbsize,返回當前資料庫key的數量

Redis基本命令 事務

事務中如果有一條命令執行失敗,其後命令仍然會被執行

  • multi,新增新事務,標記事務的開始

  • exec,執行一個事務命令佇列內的所有命令

  • discard,回滾事務隊命令列內的所有命令。discard只能在exec前執行

  • 執行第一條命令,但命令是存在事務命令佇列的,沒有立即執行

    127.0.0.1:6379[1]> incr age
    QUEUED
  • 執行第二條命令,命令也被存在事務命令佇列的,沒有立即執行

    127.0.0.1:6379[1]> incr age2
    QUEUED
  • 執行所有事務命令佇列中所有命令

    127.0.0.1:6379[1]> exec
    1) (integer) 1
    2) (integer) 1
    127.0.0.1:6379[1]> get age
    "1"
    127.0.0.1:6379[1]> get age2
    "1"
  • 開啟新事務,設定鍵及string型別的值

    set name zhangsan

    從鍵name所關聯的值的頭部彈出元素,由於該值是字串型別,而lpop命令僅能用於List型別,因此在執行exec命令時,該命令將會失敗

    127.0.0.1:6379[1]> lpop name
    (error) WRONGTYPE Operation against a key holding the wrong kind of value

    再次設定鍵name的值為字串,獲取鍵name的值,以便確認該值是否被事務中的第二個set命令設定成功

    127.0.0.1:6379[1]> set name lisi
    OK
    127.0.0.1:6379[1]> get name
    "lisi"

    從結果中可以看出,事務中的第二條命令lpop執行失敗,而其後的set和get命令均執行成功,這一點是Redis的事務與關係型資料庫中的事務之間最為重要的差別

    為鍵city設定一個事務執行前的值;開啟一個事務;在事務內為該鍵設定一個新值;放棄事務;檢視鍵city的值,從結果中可以看出該鍵的值仍為事務開始之前的值

    127.0.0.1:6379[1]> set name lisi
    OK
    127.0.0.1:6379[1]> get name
    "lisi"
    127.0.0.1:6379[1]> set city shanghai
    OK
    127.0.0.1:6379[1]> multi
    OK
    127.0.0.1:6379[1]> set city hangzhou
    QUEUED
    127.0.0.1:6379[1]> discard
    OK
    127.0.0.1:6379[1]> get city
    "shanghai"

    discard只能在exec前執行

    127.0.0.1:6379[1]> discard
    (error) ERR DISCARD without MULI