1. 程式人生 > >Redis 基礎數據結構

Redis 基礎數據結構

learn 並且 null 刪除 鍵值對 ash card 自增 類型

string (字符串)

是一種鍵值對的數據結構,定義一個唯一的key值來獲取相應的value數據。

> 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 設置過期時間,到點自動刪除,這個功能常用來控制緩存的失效時間。

> 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 值是一個整數,還可以對它進行自增操作

> set age 30
OK
> incr age
(integer) 31
> incrby age 5
(integer) 36
> incrby age -5
(integer) 31

list(列表)

相當於java裏面的LinkedLis,意味著list的插入和刪除非常快,但是索引定位很慢。

右邊進左邊出:隊列

> 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

set (集合)

它內部的鍵值對是無序的唯一的。它的內部實現相當於一個特殊的字典,字典中所有的 value 都是一個值NULL。

> 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"

zset (有序集合)

一方面它是一個 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"

Redis 基礎數據結構