string類型基本介紹
Redis 中的字符串,是直接按照二進制的方式進行存儲的。也就是說,在存取的過程中,是不會做任何編碼轉換的。存的是啥,取的時候就是啥。
Redis 的這個機制,就使得 Redis 非常適合用來存儲各種各樣的二進制數據,比如JSON、XML、圖片、視頻、音頻、壓縮包等等。
雖然可以存儲視頻、音頻等,但還是不建議,因為這些文件大小往往都不小,容易造成阻塞。
FLUSHALL
FLUSHALL
FLUSHALL
命令用于清空 Redis 數據庫中的所有鍵值對。- 該命令謹慎使用為好。
string類型常用命令
SET
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
SET
命令用于設置鍵值對。key
是要設置的鍵名,value
是要設置的鍵值。EX seconds
:設置鍵的過期時間為 seconds 秒。PX milliseconds
:設置鍵的過期時間為 milliseconds 毫秒。NX
:只在鍵不存在時,才對鍵進行設置操作。如果鍵存在,則不設置,返回 nilXX
:只在鍵存在時,才對鍵進行設置操作。如果鍵不存在,則不設置,返回 nil
GET
GET key
GET
命令用于獲取鍵值對的值。GET
命令只作用于該鍵對應的值為字符串類型,如果不為字符串類型,使用GET
命令則會報錯:
WRONGTYPE Operation against a key holding the wrong kind of value
MSET
MSET key value [key value...]
MSET
命令用于一次性設置多個鍵值對。- 所有鍵值對之間用空格分隔。
- 時間復雜度為 O(N),這里 N 為要設置的鍵值對的數量。
MGET
MGET key [key...]
MGET
命令用于一次性獲取多個鍵值對的值。- 所有鍵之間用空格分隔。
- 時間復雜度為 O(N),這里 N 為要獲取的鍵的數量。
SETNX
SETNX key value
- 此處的 NX 就是上方 SET 命令中的 NX。
SETXX
SETXX key value
- 此處的 XX 就是上方 SET 命令中的 XX。
SETEX
SETEX key seconds value
SETEX
命令用于設置鍵值對,并設置鍵的過期時間為 seconds 秒。- 等價于
SET key value EX seconds
PSETEX
PSETEX key milliseconds value
PSETEX
命令用于設置鍵值對,并設置鍵的過期時間為 milliseconds 毫秒。- 等價于
SET key value PX milliseconds
INCR
INCR key
INCR
命令用于對鍵的值做加 1 操作。- 返回值為執行加 1 操作之后的結果。
- 執行該命令的鍵對應的值必須是 int 類型,否則會報錯:
ERR value is not an integer or out of range
- 該整數為 64 位 (8 字節)的,相當于 C++ 的
long long
類型,Java 的long
類型。 - 如果對一個不存在的鍵執行了該命令,則會創建一個默認值為 0 的鍵,并對其進行加 1 操作。
DECR
DECR key
DECR
命令用于對鍵的值做減 1 操作。- 返回值為執行減 1 操作之后的結果。
- 其特性與
INCR
命令相同。
INCRBY
INCRBY key increment
INCRBY
命令用于對鍵的值做加法操作,加的值為 increment。- 返回值為執行加法操作之后的結果。
- 其特性與
INCR
命令相同。
DECRBY
DECRBY key decrement
DECRBY
命令用于對鍵的值做減法操作,減的值為 decrement。- 返回值為執行減法操作之后的結果。
- 其特性與
INCRBY
命令相同。
INCRBYFLOAT
INCRBYFLOAT key increment
INCRBYFLOAT
命令用于對鍵的值做浮點數的加法操作,加的值為 increment。- 返回值為執行浮點數加法操作之后的結果。
- Redis 中的浮點數的精度為小數點后 17 位。
- Redis 中的 string 類型并沒有提供類似于 float、double 這樣的浮點數類型。所以,其本質存的還是 embstr 或者 raw。
- 執行該命令時,其分為三個步驟:將取出來的字符串轉換為浮點數,進行浮點數加法操作,再將結果轉換為字符串存回去。
- 所以,該命令對性能有一定的影響,也不會,也不建議經常的使用。
上述操作的時間復雜度本質都還是 O(1)。由于 Redis 使用還是單線程模型,所以不用擔心線程安全問題。
APPEND
APPEND key value
APPEND
命令用于在鍵對應的值的末尾追加字符串 value。- 返回值添加后的字符串的長度,該長度單位為字節。
- 如果改鍵存在,則執行追加操作。如果改鍵不存在,則先創建一個空值,再執行追加操作,相當于執行 SET 操作。
- 注意:
- 當我們將值設置為一個漢字時,其返回的結果的為 3,這是因為我們當前使用的終端的編碼方式是 UTF-8,而漢字的編碼長度為 3,故存儲在 Redis 中的長度為 3。
- 如果我們直接獲取該鍵的值,則會看到類似于
\xe4\xbd\xa0
的結果,這是三個字節的 16 進制編碼。根據 UTF-8 碼表,可以得到其結果為你
。 - 如果想直接看到漢字,我們可以在啟動 Redis 客戶端時,多添加一條命令
--raw
,也就是redis-cli --raw
。這樣,我們獲取該鍵的值時,Redis 客戶端就會自動的對該二進制數據嘗試進行翻譯。
redis-cli --raw
GETRANGE
GETRANGE key start end
GETRANGE
命令用于獲取鍵對應的值的某一個特定范圍的子字符串。start
和end
是子字符串的起始和結束位置,都是 0 開始的偏移量。該獲取區間為 左閉右閉。- 返回值為對應區間的子字符串。
- 注意:
start
和end
都可以為負數,表示從字符串的末尾開始計算偏移量。比如 -1 為最后一個字符,-2 為倒數第二個字符,以此類推。
SETRANGE
SETRANGE key offset value
SETRANGE
用于從 offset 位置開始,將鍵對應的值覆寫為 value。- 如果 offset 比當前字符串長度還要長,則會在字符串末尾補上空格后再進行覆寫。
- 返回值是設置成功之后,字符串的長度。
- 如果該鍵不存在,則先創建一個空行值(\x00),再執行覆寫操作。
STRLEN
STRLEN key
STRLEN
命令用于獲取鍵對應值的字符串長度。- 返回值為字符串的長度,單位為字節。
string編碼方式
- Redis 字符串類型支持三種編碼方式:
raw
、embstr
、int
。raw
:普通字符串,用于存儲更長的字符串,底層是一個字節數組embstr
:壓縮字符串,當鍵對應的值字節數偏小時(據說是39字節),使用 embstr 編碼,節省內存。int
:64位/8字節 的整形,當存儲的值為純數字時,使用 int 編碼。浮點數使用的編碼還是 embstr。
string類型的使用場景
- 作為緩存:作為應用服務器和數據庫服務器的中間件,用于存儲熱點數據,提高查詢的效率。
- 計數:使用 Redis 作為基本的計數工具,它可以實現快速計數、查詢緩存的功能,同時數據可以異步處理或者落地到其他數據源。
- 存儲 session 會話:對于使用了負載均衡的分布式系統,可以將 session 信息存儲在 Redis 中,提高 session 共享的效率。
- 短信驗證碼:設置驗證碼的有效時間,設置一個用戶在規定的時間內只能獲取 N 次驗證碼,防止用戶惡意獲取驗證碼,造成服務器壓力。
以上只是介紹了 Redis 中的 string 類型常見的使用場景,實際上還可以用在更多地方,具體需要根據業務需求進行選擇。
hash類型基本介紹
`Redis 自身就是一個 hash類型,通過存儲鍵值對,以達到 O(1) 的時間復雜度的快速訪問。
這里的 hash類型,是 Redis 中 key-value 中的 value 的類型。也就是 value 是一個 hash 類型,可以存儲鍵值對結構。
hash類型常用命令
HSET
HSET key field value [field value... ]
- 區分這里 key 和 field 的區別:
- key:Redis 自身存儲的鍵,Redis 通過 key 可以訪問到對應 value
- field:當 Redis 中的 value 是一個 hash 類型時,field 也是該 hash 的 key。
- 返回值為存儲成功的鍵值對個數。
- 如果 field 已經存在,則會覆蓋原有的值。不論設置了多少個已經存在的 field,盡管設置成功了,返回值都為 0。因為這些字段的設置操作沒有引入新的字段,只是更新了已有字段的值。
HGET
HGET key field
- 返回指定 key 下的指定 field 的值。
HEXISTS
HEXISTS key field
- 判斷指定 key 下的指定 field 是否存在。
- 返回 1 代表存在,0 代表不存在。
HDEL
HDEL key field [field...]
- 刪除指定 key 下的指定 field。
- 返回值為刪除成功的鍵值對個數。
HKEYS
HKEYS key
- 返回指定 key 下所有的 field 名稱。
- 該命令和
keys *
一樣,謹慎使用。
HVALS
HVALS key
- 返回指定 key 下所有的 field 值。
- 該命令和
keys *
一樣,謹慎使用。
HGETALL
HGETALL key
- 返回指定 key 下所有的鍵值對。
- 該命令和
keys *
一樣,謹慎使用。
HMGET
HMGET key field [field...]
- 返回指定 key 下的多個 field 值。
- 返回值的順序和 field 參數的順序一致。
HMSET
HMSET key field value [field value...]
- 批量設置多個 field 值。
- 返回值不代表實際存儲成功的鍵值對個數。
- 該命令和 HSET 的作用一樣,為了不那么反直覺,所以才有該命令。
HLEN
HLEN key
- 返回指定 key 下的 field 數量,也就是 hash 元素的個數。
HSETNX
HSETNX key field value
- 只有當 field 不存在時,才設置 field 值。如果存在則設置失敗。
HINCRBY
HINCRBY key field increment
- 給指定 key 下的指定 field 值增加指定增量。
- 如果 field 不存在,則設置 field 值為 0 后再增加。
- 返回值是增加后的值。
- 這里不像 string 類型,有 DECRBY 命令,因為 hash 類型并不經常使用加減操作,而 HINCRBY 自身已經可以完成加減操作了
HINCRBYFLOAT
HINCRBYFLOAT key field increment
- 給指定 key 下的指定 field 值增加指定浮點數增量。
- 如果 field 不存在,則設置 field 值為 0 后再增加。
- 返回值是增加后的值。
HSTRLEN
HSTRLEN key field
- 返回指定 key 下的指定 field 值的字符串長度,單位為字節。
- 如果 field 不存在,則返回 0。
hash編碼方式
- Redis 中的 hash 類型有兩種編碼方式:
- ziplist:是一種壓縮鏈表,當 hash 類型中元素個數小于 hash-max-ziplist-entries 配置項 (默認為 512) 的值 或者 元素值總長度小于 hash-max-ziplist-value 配置項 (默認為 64) 的值時,Redis 使用 ziplist 編碼。(在 Redis 4.0 版本后,ziplist 已被 listpack 替代)
- hashtable:當 hash 類型中元素個數大于等于 hash-max-ziplist-entries 配置項的值 或者 元素值總長度大于等于 hash-max-ziplist-value 配置項的值時,Redis 使用 hashtable 編碼。
list類型基本介紹
list 類型相當于 數組 或者 鏈表。但其內部的編碼方式并不是一個數組,其更接近于 “雙端隊列” (Deque)。
列表中元素是有序的,該有序并不是 “升序” 或者 “降序”,而是元素在列表中的位置的先后順序。
列表中的元素是可以重復的。
獲取和刪除的區別,獲取相當于 peek
,刪除相當于 pop
。
list類型常用命令
LPUSH
LPUSH key element [element...]
- 該命令可以一次插入多個元素。
- 這里的
L
表示的是left
,即從左邊插入,也就是頭插。 - 返回值是插入元素后列表的長度。
LRANGE
LRANGE key start stop
- 該命令可以獲取列表中指定范圍的元素。
start
和stop
是索引,都可以是負數,表示從列表的末尾開始計數(-1 表示最后一個元素,-2 表示倒數第二個元素,以此類推)。兩個區間都是閉區間。start
和stop
都可以超過實際列表的索引范圍,也不會報錯。
LPUSHX
LPUSHX key element [element...]
- 該命令和
LPUSH
類似,但只在列表存在時才插入元素。 - 如果列表不存在,則返回 0,表示插入失敗。
RPUSH
RPUSH key element [element...]
- 與
LPUSH
類似,但從右邊插入,也就是尾插。
RPUSHX
RPUSHX key element [element...]
- 與
LPUSHX
類似。
LPOP
LPOP key [count]
- 該命令可以從列表左邊彈出一個元素,也就是頭刪。
- 如果不填
count
,則默認彈出一個元素。如果填count
,則彈出count
個元素。
RPOP
RPOP key [count]
- 與
LPOP
類似,但從右邊彈出,也就是尾刪。
LINDEX
LINDEX key index
- 該命令可以獲取列表中指定索引的元素。
index
可以是負數,表示從列表的末尾開始計數。- 如果索引越界,則返回
nil
。 - 時間復雜度為 O(N),N 為列表的長度。
LINSERT
LINSERT key <BEFORE|AFTER> pivot element
- 該命令可以在列表中插入元素。
element
為需要插入的元素。pivot
為需要插入到哪個元素的前面或后面。如果為BEFORE
,則插入到pivot
元素的前面;如果為AFTER
,則插入到pivot
元素的后面。- 如果
pivot
元素不存在,則返回-1
,表示插入失敗。 - 如果
pivot
存在多個,則從左往右遍歷匹配第一個pivot
在其前面或后面插入。 - 返回值為插入后的列表長度。
- 時間復雜度為 O(N),N 為列表的長度。
LLEN
LLEN key
- 該命令可以獲取列表的長度。
LREM
LREM key count element
- 該命令可以刪除列表中指定元素。
count
為刪除的元素個數。- 如果
count
等于0
,則刪除所有element
。 - 如果
count
小于0
,則從右往左開始遍歷依此刪除count
個element
。 - 如果
count
大于0
,則從左往右開始遍歷依此刪除count
個element
。
LTRIM
LTRIM key start stop
- 保留
start
和stop
之間的元素,刪除區間之外的元素。
LSET
LSET key index element
- 該命令可以設置列表中指定索引的元素。
index
可以是負數,表示從列表的末尾開始計數。- 如果索引越界,則報錯:
ERR index out of range
。
BLPOP
BLPOP key [key...] timeout
- 該命令為 阻塞 版本的
LPOP
。如果執行BLPOP
命令時,列表為空,則會阻塞timeout
秒,直到列表中有元素被加入。 BLPOP
可以同時監聽多個key
,當其中一個key
加入元素后而不為空時,則返回該key
和被彈出的元素。- 如果多個客戶端同時執行
BLPOP
,則最先執行BLPOP
的客戶端會得到彈出的元素。
BRPOP
BRPOP key [key...] timeout
- 該命令為 阻塞 版本的
RPOP
。其特性與BLPOP
類似。
list編碼方式
- 在早期的 Redis 版本中,list 類型有兩種編碼方式:
ziplist
和linkedlist
。 - 在 3.2 版本后,Redis 開始使用
quicklist
作為默認的 list 編碼方式。 quicklist
使用linkedlist
組織(雙向鏈表),但每一個元素都是一個ziplist
,這樣可以降低內存占用。
list的應用場景
- 列表可以當作 “數組” 使用,用于存儲多個元素。
- 列表可以搭配
LPOP
和LPUSH
或者RPOP
和RPUSH
當作 “棧” 使用,用于存儲多個元素,先進后出。 - 列表可以搭配
LPUSH
和RPOP
或者RPUSH
和LPOP
當作 “隊列” 使用,用于存儲多個元素,先進先出。 - 列表還可以通過使用
BLPOP
和BRPOP
擔當 “生產者消費模型” 中的消息隊列。