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 ,否則返回 0 。 127.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"