1. Redis數據結構
Redis可以存儲鍵與5種不同數據結構類型之間的映射,分別為string(字符串)、list(列表)、set(集合)、hash(散列)和zset(有序集合)。日常使用的基本上就是如上的五種常見數據結構。此外,Redis還支持bitmaps(位圖), hyperloglogs(超級日志), geospatial indexes with radius queries and streams(具有半徑查詢和流的地理空間索引)。
下面引用《Redis實戰》的表格,介紹五種常見的數據結構
結構類型 結構存儲的值 結構的讀寫能力 STRING 可以是字符串、整數或浮點數 對整個字符串或者字符串的其中一部分執行操作;對整數和浮點數執行自增(increment)或者自減(decrement) LIST 一個鏈表,鏈表上的每個節點都包含一個字符串 從鏈表的兩端推入或者彈出元素;根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值查找或者移除元素。 SET 包含字符串的無序收集器(unordered collection),并且被包含的每個字符串都是獨一無二、各不相同的 添加、獲取、移除單個元素;檢查一個元素是否存在于集合中;計算交集、并集、差集;從集合里面隨機獲取元素。 HASH 包含鍵值對的無序散列表 添加、獲取、移除單個鍵值對;獲取所有鍵值對。 ZSET(有序集合) 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 添加、獲取、刪除單個元素;根據分值范圍(range)或者成員來或許元素。
-
string:字符串類型是非常常見的一種類型,Redis中的字符串類型和很多編程語言里的字符串類型差不多,但相對要靈活些。字符串可以存儲以下三種類型:
- 字符串(字節組成的序列)
- 整數
- 浮點數
當字符串中的值可以被解釋成十進制數或者浮點數的時候,Redis就會發現這一點,并允許用戶對這個字符串進行各種增(incr*)、減(decr*)操作。如果對一個不存在的鍵或者保存了空串的鍵進行增減操作,則Redis會將其值當做0來處理。如果值無法被解釋為整數或浮點數,Redis將向用戶返回一個錯誤。
list:列表可以看作是個雙端隊列,可以在列表兩端推入和彈出元素。對列表的不同操作可以實現其他編程語言中的堆棧(同一端進出)和隊列(一端進,另一端出)數據結構。
set:集合最顯著的特點應該就是其中的元素互不相同。用戶可以快速對集合進行插入,刪除,檢查某元素是否在集合中的操作。此外,多個集合間也能很方便的執行交、并、差集運算。
zset:有序集合存儲著成員與分值(權值,在Redis中以IEEE 754雙精度浮點數的格式存儲)之間的映射,并且提供了分值處理命令。適用于按照權值獲取元素的情況。如熱門帖子獲取、基于投票數排序文章等。
hash:Redis中的散列可以讓用戶將多個鍵值對存儲到一個Redis鍵中,可以把這種數據聚集看作是關系數據庫中的行,或者文檔數據庫中的文檔。
2. Redis常用命令
2.1 key的有關命令
命令 | 操作 |
---|---|
exists key | 測試指定key是否存在 |
del key1 [key2 ...] | 刪除給定key |
type key | 返回給定key的類型 |
keys pattern | 以正則表達式的形式,返回匹配的所有key |
rename oldkey newkey | 修改key的名字 |
dbsize | 查看數據庫中key的數量(并不是所謂的大小) |
expire key seconds | 為key指定過期時間,到期自動刪除 |
ttl key | 查看key的剩余時間 |
select index | 選擇數據庫(默認16個數據庫,index為0-15) |
move key index | 將key移動到指定數據庫 |
flushdb | 清空當前數據庫key |
flushall | 清空所有數據庫key |
2.2 string的有關命令
命令 | 操作 |
---|---|
set key value | 設置key對應的值為string類型的value |
mset key1 value1 [key2 value2...] | 一次設置多個key |
get key | 獲取指定key的value值 |
mget key1 [key2 ...] | 一次獲取多個key的value值 |
incr key | 對key的值做自增操作,返回新的值 |
decr key | 對key的值做自減操作,返回新的值 |
incrby key integer | 對key的value加指定integer |
decrby key integer | 對key的value減指定integer |
append key value | 給指定key的字符串追加value |
substr key start end | 截取key,從start(包含)到end(包含)。注意只是返回截取的value,源value并沒改變 |
2.3 list的有關命令
命令 | 操作 |
---|---|
lpush key value1 [value2...] | 在key對應的list的頭部(左端)添加元素 |
rpush key value1 [value2...] | 在key對應的list的尾部(右端)添加元素 |
lpop key | 移除并返回key對應的list的頭部(左端)元素 |
rpop key | 移除并返回key對應的list的尾部(右端)元素 |
lindex key offset | 返回列表中偏移量為offset的元素 |
lrange key start end | 返回列表中從start偏移量到end偏移量中的元素,包含兩個端點元素(只返回,原list不變) |
ltrim key start end | 對列表進行修剪,只保留從start偏移量到end偏移量的元素,包含兩個端點 |
llen key | 返回對應列表的長度 |
此外,list還包含一些阻塞式的命令以及在列表之間移動元素的命令:
命令 | 操作 |
---|---|
blpop key1 [key2...] timeout | 從第一個非空列表中彈出位于頭部(左端)的元素,或者在timeout秒內阻塞并等待可彈出元素的出現 |
brpop key1 [key2...] timeout | 從第一個非空列表中彈出位于尾部(右端)的元素,或者在timeout秒內阻塞并等待可彈出元素的出現 |
rpoplpush source-key dest-key | 從source-key列表中彈出位于最右端的元素,然后把這個元素插入dest-key列表的最左端,并向用戶返回該元素 |
brpoplpush source-key dest-key timeout | 從source-key列表中彈出位于最右端的元素,然后把這個元素插入dest-key列表的最左端,并向用戶返回該元素。如果source-key為空,則在timeout秒內阻塞并等待可彈出元素的出現 |
2.4 set的有關命令
命令 | 操作 |
---|---|
sadd key value1 [value2...] | 將一個或多個元素添加到集合中,并返回添加成功的元素的個數 |
srem key value1 [value2...] | 從集合中移除一個或多個元素,返回移除成功的元素的個數 |
sismember key value | 檢查元素value是否在集合key中,存在返回1,不存在返回0 |
scard key | 返回集合包含的元素個數 |
smembers key | 返回集合包含的全部元素 |
srandmember key [count] | 隨機返回集合中的一個或多個元素。當count為正數時,返回的元素不會重復;當count為負數時,返回的元素有可能會重復 |
spop key | 隨機移除集合中的某個元素,被返回給用戶 |
smove source-key des-key value | 如果集合source-key中包含元素value,則移除它,并添加到dest-key中;成功移除并添加則返回1,否則返回0 |
處理多個集合的常用命令:
命令 | 操作 |
---|---|
sdiff key1 [key2...] | 返回所有集合的差集 |
sdiffstore dest-key key1 [key2...] | 將計算所得的差集中的元素添加到dest-key中 |
sinter key1 [key2...] | 返回所有集合的交集 |
sinterstore dest-key key1 [key2...] | 將計算所得的交集中的元素添加到dest-key中 |
sunion key1 [key2...] | 返回所有集合的并集 |
sunionstore dest-key key1 [key2...] | 將計算所得的并集中的元素添加到dest-key中 |
2.5 zset的有關命令
命令 | 操作 |
---|---|
zadd key score1 member1 [score2 member2 ... ] | 將帶有給定分值的成員你添加到有序集合中。注意分值在前,成員在后 |
zrem key member1 [member2 ... ] | 從有序集合中刪除指定成員,并返回成功刪除的元素個數 |
zcard key | 返回有序集合包含的成員個數 |
zincrby key increment member | 給指定成員的分值加上increment |
zcount key min max | 返回分值介于min和max之間的成員數量 |
zrank key memeber | 返回指定成員在有序集合中的排名,成員按照score從小到大排序 |
zrevrank key memeber | 返回指定成員在有序集合中的排名 ,成員按照score從大到小排序 |
zscore key member | 返回指定成員的分值 |
zrange key start stop [WITHSCORES] | 返回有序集合中排名介于start和stop之間的成員,如果給定了可選的 WITHSCORES選項,則連帶成員分值一并返回 |
zrevrange key start stop [WITHSCORES] | 同上,結果按score逆序 |
zrangebyscore key min max [WITHSCORES] | 返回分值介于min和max之間的成員 |
zremrangebyrank key start stop | 刪除集合中排名在start和stop之間的成員 |
zremrangebyscore key min max | 刪除集合中分值在min和max之間的成員 |
2.6 hash的有關命令
命令 | 操作 |
---|---|
hset key field value | 向散列key中添加一個鍵值對 |
hget key field | 獲取散列key中的一個鍵的值 |
hmset key field1 value1 [field2 value2 ...] | 向散列key中添加一個或多個鍵值對 |
hmget key field1 [field2 ... ] | 獲取散列key中的一個或多個鍵的值 |
hdel key field1 [field2 ... ] | 刪除散列中的一個或多個鍵值對,返回成功刪除的鍵值對數量 |
hlen key | 返回散列包含的鍵值對數量 |
hincrby key field integer | 給散列中指定field的值加上integer |
hexists key field | 測試指定field是否在散列中存在 |
hkeys key | 返回散列中所有field |
hvals key | 返回散列中所有value |
hgetall key | 返回散列中所有鍵值對 |
2.7 其他命令
Redis還有許多其他的命令,如發布訂閱相關的命令,排序命令,更完整的命令介紹可以查看Redis官網文檔或中文版地址。
此外,Redis客戶端還提供了 command
命令,可以用來查看命令數組。如:
特別推薦:Redis客戶端還提供了 help
命令,可以查看數據結構的描述( help set
),查看某個命令的具體用法( help zadd
),以及通過 help @group
語法來查看某個命令組( help @set
查看set所有命令)。如:
此外,Redis客戶端還提供了命令智能提示,可以提示用戶該命令的具體格式,如,當鍵入 zadd
時,客戶端的智能提示如下:
單純的記憶命令是沒有意義的,應該著重去學習Redis數據結構的概念和含義,具體應用的時候配合使用 help
命令以及官方文檔即可。而且Redis的命令基本都是自解釋的,基本從字面上就能夠了解到該命令的作用。習慣了之后甚至可以自己去猜測需要的命令。
======返回目錄======