KEYS
返回所有滿足樣式(pattern)的key。
-
KEY *
返回所有key,不簡易使用
性能問題:當 Redis 存儲百萬級鍵時,會消耗大量 CPU 和內存資源,Redis 是單線程模型,KEYS * 執行期間會阻塞其他所有命令(包括讀寫操作),導致服務短暫不可用。
生產環境風險:
阻塞導致請求堆積
客戶端超時重試
最終導致 Redis 崩潰
返回大量鍵名時可能撐爆客戶端內存 -
yid?i
其中 ?匹配任意一個字符,比如yidai
、yidei
、yidii
-
yid*i
其中 * 匹配任意一串字符,比如yidai
、yideeeeei
、yidi
-
yi[ae]ai
其中 [ae] 代表匹配 a 或者 e 任意一個字符,比如yidai
、yidei
-
yi[^e]ai
其中 [^e] 代表匹配除了 e 的任意一個字符,比如yidai
但不匹配yidei
-
yi[a-e]ai
其中 [a-e] 代表匹配 a 到 e 任意一個字符,比如yidai
、yidei
、yidbi
用法:KEYS pattern
命令有效版本:1.0.0 以后
時間復雜度為O(N)
返回值為匹配 pattern 的所有 key
EXIST
判斷某個key是否存在
語法:EXISTS key [key ...]
可以一次查找一個或者多個key
127.0.0.1:6379> EXISTS yidai
(integer) 1
127.0.0.1:6379> EXISTS yidai yidi hello
(integer) 3
時間復雜度為O(1)
返回值為 key 存在的個數
DEL
刪除指定的 key
可以一次刪除一個或者多個key
語法:DEL key [key ...]
127.0.0.1:6379> DEL yidai yidi
(integer) 2
返回值:刪除key的個數
時間復雜度:O(1)
EXPIRE
為指定的 key 添加秒級的過期時間(Time To Live TTL)
語法:EXPIRE key seconds
時間復雜度:O(1)
返回值:成功時返回1,失敗返回0
127.0.0.1:6379> EXPIRE hello 10
(integer) 1
TTL
獲取指定 key 的過期時間,秒級。
語法:TTL key
時間復雜度:O(1)
返回值:剩余過期時間。-1 表示沒有關聯過期時間,-2 表示 key 不存在。
127.0.0.1:6379> TTL yidei
(integer) -1
TYPE
Redis TYPE
命令返回值詳解
返回值 | 對應的數據結構 | 示例或說明 |
---|---|---|
string | 字符串類型 | SET name "Alice" → TYPE name 返回 string |
list | 列表類型 | LPUSH fruits "apple" → TYPE fruits 返回 list |
hash | 哈希類型 | HSET user:1 name "Bob" → TYPE user:1 返回 hash |
set | 集合類型 | SADD tags "red" → TYPE tags 返回 set |
zset | 有序集合類型 | ZADD leaderboard 100 "player1" → TYPE leaderboard 返回 zset |
stream | 流類型(Redis 5.0+) | XADD mystream * field1 "value1" → TYPE mystream 返回 stream |
none | key 不存在 | TYPE non_existent_key 返回 none |
語法??:TYPE key_name
??時間復雜度??:O(1)
??特殊場景??:
- 已過期的 key 仍會返回原類型,直到 redis 清除
- 空數據結構(如空列表)仍返回對應類型
- 模塊擴展類型可能返回自定義類型名
127.0.0.1:6379> SET greeting "Hello"
OK
127.0.0.1:6379> TYPE greeting
string
127.0.0.1:6379> TYPE missing_key
none
redis 的5種數據類型內部編碼
Redis 數據結構內部編碼對照表
數據結構 | 內部編碼 | 說明 |
---|---|---|
string | raw | 普通字符串編碼(長度大于44字節時使用) |
int | 整數值編碼(當字符串可表示為64位整數時) | |
embstr | 嵌入式字符串編碼(長度≤44字節時使用,內存連續分配) | |
hash | hashtable | 標準哈希表實現(元素較多時使用) |
ziplist | 壓縮列表實現(元素較少且值較小時默認使用) | |
list | linkedlist | 雙向鏈表實現(Redis 3.2前使用) |
ziplist | 壓縮列表實現(Redis 3.2前默認) | |
quicklist | 快速列表實現(Redis 3.2+默認,由ziplist組成的雙向鏈表) | |
set | hashtable | 標準哈希表實現 |
intset | 整數集合實現(當元素均為整數且數量較少時使用) | |
zset | skiplist | 跳表+哈希表組合實現(元素較多時使用) |
ziplist | 壓縮列表實現(元素較少且值較小時默認使用) |
關鍵說明:
- 編碼轉換閾值(可通過配置文件調整):
# redis.conf 示例配置 hash-max-ziplist-entries 512 # hash元素超過512時轉hashtable hash-max-ziplist-value 64 # hash字段值超過64字節時轉hashtable
object encoding
可以查看數據結構內部編碼
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"
Redis 這樣設計有兩個好處:
內存效率??:針對不同數據特征選擇最優編碼
??性能優化??:平衡讀寫速度與存儲開銷
??彈性擴展??:自動適應數據規模變化
String字符串
字符串類型是 Redis 最基礎的數據類型,關于字符串需要特別注意:
1)?先 Redis 中所有的鍵的類型都是字符串類型,?且其他?種數據結構也都是在字符串類似基礎上構建的,例如列表和集合的元素類型是字符串類型
2)字符串類型的值實際可以是字符串,包含?般格式的字符串或者類似 JSON、XML 格式的字符串;數字,可以是整型或者浮點型;甚?是?進制流數據,例如圖片、?頻、視頻等。不過?個字符串的最大值不能超過 512 MB。
注意:由于 Redis 內部存儲字符串完全是按照?進制流的形式保存的,所以 Redis 是不處理字符集編碼問題的,客?端傳?的命令中使?的是什么字符集編碼,就存儲什么字符集編碼。
SET
將 string 類型的 value 設置到 key 中。如果 key 之前存在,則覆蓋,?論原來的數據類型是什么。之前關于此 key 的 TTL 也全部失效。
語法:SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
時間復雜度:O(1)
選項:
SET 命令?持多種選項來影響它的?為:
- EX seconds?使?秒作為單位設置 key 的過期時間。
- PX milliseconds?使?毫秒作為單位設置 key 的過期時間。
- NX ?只在 key 不存在時才進行設置,即如果 key 之前已經存在,設置不執行。
- XX ?只在 key 存在時才進行設置,即如果 key 之前不存在,設置不執行。
返回值: - 如果設置成功,返回 OK。
- 如果由于 SET 指定了 NX 或者 XX 但條件不滿足,SET 不會執行,并返回 (nil)。
127.0.0.1:6379> SET hello 1 EX 10
OK
127.0.0.1:6379> ttl hello
(integer) 8
127.0.0.1:6379> set hello 2 px 1000
OK
127.0.0.1:6379> pttl hello
(integer) -2
127.0.0.1:6379> set hello 2 px 1000
OK
127.0.0.1:6379> pttl hello
(integer) 490
127.0.0.1:6379> set hello 111 NX
OK
127.0.0.1:6379> set hello 111 NX
(nil)
127.0.0.1:6379> set yidai 123 EX 10 XX
(nil)
127.0.0.1:6379> set yidai 123 EX 10 NX
OK
127.0.0.1:6379> set yidai 123 EX 10 XX
OK
SETNX
設置 key-value 但只允許在 key 之前不存在的情況下
語法:SETNX key value
時間復雜度:O(1)
返回值:1 表示設置成功。0 表示沒有設置。
127.0.0.1:6379> SETNX YIDAI 123
(integer) 1
127.0.0.1:6379> SETNX YIDAI 123
(integer) 0
GET
獲取 key 對應的 value。
語法:GET key
時間復雜度:O(1)
返回值:key 對應的 value,或者 nil 當 key 不存在。如果 value 的數據類型不是 string,會報錯。
127.0.0.1:6379> lpush yidai 1 2 3
(integer) 3
127.0.0.1:6379> TYPE yidai
list
127.0.0.1:6379> GET yidai
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> get key
"1"
MGET
?次性獲取多個 key 的值。如果對應的 key 不存在或者對應的數據類型不是 string,返回 nil
語法:MGET key [key ...]
時間復雜度:O(K),K是key的個數
返回值:對應value的列表
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set yidai 2
OK
127.0.0.1:6379> mget hello yidai
1) "1"
2) "2"
MSET
?次性設置多個 key 的值。
語法:MSET key value [key value ...]
時間復雜度:O(K),K是key的個數
返回值:OK
127.0.0.1:6379> MSET key1 1 key2 2
OK
多次GET 和 MGET的區別
其中 MGET 有效減少了網絡通信的時間,一次查找完了多個key值,而 get
需要多次查詢,增加了網絡通信時間消耗,降低了效率
注意:用MGET也需要注意查詢建的個數,不能過于龐大,否則可能導致命令執行時間過長,導致Redis阻塞
計數命令
INCR
將 key 對應的 string 表?的數字加?。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:INCR key
時間復雜度:O(1)
返回值:integer 類型的加完后的數值
127.0.0.1:6379> EXISTS LL
(integer) 0
127.0.0.1:6379> INCR LL
(integer) 1
127.0.0.1:6379> INCR LL
(integer) 2
127.0.0.1:6379> SET KK 10
OK
127.0.0.1:6379> INCR KK
(integer) 11
127.0.0.1:6379> SET NUM 239204940933333333333333333335333333333333
OK
127.0.0.1:6379> INCR NUM
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET str dsdaf
OK
127.0.0.1:6379> INCR str
(error) ERR value is not an integer or out of range
INCRBY
將 key 對應的 string 表示的數字加上對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:INCRBY key decrement
時間復雜度:O(1)
返回值:integer 類型的加完后的數值
127.0.0.1:6379> EXISTS ky
(integer) 0
127.0.0.1:6379> INCRBY ky 2
(integer) 2
127.0.0.1:6379> INCRBY by -1
(integer) -1
DECR
將 key 對應的 string 表?的數字減?。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯
語法:DECR key
時間復雜度:O(1)
返回值:integer 類型的減完后的數值
127.0.0.1:6379> EXISTS ui
(integer) 0
127.0.0.1:6379> DECR ui
(integer) -1
DECRBY
將 key 對應的 string 表示的數字減上對應的值。如果 key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的 string 不是?個整型或者范圍超過了 64 位有符號整型,則報錯。
語法:DECRBY key decrement
時間復雜度:O(1)
返回值:integer 類型的加完后的數值
127.0.0.1:6379> EXISTS we
(integer) 0
127.0.0.1:6379> DECRBY we -2
(integer) 2
INCRBYFLOAT
將 key 對應的 string 表?的浮點數加上對應的值。如果對應的值是負數,則視為減去對應的值。如果key 不存在,則視為 key 對應的 value 是 0。如果 key 對應的不是 string,或者不是?個浮點數,則報錯。允許采?科學計數法表示浮點數。
語法:INCRBYFLOAT key increment
時間復雜度:O(1)
返回值:加/減完后的數值
127.0.0.1:6379> EXISTS float
(integer) 0
127.0.0.1:6379> INCRBY float -1
(integer) -1
127.0.0.1:6379> INCRBYFLOAT float -1
"-2"
127.0.0.1:6379> INCRBYFLOAT float -0.5
"-2.5"
127.0.0.1:6379> INCRBYFLOAT float 10.5
"8"
127.0.0.1:6379> INCRBYFLOAT float 1e5
"100008"
APPEND
如果 key 已經存在并且是?個 string,命令會將 value 追加到原有 string 的后邊。如果 key 不存在,則效果等同于 SET 命令。
語法:APPEND KEY VALUE
時間復雜度:O(1)
返回值:追加完成之后 string 的?度。
127.0.0.1:6379> EXISTS ss
(integer) 0
127.0.0.1:6379> APPEND ss 1
(integer) 1
127.0.0.1:6379> GET ss
"1"
127.0.0.1:6379> APPEND ss sdad
(integer) 5
127.0.0.1:6379> GET ss
"1sdad"
GETRANGE
返回 key 對應的 string 的子串,由 start 和 end 確定(左閉右閉)。可以使用負數表示倒數。-1 代表倒數第?個字符,-2 代表倒數第?個,其他的與此類似。超過范圍的偏移量會根據 string 的長度調整成正確的值
語法:GETRANGE key start end
時間復雜度:O(N)
返回值:string類型的子串
127.0.0.1:6379> SET yidai "i am yidai"
OK
127.0.0.1:6379> GETRANGE yidayi 0 4
""
127.0.0.1:6379> GETRANGE yidai 0 4
"i am "
127.0.0.1:6379> GETRANGE yidai 0 7
"i am yid"
127.0.0.1:6379> GETRANGE yidai 0 9
"i am yidai"
SETRANGE
覆蓋字符串的?部分,從指定的偏移開始
語法:SETRANGE key offset value
時間復雜度:O(N)
返回值:替換后 string類型的長度
127.0.0.1:6379> SET key "hello world"
OK
127.0.0.1:6379> SETRANGE key 6 redis
(integer) 11
127.0.0.1:6379> GET key
"hello redis"
STRLEN
獲取 key 對應的 string 的?度。當 key 存放的類似不是 string 時,報錯。
語法:STRLEN key
時間復雜度:O(1)
返回值:string 的長度。或者當 key 不存在時,返回 0。
127.0.0.1:6379> SET yidai yidai
OK
127.0.0.1:6379> STRLEN yidia
(integer) 0
127.0.0.1:6379> STRLEN yidai
(integer) 5