一. 字元串對象編碼 Redis中字元串可以存儲3種類型,分別是位元組串(byte string)、整數、浮點數。在上章節中講到字元串對象的編碼可以是int, raw,embstr。 如果一個字元串對象保存的是整數值,那麼對象RedisObject結構的ptr 屬性裡面將void*轉換成long,字元 ...
一. 字元串對象編碼
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"