1. 程式人生 > >redis string 資料結構

redis string 資料結構

String(字串)

redis 主要包含 5 種資料結構,string 是 redis 最基本的型別,最大能儲存 512MB,一個 key 對應一個 value,string 可以包含任何資料,包括數字、jpg圖片或者序列化的物件。


常用 redis string 命令


  • set 命令:用於設定給定 key 的值,如果 key 已經儲存其他值, set 就覆寫舊值,且無視型別。
    NX:not exist 不存在就存入,相當於資料庫中的插入操作
    XX:exist 存在就存入,相當於資料庫中的更新操作
    基本語法
    127.0.0.1:6379> set key value [expiration EX seconds|PX milliseconds] [NX|XX]
    // 對不存在的 key 進行設定
    127.0.0.1:6379> set key "value"  // 引號可不寫
    OK
    127.0.0.1:6379> get key
    "value"
    // 對已存在的 key 進行設定  
    127.0.0.1:6379> set key "newvalue" 
    OK
    127.0.0.1:6379> get key 
    "newvalue"
    
  • mset 命令:multiple set, 用於同時設定一個或多個 key-value 對。
    基本語法
    redis 127.0.0.1:6379> mset key value [key value ...]
    redis 127.0
    .0.1:6379> mset key1 "Hello" key2 "World" OK redis 127.0.0.1:6379> get key1 "Hello" redis 127.0.0.1:6379> get key2 "World"
  • setex 命令:set expiration,為指定的 key 設定值及其過期時間,如果 key 已經存在, SETEX 命令將會替換舊的值,key 的過期時間為 seconds (以秒為單位)。
    基本語法
    redis 127.0.0.1:6379> setex key seconds value
     redis 127.0.0.1:6379
    > setex mykey 60 redis OK redis 127.0.0.1:6379> ttl mykey 60 redis 127.0.0.1:6379> get mykey "redis"
  • psetex 命令:以毫秒為單位設定 key 的生存時間。
    基本語法
    redis 127.0.0.1:6379> psetex key millisecond value
    redis 127.0.0.1:6379> psetex mykey 1000 "Hello"
    OK
    redis 127.0.0.1:6379> pttl mykey  // pttl 命令以毫秒為單位返回 key 的剩餘過期時間
    999
    redis 127.0.0.1:6379> get mykey
    1) "Hello"
    
  • setnx 命令:set if not exists, 在指定的 key 不存在時,為 key 設定指定的值。
    基本語法
    redis 127.0.0.1:6379> setnx key value
    redis> exists job                // job 不存在
    (integer) 0
    redis> setnx job "programmer"    // job 設定成功
    (integer) 1
    redis> setnx job "code-farmer"   // 嘗試覆蓋 job ,失敗
    (integer) 0
    redis> get job                   // 沒有被覆蓋
    "programmer"
    
  • msetnx 命令:用於所有給定 key 都不存在時,同時設定一個或多個 key-value 對,當所有 key 都成功設定,返回 1 ,如果所有給定 key 都設定失敗(至少有一個 key 已經存在),那麼返回 0 。原子性:要麼成功執行,要麼失敗完全不執行
    基本語法
    redis 127.0.0.1:6379> msetnx key value [key value ...]
    // 對不存在的 key 進行 msetnx
    redis> msetnx rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
    (integer) 1
    redis> mget rmdbs nosql key-value-store
    1) "MySQL"
    2) "MongoDB"
    3) "redis"
    // mset 的給定 key 當中有已存在的 key
    redis> msetnx rmdbs "Sqlite" language "python"  # rmdbs 鍵已經存在,操作失敗
    (integer) 0
    redis> exists language                          # 因為 mset 是原子性操作,language 沒有被設定
    (integer) 0
    redis> get rmdbs                                # rmdbs 也沒有被修改
    "MySQL"
    
  • setrange 命令:用指定的字串覆蓋給定 key 所儲存的字串值,覆蓋的位置從偏移量 offset 開始,返回被修改後的字串長度,偏移量 offset 正向 0 ~ n,反向-1 ~ -n。
    offset 偏移量基本語法
    redis 127.0.0.1:6379> setrange key offset value
    redis 127.0.0.1:6379> set name "Hello World"
    OK
    redis 127.0.0.1:6379> setrange name 6 "Redis"   // 在設定的key為name的字串的第
    (integer) 11
    redis 127.0.0.1:6379> GET key1
    "Hello Redis"
    

  • get 命令:用於獲取指定 key 的值,如果 key 不存在,返回 nil ,如果key 儲存的值不是字串型別,返回一個錯誤。
    基本語法
    127.0.0.1:6379> get key
    // 對不存在的 key 進行 get
    127.0.0.1:6379> get new
    (nil)
    127.0.0.1:6379> set new name  
    OK
    127.0.0.1:6379> get new
    "name"
    //  對不是字串型別的 key 進行 get
    127.0.0.1:6379> lpush inner java c js
    (integer) 3
    127.0.0.1:6379> get inner
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
    
  • getrange 命令:用於獲取儲存在指定 key 中字串的子字串,字串的擷取範圍由 startend 兩個偏移量決定(包括 start 和 end 在內)。
    基本語法
    127.0.0.1:6379> getrange key start end
    redis 127.0.0.1:6379> set mykey "This is my test key"
    OK
    redis 127.0.0.1:6379> getrange mykey 0 3   // 獲取字串的前四位
    "This"
    redis 127.0.0.1:6379> getrange mykey 0 -1  // 獲取整個字串
    "This is my test key"
    
  • getset 命令:用於設定指定 key 的值,並返回 key 的舊值。
    基本語法
    redis 127.0.0.1:6379> getset key value
    redis> getset mykey mongodb    # 沒有舊值,返回 nil
    (nil)
    redis> getset mykey
    "mongodb"
    redis> getset mykey redis      # 返回舊值 mongodb
    "mongodb"
    redis> get mykey
    "redis"
    
  • mget 命令:返回所有(一個或多個)給定 key 的值,返回一個包含所有給定 key 的值的列表,如果給定的 key 裡面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。
    基本語法
    redis 127.0.0.1:6379> mget key [key ...]
    redis 127.0.0.1:6379> set key1 "hello"
    OK
    redis 127.0.0.1:6379> set key2 "world"
    OK
    redis 127.0.0.1:6379> mget key1 key2 undefi_Key
    1) "Hello"
    2) "World"
    3) (nil)
    
  • strlen 命令:string length,用於獲取指定 key 所儲存的字串長度,返回字串長度,當 key 儲存的不是字串時,返回 0 。
    基本語法
    redis 127.0.0.1:6379> strlen key
    redis> set mykey "Hello world"      # 獲取存在的字串的長度
    OK
    redis> strlen mykey
    (integer) 11
    redis> strlen nonexisting           # 不存在的 key 長度為 0
    (integer) 0
    

  • incr 命令:increase,將 key 中儲存的數字值增 1,如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 incr 操作,如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
    基本語法
    redis> set page_view 20
    OK
    redis> incr page_view
    (integer) 21
    redis> get page_view    # 數字值在 Redis 中以字串的形式儲存
    "21"
    
  • incrby 命令:將 key 中儲存的數字加上指定的增量值,如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 incrby 命令,如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
    基本語法
    redis 127.0.0.1:6379> incrby key increment
    redis> set rank 50    // key 存在且是數字值
    OK
    redis> incr rank 20
    (integer) 70
    redis> get rank
    "70"
    
    redis> exists counter // key 不存在時
    (integer) 0
    redis> incrby counter 30
    (integer) 30
    redis> get counter
    "30"
    
    redis> set book "long long ago..."   // key 不是數字值時
    OK  
    redis> incrby book 200
    (error) ERR value is not an integer or out of range
    
  • incrbyfloat 命令:為 key 中所儲存的值加上指定的浮點數增量值,如果 key 不存在,那麼 incrbyfloat 會先將 key 的值設為 0 ,再執行加法操作。
    基本語法
    redis 127.0.0.1:6379> incrbyfloat key increment
    # incrbyfloat 使用之後,再使用 incrby 會出現報錯
    redis> set mykey 30
    OK
    redis> get mykey
    "30"
    redis> incrby mykey 20
    (integer) 50
    redis> get mykey
    "50"
    redis> incrbyfloat mykey 1.6
    51.6
    redis> get mykey
    "51.6"
    redis> incrby mykey 20
    (error) ERR value is not an integer or out of range  # err 報錯
    // 值和增量都不是指數符號
    redis> set mykey 10.50
    OK
    redis> incrbyfloat mykey 0.1
    "10.6"
    // 值和增量都是指數符號
    redis> set mykey 314e-2
    OK  
    redis> get mykey                # set 設定的值可以是指數符號
    "314e-2"
    redis> incrbyfloat mykey 0      # 但執行 incrbyfloat 之後格式會被改成非指數符號
    "3.14"
    // 可以對整數型別執行
    redis> set mykey 3
    OK
    redis> incrbyfloat mykey 1.1
    "4.1"
    // 後跟的 0 會被移除
    redis> set mykey 3.0
    OK
    redis> get mykey                 # set 設定的值小數部分可以是 0
    "3.0"
    # incrbyfloat 會將無用的 0 忽略掉,有需要的話,將浮點變為整數
    redis> incrbyflaot mykey 1.000000000000000000000    
    "4"
    redis> get mykey
    "4"
    
  • decr 命令:decrease, 將 key 中儲存的數字值減 1 ,如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 decr 操作,如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
    基本語法
    redis 127.0.0.1:6379> decr key
    # decr 命令對存在的數字值 key 進行操作
    redis> set failure_times 10
    OK
    redis> decr failure_times
    (integer) 9 
    # 對不存在的 key 值進行 decr
    redis> exists count
    (integer) 0
    redis> decr count
    (integer) -1
    # 對存在但不是數值的 key 進行 decr
    redis> set company YOUR_CODE_SUCKS.LLC
    OK
    redis> decr company
    (error) ERR value is not an integer or out of range
    
  • decrby 命令:將 key 所儲存的值減去指定的減量值,如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 DECRBY 操作,如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
    基本語法
    redis 127.0.0.1:6379> decrby key increment
    // 對已存在的 key 進行 decrby
    redis> set count 100
    OK
    redis> decrby count 20
    (integer) 80
    // 對不存在的 key 進行 decrby
    redis> exists pages
    (integer) 0
    redis> decrby pages 10
    (integer) -10
    
  • append 命令:用於為指定的 key 追加值,如果 key 已經存在並且是一個字串, append 命令將 value 追加到 key 原來的值的末尾,如果 key 不存在, append 就簡單地將給定 key 設為 value ,就像執行 set key value 一樣。追加指定值之後, key 中字串的長度。
    基本語法
    redis 127.0.0.1:6379> append key value
    // 對不存在的 key 執行 append
    redis> exists myphone               # 確保 myphone 不存在
    (integer) 0
    redis> append myphone "nokia"       # 對不存在的 key 進行 APPEND ,等同於 set myphone "nokia"
    (integer) 5                         # 字元長度
    // 對已存在的字串進行 APPEND
    redis> append myphone " - 1110"     # 長度從 5 個字元增加到 12 個字元
    (integer) 12
    redis> get myphone
    "nokia - 1110"