豐富的數據類型是Redis作爲緩存系統的最大優勢之一,區別於Memcache僅支持簡單的key-value類型,Redis提供了list、set、zset、hash等數據結構的存儲。
注意:Redis的命令不區分大小寫,但是key 嚴格區分大小寫!!!
1. 熱身
1.1 獲取符合規則的鍵名列表
keys pattern
pattern
是一個支持glob風格的通配符格式,具體規則如下:
符號 | 含義 |
---|---|
? | 匹配一個字符 |
* | 匹配任意個字符,包括0個 |
[] | 匹配括號間的任一字符,可是使用“-”符號表示一個範圍,比如a[b-d]可以匹配“ab”、“ac”、“ad”。 |
\x | 匹配字符x,用於轉義符號。如果要匹配“?”,就需要使用? |
- 案例
我們先往Redis中塞幾個鍵值對:
set color red
set name zhangsan
set age 18
然後使用keys *
命令查看獲取Redis中所有的鍵。
注意:keys命令需要遍歷Redis中的所有鍵,當鍵的數量較多時會影響性能,不建議在生產環境中使用。
1.2 判斷一個鍵是否存在
exists key [key ...]
如果鍵存在則返回1,否則返回0。比如:
1.3 刪除某個鍵
del key [key ...]
刪除一個或多個鍵,返回值是刪除的鍵的個數。比如:
1.4 獲取鍵值的數據類型
type key
type
命令用來獲得鍵值的數據類型,返回值可能是string(字符串類型)、hash(散列類型)、list(列表類型)、set(集合類型)、zset( 有序集合類型)。比如:
2. string數據類型
字符串類型是Redis中最基本的數據類型,它能存儲任何形式的字符串,包括二進制數據。比如郵箱、JSON化的對象甚至是一張圖片。一個字符串類型鍵允許存儲的數據的最大容量是512MB。
string類型在Redis中的相關命令:
命令 | 用法 | 描述 |
---|---|---|
set | set key value | (1)將字符串value值設置到key上; (2)如果key有對應的值,則會被覆蓋; (3)如果原本key有過期時間,則過期時間會被清除。 |
get | get key | (1)返回key對應的字符串值; (2)如果key無對應值,則返回nil; (3)如果key對應的值不是字符串,則返回錯誤,因爲get只適用於字符串類型。 |
mset | mset key value [key value …] | (1)同時設置一個或多個key-value鍵值對; (2)如果key有對應的值,則會被覆蓋; (3)mset是一個原子操作,所有的key都會在同一時間被設置,不會存在有些更新有些沒更新的情況。 |
mget | mget key [key …] | (1)返回一個或多個給定key對應的值; (2)某個key不存在時返回nil。 |
setex | setex key seconds value | (1)將字符串value值設置到key上; (2)設置key生存時間爲seconds,單位爲秒; (3)如果key有對應的值,則會被覆蓋。 |
setnx | setnx key value | (1)將key的值設置爲value,當且僅當key不存在; (2)若給定的key已經存在,setnx將不做任何操作。 |
上面是string類型的基本命令,但是當一個字符串可以轉換成數值時,我們可能還會接觸到以下幾個自增自減操作。
命令 | 用法 | 描述 |
---|---|---|
incr | incr key | (1)對key的值加1,返回增加之後的值; (2)如果key不存在,則key會被初始化爲0,再執行incr操作。 |
decr | decr key | (1)對key的值減1。 |
incrby | incrby key increment | (1)將key所存儲的值加上指定的數值,並返回增加之後的值。 |
decrby | decrby key decrement | (1)將key的值減去一個指定的數值。 |
3. hash數據類型
我們知道Redis是採用字典結構以鍵值對的形式存儲數據的,而hash類型的鍵值也是一種字典結構,其存儲了字段(field)和字段值的映射,但字段值只能是字符串,不支持其它數據類型。
hash類型適合存儲對象:使用對象類型和對象唯一標識作爲key,使用對象屬性作爲字段名,屬性值作爲字段值。
命令 | 用法 | 描述 |
---|---|---|
hset | hset key field value | (1)設置key的field值爲value; (2)如果key不存在,則直接創建; (3)如果field值已經存在,則直接覆蓋。 |
hget | hget key field | (1)獲取指定key和field的值。 |
hdel | hdel key field [field …] | (1)刪除key下的field值; (2)如果field不存在,則直接忽略。 |
hexists | hexists key filed | (1)查看是否存在指定key的field,存在返回1,不存在返回0。 |
hgetall | hgetall key | (1)返回指定key的所有字段名和字段值。 |
hincrby | hincrby key field increment | (1)對指定key的field字段增加一個數值。 |
hkeys | hkeys key | (1)返回指定key的所有字段名。 |
hlen | hlen key | (1)返回指定key的所有字段名數量。 |
hmget | hmget key field [field …] | (1)返回指定key對應字段名的值。 |
hmset | hmset key field value [field value …] | (1)批量設置key的字段名和字段值。 |
hvals | hvals key | (1)返回指定key的所有字段值,可對比hkeys 命令。 |
4. list數據類型
列表類型(list)可以存儲一個有序的字符串列表,常用的操作是向列表兩端添加元素,或者獲得列表的某一個片段。
列表類型內部使用雙向鏈表實現的,所以向列表兩端添加元素的時間複雜度爲O(1),獲取越接近兩端的元素速度越快。但是使用鏈表的代價是通過索引訪問元素比較慢。
命令 | 用法 | 描述 |
---|---|---|
lpush | lpush key value [value …] | (1)將一個或多個值插入到列表key的表頭; (2)如果有多個value值,則從左到右的順序依次插入表頭; (3)如果key不存在,則會創建一個空列表,然後執行lpush操作;如果key存在,但不是列表類型,則返回錯誤。 |
lpushx | lpushx key value | (1)將value值插入到列表key的表頭,當且僅當key存在且是一個列表; (2)如果key不存在時,lpushx命令什麼都不會做。 |
lpop | lpop key | (1)移除並返回列表key的頭元素。 |
lrange | lrange key start stop | (1)返回列表key中指定區間內的元素; (2)start大於列表最大下標時,返回空列表; (3)可使用負數下標,-1表示列表最後一個元素,以此類推。 |
lrem | lrem key count value | (1)count>0表示從頭到尾搜索,移除與value相等的元素,數量爲count; (2)count<0表示從尾到頭搜索,移除與value相等的元素,數量爲count; (3)count=0表示移除列表中所有與value相等的元素。 |
lset | lset key index value | (1)將列表key下標爲index的元素值設置爲value; (2)當index參數超出範圍,或對一個空列表進行lset操作時,返回錯誤。 |
lindex | lindex key index | (1)返回列表key中下標爲index的元素。 |
linsert | linsert key BEFORE|AFTER pivot value | (1)將值value插入列表key中,位於pivot前面或者後面; (2)當pivot不存在列表key中,或者key不存在時,不執行任何操作。 |
llen | len key | (1)返回列表key的長度,當key不存在時,返回0。 |
rpop | rpop key | (1)移除並返回列表key的尾元素。 |
rpoplpush | rpoplpush source destination | (1)將列表source中最後一個元素彈出並返回給客戶端,並且將該元素插入到列表destincation的頭部。 |
rpush | rpush key value [value …] | (1)將一個或多個值插入到列表key的尾部。 |
rpushx | rpushx key value | (1)將value值插入到列表key的表尾,當且僅當key存在且是一個列表; (2)如果key不存在時,lpushx命令什麼都不會做。 |
5. set數據類型
Redis中的set類型是string類型的無序集合。集合類型的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合類型在Redis內部是使用值爲空的散列表實現的,所以這些操作的時間複雜度都是O(1)。最方便的是多個集合類型鍵之間還可以進行並集、交集和差集運算。
命令 | 用法 | 描述 |
---|---|---|
sadd | sadd key member [member …] | (1)將一個或多個member元素加入key中,已存在在集合中的member將被忽略; (2)如果key不存在,則創建一個只包含member元素的集合; (3)當key不是集合類型時,將返回一個錯誤。 |
scard | scard key | (1)返回key對應的集合中的元素數量。 |
sdiff | sdiff key [key …] | (1)返回所有key對應的集合的差集。 |
sdiffstore | sdiffstore destionation key [key …] | (1)返回所有key對應的集合的差集,並把該差集賦值給destionation; (2)如果destionation已經存在,則直接覆蓋。 |
sinter | sinter key [key …] | (1)返回所有key對應的集合的交集; (2)不存在的key被視爲空集。 |
sinterstore | sinter destionation key [key …] | (1)返回所有key對應的集合的交集,並把該交集賦值給destionation; (2)如果destionation已經存在,則直接覆蓋。 |
sismember | sismember key member | (1)判斷member元素是否是key的成員,0表示不是,1表示是。 |
smembers | smember key | (1)返回集合key中的所有成員; (2)不存在的key被視爲空集。 |
srem | srem key member [member …] | (1)移除集合key中的一個或多個member元素,不存在的member將被忽略。 |
sunion | sunion key [key …] | (1)返回所有key對應的集合的並集; (2)不存在的key被視爲空集。 |
sunionstore | sunionstore destionation key [key …] | (1)返回所有key對應的集合的並集,並把該並集賦值給destionation; (2)如果destionation已經存在,則直接覆蓋。 |
6. zset數據類型
zset類型也是string類型元素的集合,但是它是有序的。
命令 | 用法 | 描述 |
---|---|---|
zadd | zadd key score member [score member …] | (1)將一個或多個member元素及其score值加入集合key中; (2)如果member已經是有序集合的元素,那麼更新member對應的score並重新插入member保證member在正確的位置上; (3)score可以是整數也可以是雙精度浮點數。 |
zcard | zcard key | (1)返回有序集的元素個數。 |
zcount | zcount key min max | (1)返回有序集key中,score值>=min且<=max的成員數量 |
zrange | zrange key start stop [withscores] | (1)返回有序集key中指定區間內的成員,成員位置按score從小到大排序; (2)如果score值相同,則按字典排序; (3)如果要使成員按score從大到小排序,則使用zrevrange命令。 |
zrank | zrank key number | (1)返回有序集key中成員member的排名,有序集合按score值從小到大排列; (2)zrevrank命令將按照score值從大到小排序。 |
zrem | zrem key member [member …] | (1)移除有序集key中的一個或多個元素,不存在的元素將被忽略; (2)當key存在但不是有序集時,返回錯誤。 |
zremrangebyrank | zremrangerank key start stop | (1)移除有序集key中指定排名區間內的所有元素。 |
zremrangebyscore | zremrangescore key min max | (1)移除有序集key中所有score值>=min且<=max之間的元素。 |