是一種鍵值對的數據結構,定義一個惟一的key值來獲取相應的value數據。java
> set name codehole OK > get name "codehole" > exists name (integer) 1 > del name (integer) 1 > get name (nil) 批量操做 > set name1 codehole OK > set name2 holycoder OK > mget name1 name2 name3 # 返回一個列表 1) "codehole" 2) "holycoder" 3) (nil) > mset name1 boy name2 girl name3 unknown > mget name1 name2 name3 1) "boy" 2) "girl" 3) "unknown"
能夠對 key 設置過時時間,到點自動刪除,這個功能經常使用來控制緩存的失效時間。python
> set name codehole > get name "codehole" > expire name 5 # 5s 後過時 ... # wait for 5s > get name (nil) > setex name 5 codehole # 5s 後過時,等價於 set+expire > get name "codehole" ... # wait for 5s > get name (nil) > setnx name codehole # 若是 name 不存在就執行 set 建立 (integer) 1 > get name "codehole" > setnx name holycoder (integer) 0 # 由於 name 已經存在,因此 set 建立不成功 > get name "codehole" # 沒有改變
若是 value 值是一個整數,還能夠對它進行自增操做golang
> set age 30 OK > incr age (integer) 31 > incrby age 5 (integer) 36 > incrby age -5 (integer) 31
至關於java裏面的LinkedLis,意味着list的插入和刪除很是快,可是索引定位很慢。redis
右邊進左邊出:隊列數組
> rpush books python java golang (integer) 3 > llen books (integer) 3 > lpop books "python" > lpop books "java" > lpop books "golang" > lpop books (nil)
右邊進右邊出:棧緩存
> rpush books python java golang (integer) 3 > rpop books "golang" > rpop books "java" > rpop books "python" > rpop books (nil)
lindex,lrange,ltrim
lindex至關於java鏈表的get(int index)方法,性能隨着參數index增大而變差
lrange是獲取範圍內的數據
ltrim是保留這個list範圍裏面的數據,範圍外的丟棄數據結構
> rpush books python java golang (integer) 3 > lindex books 1 # O(n) 慎用 "java" > lrange books 0 -1 # 獲取全部元素,O(n) 慎用 1) "python" 2) "java" 3) "golang" > ltrim books 1 -1 # O(n) 慎用 OK > lrange books 0 -1 1) "java" 2) "golang" > ltrim books 1 0 # 這實際上是清空了整個列表,由於區間範圍長度爲負 OK > llen books (integer) 0
hash(字典)
這個數據結構至關於java裏面的HashMap,它是無序的。內部實現是使用了數組+鏈表二維結構。若是發生hash碰撞的時候,就會將碰撞的元素使用鏈表串接起來。而且redis的字典的vlaue值只能是字符串。性能
redis的字典在rehash的時候採用了漸進式策略,在rehash同時,會保留兩個新舊hash結構,查詢時會同時查詢兩個hash結構,而後再後續的定時任務中以及hash操做指令中,按部就班地將舊 hash 的內容一點點遷移到新的 hash 結構中。當搬遷完成了,就會使用新的hash結構取而代之。命令行
> hset books java "think in java" # 命令行的字符串若是包含空格,要用引號括起來 (integer) 1 > hset books golang "concurrency in go" (integer) 1 > hset books python "python cookbook" (integer) 1 > hgetall books # entries(),key 和 value 間隔出現 1) "java" 2) "think in java" 3) "golang" 4) "concurrency in go" 5) "python" 6) "python cookbook" > hlen books (integer) 3 > hget books java "think in java" > hset books golang "learning go programming" # 由於是更新操做,因此返回 0 (integer) 0 > hget books golang "learning go programming" > hmset books java "effective java" python "learning python" golang "modern golang programming" # 批量 set OK
它內部的鍵值對是無序的惟一的。它的內部實現至關於一個特殊的字典,字典中全部的 value 都是一個值NULL。code
> sadd books python (integer) 1 > sadd books python # 重複 (integer) 0 > sadd books java golang (integer) 2 > smembers books # 注意順序,和插入的並不一致,由於 set 是無序的 1) "java" 2) "python" 3) "golang" > sismember books java # 查詢某個 value 是否存在,至關於 contains(o) (integer) 1 > sismember books rust (integer) 0 > scard books # 獲取長度至關於 count() (integer) 3 > spop books # 彈出一個 "java"
一方面它是一個 set,保證了內部 value 的惟一性,另外一方面它能夠給每一個 value 賦予一個 score,表明這個 value 的排序權重。它的內部實現用的是一種叫作「跳躍列表」的數據結構。
> zadd books 9.0 "think in java" (integer) 1 > zadd books 8.9 "java concurrency" (integer) 1 > zadd books 8.6 "java cookbook" (integer) 1 > zrange books 0 -1 # 按 score 排序列出,參數區間爲排名範圍 1) "java cookbook" 2) "java concurrency" 3) "think in java" > zrevrange books 0 -1 # 按 score 逆序列出,參數區間爲排名範圍 1) "think in java" 2) "java concurrency" 3) "java cookbook" > zcard books # 至關於 count() (integer) 3 > zscore books "java concurrency" # 獲取指定 value 的 score "8.9000000000000004" # 內部 score 使用 double 類型進行存儲,因此存在小數點精度問題 > zrank books "java concurrency" # 排名 (integer) 1 > zrangebyscore books 0 8.91 # 根據分值區間遍歷 zset 1) "java cookbook" 2) "java concurrency" > zrangebyscore books -inf 8.91 withscores # 根據分值區間 (-∞, 8.91] 遍歷 zset,同時返回分值。inf 表明 infinite,無窮大的意思。 1) "java cookbook" 2) "8.5999999999999996" 3) "java concurrency" 4) "8.9000000000000004" > zrem books "java concurrency" # 刪除 value (integer) 1 > zrange books 0 -1 1) "java cookbook" 2) "think in java"