Redis的資料型別

2021-09-07 02:54:37 字數 3782 閱讀 8790

前面說過,redis的一大特性是支援豐富的資料型別,

這為更多的應用場景提供了可能。

redis有五種資料型別,包括string,list,set,sorted set和hash,

注意,redis的資料型別不支援巢狀。

下面學習一下這五種資料型別的特點和簡單應用。

string 資料結構是簡單的 key-value 型別,value 不僅可以是 string,也可以是數字(當數字型別用 long 可以表示的時候encoding 就是整型,其他都儲存在 sdshdr 當做字串)。使用 strings 型別,可以完全實現目前 memcached 的功能,並且效率更高。還可以享受 redis 的定時持久化(可以選擇 rdb 模式或者 aof 模式),操作日誌及 replication 等功能。

應用場景:

應用最廣泛,redis最基礎的資料型別。

常用命令:

set,get,將字串值value關聯到key/返回key所關聯的字串值。

incr,將key中儲存的數字值增一。

decr,將key中儲存的數字值減一。

mset,同時設定乙個或多個key-value對。

mget,返回所有(乙個或多個)給定key的值。

很多時候我們需要儲存一些物件資料資訊,

比如使用者資訊,包括使用者的暱稱、年齡、性別等,如果使用string資料型別,

通常是將這些資訊序列化後儲存為乙個json 格式的字串,比如「lilei,18,man」。

如果更新這些資訊,需要將字串(json)取出來,進行反序列化,修改某一項的值,再序列化成字串(json)儲存回去。在資料的傳輸和處理時會造成很大的浪費,

這個時候雜湊資料型別就可以很好解決這個問題。hash 結構可以直接修改某一項屬性值。

實現方式:

常用命令:

hset 給字段賦值,更新時可以直接覆蓋

hget 獲得欄位的值

hmset,hmget 給多個字段賦值(獲得值)

hgetall 獲取鍵中所有欄位和字段值

如,

redis> hmset tom age 18 gender male

okredis> hgetall tom

1) "age"

2) "18"

3) "gender"

4) "male"

應用場景:

關注列表,粉絲列表,訊息佇列等。

實現方式:

list的實現為乙個雙向鍊錶,即可以支援反向查詢和遍歷,更方便操作,不過帶來了部分額外的記憶體開銷,redis內部的很多實現,包括傳送緩衝佇列等也都是用的這個資料結構。

常用命令:

#將乙個或多個值value插入到列表key的表頭/移除並返回列表key的頭元素

lpush,lpop

#將乙個或多個值value插入到列表key的表尾(最右邊)/移除並返回列表key的尾元素

rpush,rpop

#返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定

lrange

# lpop 命令的阻塞版本,當給定列表內沒有任何元素可供彈出的時候,連線將被 blpop 命令阻塞,直到等待超時或發現可彈出元素為止。

blpop(阻塞版)

由乙個或多個元素所構成的叫做集合。

集合中的元素有三個特徵:確定性,互異性,無序性。集合和列表的區別在於列表中的元素有序且並不一定唯一。redis還為集合提供了求交集、並集、差集等操作。

應用場景:

set對外提供的功能與list類似,但是set可以自動排重,當你需要儲存乙個列表資料,又不希望出現重複資料時,set是很好的選擇。

set提供了判斷某個成員是否在乙個set集合內的重要介面,這個也是list所不能提供的。

實現方式:

set 的內部實現是乙個value為null的hashmap, 實際就是通過計算hash的方式來快速排重的,操作set的時間複雜度始終為o(1)。

常用命令:

#向集合中新增乙個或多個元素,返回成功加入的元素

sadd key member1 [member2...]

#刪除乙個或多個元素

srem key member [member...]

#隨機彈出乙個元素

spop key

#集合間運算,差集運算

sdiff key [key...]

#交集運算

sinter key [key...]

#並集運算

sunion key [key...]

#獲得集合中的所有元素

smembers key

#判斷元素是否在集合中

sismembers key member

操作例項:

redis>sadd myset a b c

(integer) 3

redis>smembers myset

1) "a"

2) "c"

3) "b"

redis>spop myset

"a"

有序集合在集合型別的基礎上,為每個元素都關聯了乙個分數,這樣除了可以進行集合相關的操作,

還可以根據分數不同,進行排序等操作,有序集合中元素的分數可以是相同的。

應用場景:

以某個條件為權重,比如按頂的次數排序。

可以用sorted sets來做帶權重的佇列,

比如普通資訊的score為1,重要訊息的score為2,然後工作執行緒可以選擇按score的倒序來獲取工作任務。讓重要的任務優先執行。

實現方式:

redis sorted set的內部使用 hashmap 和跳躍表(skiplist)來保證資料的儲存和有序,hashmap裡放的是成員到score的對映,而跳躍表裡存放的是所有的成員,排序依據是hashmap裡存的分數。

有序集合和列表的區別:

list和sorted set中元素都是有序的,

列表型別是聽過鍊錶實現的,當元素增多時,訪問中間元素速度會下降,

而有序集合是用hashmap和跳躍表(skiplist),不存在這個問題,但是有序集合的記憶體開銷比列表要大。

常用命令:

#新增乙個或多個成員到有序集合,或者如果它已經存在更新其分數

zadd key score1 member1 [score2 member2]

#由索引返回乙個成員範圍的有序集合

zrange key start stop [withscores]

#移除有序集 key 中的乙個或多個成員,不存在的成員將被忽略。

zrem

#返回有序集 key 的基數。

zcard 

Redis的資料型別

redis支援五種資料型別是string 字串 hash 雜湊 list 列表 set 集合 和zset sortedset 有序集合 string是redis最基本的型別,乙個key對應乙個value string型別是二進位制安全的,意思是redis的string可以包含任何資料,比如jpg或者...

Redis的資料型別

redis是乙個開源的使用ansi c語言編寫 遵守bsd協議 支援網路 可基於記憶體亦可持久化的日誌型 key value資料庫,並提供多種語言的api,它通常被稱為資料結構伺服器,支援五種資料型別 string 字串 hash 雜湊 list 列表 set 集合 和zset sorted set...

redis的資料型別

redis支援5種資料型別 物件 分別是字串 string 列表 list 雜湊 hash 集合 set 有序集合 zset sorted set redis中的鍵和值都是乙個物件。redis使用引用計數實現記憶體 當乙個物件不再被使用時,會被 每個物件也會記錄最後一次被訪問的時間,可用於計數空轉時...