1. 程式人生 > >redis 系列10 字串物件

redis 系列10 字串物件

一. 字串物件編碼

  Redis中字串可以儲存3種類型,分別是位元組串(byte string)、整數、浮點數在上章節中講到字串物件的編碼可以是int, raw,embstr。 如果一個字串物件儲存的是整數值,那麼物件RedisObject結構的ptr 屬性裡面將void*轉換成long,字串物件的編碼設定為int。

  例1: 使用set命令,建立一個int編碼的字串物件。

    127.0.0.1:6379> set num1 10086
    OK
    127.0.0.1:6379> object encoding num1
    "int"

  RedisObject結構中ptr指向一個long值,參考圖如下所示:

  例2: 使用set命令,建立一個raw編碼的字串物件。這個字串值的長度大於32位元組。

    127.0.0.1:6379> set story3 "long long long long long long long long long ..."
    OK
    127.0.0.1:6379> strlen story3
    (integer) 48
    127.0.0.1:6379> object encoding story3
    "raw"

    RedisObject結構中ptr指向SDS的sdshdr結構, 參考圖如下所示:

  例3: 使用set命令,建立一個embstr編碼的字串物件, 這個字串值的長度小於等於32位元組。

    127.0.0.1:6379> set story4 "long long long long long lon"
    OK
    127.0.0.1:6379> strlen story4
    (integer) 28
    127.0.0.1:6379> object encoding story4
    "embstr"

    embstr編碼是專門用於儲存短字串的一種優化編碼方式,這種編碼和raw編碼一樣,都使用RedisObject結構和sdshdr結構來表示字串物件。使用embstr編碼的字串物件來儲存短字串值有以下好處: 

(1) embstr編碼將建立字串物件所需的記憶體分配次數從raw編碼的兩次降低為一次。

(2) 釋放embstr編碼的字串物件只需要呼叫一次記憶體釋放函式。而raw編碼的為二次。

(3) embstr編碼的字串物件的所有資料都儲存在一塊連續的記憶體中,能更好的帶來快取優勢。

  例4: 使用set命令,建立一個浮點數,也是作為字串儲存,屬於embstr編碼的字串物件。

    127.0.0.1:6379> set pi 3.14
    OK
    127.0.0.1:6379> object encoding pi
    "embstr"

    最後:總結字串物件儲存各型別值的編碼方式

字串物件值 編碼
可以用long型別儲存的整數 int
可以用long double型別儲存的浮點數 Embstr或者raw
值長度太長而沒辦法用long型別表示的整數,或者浮點數。 Embstr或者raw
值的長度大於32位元組 raw
長度小於32位元組 Embstr

二. key命令  

 -- del命令 刪除存在的key, 如果沒有存在的key返回0。
        127.0.0.1:6379> del msg
        (integer) 1
-- dump命令 序列化給定 key, 如果 key 不存在, 那麼返回 nil,否則返回序列化之後的值。 127.0.0.1:6379> dump msg "\x00\x05hello\b\x00\xda_3\xc9\xcc-\xaa2"
-- EXISTS命令 用於檢查給定 key 是否存在, 若 key 存在返回 1 ,否則返回 0127.0.0.1:6379> exists msg (integer) 1
-- Expire 命令用於設定 key 的過期時間。key 過期後將不再可用。設定成功返回1。下面設定了過期時間為 1 分鐘,1分鐘後該鍵會自動刪除。 127.0.0.1:6379> expire msg 60 (integer) 1
-- pattern 命令用於查詢所有符合給定模式,返回符合給定模式的 key 列表 (Array)。 127.0.0.1:6379> set msg1 1 OK 127.0.0.1:6379> set msg2 2 OK 127.0.0.1:6379> set msg3 3 OK 127.0.0.1:6379> keys msg* 1) "msg2" 2) "msg1" 3) "msg3"
-- PERSIST 命令用於移除給定 key 的過期時間,使得 key 永不過期。 -- Pttl 命令以毫秒為單位返回 key 的剩餘過期時間。 -- ttl 命令以秒為單位返回 key 的剩餘過期時間。 127.0.0.1:6379> expire msg1 60 (integer) 1 127.0.0.1:6379> ttl msg1 (integer) 49 127.0.0.1:6379> persist msg1 (integer) 1 127.0.0.1:6379> ttl msg1 (integer) -1
-- RANDOMKEY 命令從當前資料庫中隨機返回一個 key 127.0.0.1:6379> RANDOMKEY "fruit-price"
-- Rename 命令用於修改 key 的名稱 127.0.0.1:6379> rename msg1 msg1new OK
-- Renamenx 命令修改 key名稱,新的key沒有存已有資料庫中時,修改成功.返回1. 127.0.0.1:6379> get msg2 "2" 127.0.0.1:6379> get msg3 "3" 127.0.0.1:6379> renamenx msg2 msg3 (integer) 0 127.0.0.1:6379> renamenx msg2 msg4 (integer) 1 

其它:
  MOVE key db 將當前資料庫的 key 移動到給定的資料庫 db 當中。
  -- type 命令用於返回 key 所儲存的值的型別
  none (key不存在),string (字串),list (列表),set (集合),zset (有序集),hash (雜湊表)

 

三.字串物件命令

 --  set命令指定 key 的值
 --  get 命令獲取指定 key 的值
 --  GETRANGE返回 key 中字串值的子字元
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> getrange msg 0 2
    "hel"

 --  getset 命令將給定 key 的值重新設定 value ,並返回 key 的舊值(old value)
    127.0.0.1:6379> getset msg "hi"
    "hello"
    127.0.0.1:6379> get msg
    "hi"

 --  MGET 命令獲取所有(一個或多個)給定 key 的值
    127.0.0.1:6379> mget msg msg3
    1) "hi"
    2) "3"

 -- setex 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)
    127.0.0.1:6379> setex message 10 "hello"
    OK
    127.0.0.1:6379> get message
    "hello"
    127.0.0.1:6379> get message
    (nil)   10秒後

 -- setnx命令 只有在 key 不存在時設定 key 的值, 下面msg鍵存在,設定失敗返回0,msg1鍵不存在,設定成功,返回1
    127.0.0.1:6379> setnx msg "hello"
    (integer) 0
    127.0.0.1:6379> setnx msg1 "hello"
    (integer) 1

-- setrange 命令用value引數覆寫給定 key 所儲存的字串值,從偏移量 offset 開始。
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> setrange msg 1 "i..."
    (integer) 5
    127.0.0.1:6379> get msg
    "hi..."

-- strlen 命令返回 key 所儲存的字串值的長度。
    127.0.0.1:6379> strlen msg
    (integer) 5

-- mset 命令同時設定一個或多個 key-value 對。
    127.0.0.1:6379> mset msg "hi" msg2 "hi"
    OK
    127.0.0.1:6379> mget msg msg2
    1) "hi"
    2) "hi"

-- msetnx命令同時設定一個或多個 key-value 對,所有給定 key 都必須不存在, 只要存在一個已有的key,所有新增失敗。
    127.0.0.1:6379> msetnx msg6 "hello" msg5 "hello"
    (integer) 1
    127.0.0.1:6379> mget msg6 msg5
    1) "hello"
    2) "hello"

-- psetex命令 它以毫秒為單位設定 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
    127.0.0.1:6379> psetex msg5 5000 "hi"
    OK
    127.0.0.1:6379> get msg5
    "hi"
    127.0.0.1:6379> get msg5
    (nil)  5秒後

--  Incr 命令將 key 中儲存的數字值增一。
    127.0.0.1:6379> set num  1
    OK
    127.0.0.1:6379> incr num
    (integer) 2
    127.0.0.1:6379> get num
    "2"

-- Incrby 命令將 key 中儲存的數字加上指定的增量值。在值為2是加10。
    127.0.0.1:6379> incrby num 10
    (integer) 12
    127.0.0.1:6379> get num
    "12"
    
-- Decrby 命令將 key 所儲存的值減去指定的減量值。將值為12 減去10。
    127.0.0.1:6379> decrby num 10
    (integer) 2
    127.0.0.1:6379> get num
    "2"

 --  Append 命令用於為指定的 key 追加值。
    127.0.0.1:6379> set msg "hello"
    OK
    127.0.0.1:6379> append msg "world"
    (integer) 10
    127.0.0.1:6379> get msg
    "helloworld"