Redis學習筆記 之 String類型


1 簡單概述

    String數據類型是Redis中最簡單、最基礎的數據類型,Redis中所有的KEY和VALUE都是String類型,且其他更爲複雜的數據類型(List、Set、Sorted-Set、Hash)也均基於String數據類型來存儲的。String數據類型是二進制安全的,也就是說String可以包含任何格式的數據,比如:JPG圖片、序列化的對象等。


2 操作命令

表1 String類型操作命令

01 APPEND  key value
  功能描述:在 key 對應原值後追加 value 字串
返回結果:APPEND操作之後,key 對應 value 的最終長度
注意事項:
    1)時間複雜度:O(1)
    2)當 key 存在,且爲STRING類型時,將會將value追加到原有值末尾;
    3)如果 key 不存在,將會新建 key / value。
02 DECR  key
  功能描述:將 key 對應的 value 原子性的減1
返回結果:返回執行減1操作後 key 對應的 value 值
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 對應 value 能轉化爲數字,則執行減1操作;
    3)如果 key 對應 value 不能轉化爲數字,則返回錯誤信息;
    4)該操作是原子性的。假設:當前KEY對應的VALUE值爲100,當3個客戶端同時執行該操作時,最終結果將會是97。
03 INCR  key
  功能描述:將 key 對應的 value 原子性的加1
返回結果:返回執行加1操作後 key 對應的 value 值
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 對應 value 能轉化爲數字,則執行加1操作;
    3)如果 key 對應 value 不能轉化爲數字,則返回錯誤信息;
    4)該操作是原子性的。假設:當前 key 對應的 value 值爲100,當3個客戶端同時執行該操作時,最終結果將會是103。
04
DECRBY  key decremen
  功能描述:將 key 對應的 value 原子性的減decrement
返回結果:返回執行減操作後 key 對應的 value 值
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 對應 value 能轉化爲數字,則執行減操作;
    3)如果 key 對應 value 不能轉化爲數字,則返回錯誤信息;
    4)參數decrement不能爲浮點數,只能爲整數;
    5)該操作是原子性的。
05 INCRBY  key increment
  功能描述:將 key 對應的 value 原子性的加increment
返回結果:返回執行加操作後 key 對應的 value 值
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 對應 value 能轉化爲數字,則執行加操作;
    3)如果 key 對應 value 不能轉化爲數字,則返回錯誤信息;
    4)參數increment不能爲浮點數,只能爲整數;
    5)該操作是原子性的。
06 INCRBYFLOAT  key increment
  功能描述:將 key 對應的 value 原子性的加increment
返回結果:返回執行加操作後 key 對應的 value 值
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 對應 value 能轉化爲數字,則執行加操作;
    3)如果 key 對應 value 不能轉化爲數字,則返回錯誤信息;
    4)此命令的參數increment可以爲浮點數,但是請注意此命令的計算精度;
    5)暫時沒有命令DECRBYFLOAT,如果想進行浮點數的減操作,可以模仿:INCRBYFLOAT key -5.9;
    6)該操作是原子性的。
07 SET  key value [EX seconds] [PX milliseconds] [NX|XX]
  功能描述:設置 key 對應的 value
參數說明:
    從 Redis 2.6.12 版本開始, SET 命令的行爲可以通過一系列參數來修改:
    1)EX second:設置鍵的過期時間爲second秒
         SET key value EX second 效果等同於 SETEX key second value。
    2)PX millisecond:設置鍵的過期時間爲millisecond毫秒
         SET key value PX millisecond 效果等同於 PSETEX key millisecond value。
    3)NX :只在鍵不存在時,纔對鍵進行設置操作
         SET key value NX 效果等同於 SETNX key value
    4)XX :只在鍵已經存在時,纔對鍵進行設置操作。
返回結果:
    1)在2.6.12版本之前,總是返回OK;
    2)在2.6.12版本開始,SET操作完成時才返回OK;
    3)如果設置了 NX 或者 XX ,但因爲條件沒達到而造成設置操作未執行,那麼命令返回空批量回復(NULL Bulk Reply)。
注意事項:
    1)時間複雜度:O(1)
    2)如果 key 已經存在,此操作將直接覆蓋舊值,且無視類型;
    3)對於某個原本帶有生存時間(TTL)的鍵來說, 當 SET 命令成功在這個鍵上執行時, 這個鍵原有的 TTL 將被清除。
08 GET key
  功能描述:獲取指定 key 的 value
返回結果:指定 key 的 value
注意事項:
    1)時間複雜度:O(1)
    2)如果該 key 不存在,返回NIL;
    3)如果該 key 不是String類型,將返回錯誤信息。
09 GETSET  key value
  功能描述:原子性的設置 key 的 value,同時獲取該 key 的原 value
返回結果:該 key 的原 value
注意事項:
    1)時間複雜度:O(1)
    2)如果該 key 不存在,將新建 key,並返回NIL;
    3)如果該 key 不是String類型,將返回錯誤信息。
10 STRLEN  key
  功能描述:獲取該KEY的VALUE長度
返回結果:該KEY的VALUE長度
注意事項:
    1)時間複雜度:O(1)
    2)如果該 key 不存在,將返回0;
    3)如果該 key 不是String類型,將返回錯誤信息。
11 SETEX  key seconds value
  功能描述:設置 key 對應值爲 value,同時設置該 key 的生存時間爲 seconds 秒
返回結果:操作完成時才返回OK
注意事項:
    1)時間複雜度:O(1)
    2)如果KEY已經存在,此操作將直接覆蓋舊值;
    3)該命令類似如下兩條命令:
          SET key value
          EXPIRE key seconds
          不同的是,SETEX是原子性的。關聯值和設置生存時間兩個動作會在同一時間內完成,該命令在 Redis 用作緩存時,非常實用;
    4)當 seconds 參數不合法時,返回錯誤。
12 SETNX  key value
  功能描述:當前僅當 key 不存在時,設置 key 對應值爲 value
返回結果:設置成功返回1,設置失敗返回0
注意事項:
    1)時間複雜度:O(1)
    2)將 key 的值設爲 value ,當且僅當 key 不存在;
    3)若給定的 key 已經存在,則 SETNX 不做任何動作;
    4)SETNX 是"SET if Not eXists"(如果不存在,則 SET)的簡寫。
13 SETBIT  key offset value
  功能描述:對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)
返回結果:指定偏移量原來儲存的位
注意事項:
    1)時間複雜度:O(1)
    2)位的設置或清除取決於 value 參數,可以是 0 也可以是 1;
    3)當 key 不存在時,自動生成一個新的字符串值;
    4)字符串會進行伸展(grown)以確保它可以將 value 保存在指定的偏移量上。當字符串值進行伸展時,空白位置以 0 填充;
    5)offset 參數必須大於或等於 0 ,小於 2^32 (bit 映射被限制在 512 MB 之內);
    6)對使用大的 offsetSETBIT操作來說,內存分配可能造成 Redis 服務器被阻塞。具體參考SETRANGE 命令,warning(警告)部分。
14 GETBIT  key offset
  功能描述:對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)
返回結果:指定偏移量上的位
注意事項:
    1)時間複雜度:O(1)
    2)當 offset 比字符串值的長度大,或者 key 不存在時,返回 0 ;
    3)當KEY不存在時,進行GETBIT操作將返回0。
15 SETRANGE  key offset value
  功能描述:用 value 參數覆寫(overwrite)給定 key 所儲存的字符串值,從偏移量 offset 開始
返回結果:修改後的字符串長度
注意事項:
    1)時間複雜度:對小的字符串,平攤複雜度O(1)。(關於什麼字符串是”小”的,請參考 APPEND 命令) 否則爲O(M), M 爲 value 參數的長度
    2)不存在的 key,則將其原值當作空白字符串處理;
    3)SETRANGE 命令會確保字符串足夠長以便將 value 設置在指定的偏移量上,如果給定 key 原來儲存的字符串長度比偏移量小(比如字符串只有 5 個字符長,但你設置的 offset 是 10 ),那麼原字符和偏移量之間的空白將用零字節(zerobytes, "\x00" )來填充;
    4)注意你能使用的最大偏移量是 2^29-1(536870911) ,因爲 Redis 字符串的大小被限制在 512 兆(megabytes)以內。如果你需要使用比這更大的空間,你可以使用多個 key ;
    5)當生成一個很長的字符串時,Redis 需要分配內存空間,該操作有時候可能會造成服務器阻塞(block)。在2010年的Macbook Pro上,設置偏移量爲 536870911(512MB 內存分配)耗費約 300 毫秒, 設置偏移量爲 134217728(128MB 內存分配),耗費約 80 毫秒,設置偏移量 33554432(32MB 內存分配),耗費約 30 毫秒,設置偏移量爲 8388608(8MB 內存分配),耗費約 8 毫秒。 注意若首次內存分配成功之後,再對同一個 key 調用 SETRANGE 操作,無須再重新內存。
16 GETRANGE  key start end
  功能描述:截取 key 對應字串值的子串
返回結果:截取得出的子串
注意事項:
    1)時間複雜度:O(N)(N表示要返回的字串長度)
    2)字符串的截取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內);
    3)負數偏移量表示從字符串最後開始計數, -1 表示最後一個字符, -2 表示倒數第二個,以此類推;
    4)GETRANGE 通過保證子字符串的值域(range)不超過實際字符串的值域來處理超出範圍的值域請求;
    5)在 <= 2.0 的版本里,GETRANGE 被叫作 SUBSTR。
17 MSET  key value [key value ...]
  功能描述:同時設置1個或多個KEY-VALUE對
返回結果:總是返回 OK (因爲 MSET 不可能失敗)
注意事項:
    1)時間複雜度:O(N)(N表示 key-value對的數量)
    2)如果某個給定 key 已經存在,那麼 MSET 會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用 MSETNX 命令:它只會在所有給定 key 都不存在的情況下進行設置操作;
    3)MSET 是一個原子性(atomic)操作,所有給定 key 都會在同一時間內被設置,某些給定 key 被更新而另一些給定 key 沒有改變的情況,不可能發生。
18 MSETNX  key value [key value ...]
  功能描述:同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在
返回結果:成功返回1,失敗返回0
注意事項:
    1)時間複雜度:O(N)(N表示 key-value對的數量)
    2)即使只有一個給定 key 已存在, MSETNX 也會拒絕執行所有給定 key 的設置操作;
    3)MSETNX 是原子性的,因此它可以用作設置多個不同 key 表示不同字段(field)的唯一性邏輯對象(unique logic object),所有字段要麼全被設置,要麼全不被設置。
19 MGET  key [key ...]
  功能描述:返回所有(一個或多個)給定 key 的值
返回結果:一個包含所有給定 key 的值的列表
注意事項:
    1)時間複雜度:O(N)(N表示 key-value對的數量)
    2)如果給定的 key 裏面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。因此,該命令永不失敗。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章