redis資料結構

2021-08-19 23:45:01 字數 4213 閱讀 9629

【redis資料結構 – 簡介】

redis是一種高階的key:value儲存系統,其中value支援五種資料型別:

1.字串(strings)

2.字串列表(lists)

3.字串集合(sets)

4.有序字串集合(sorted sets)

5.雜湊(hashes)

而關於key,有幾個點要提醒大家:

1.key不要太長,盡量不要超過1024位元組,這不僅消耗記憶體,而且會降低查詢的效率;

2.key也不要太短,太短的話,key的可讀性會降低;

3.在乙個專案中,key最好使用統一的命名模式,例如user:10000:passwd。

【redis資料結構 – strings】

有人說,如果只使用redis中的字串型別,且不使用redis的持久化功能,那麼,redis就和memcache非常非常的像了。這說明strings型別是乙個很基礎的資料型別,也是任何儲存系統都必備的資料型別。

我們來看乙個最簡單的例子:

set mystr "hello world!" //設定字串型別

get mystr //讀取字串型別

字串型別的用法就是這麼簡單,因為是二進位制安全的,所以你完全可以把乙個檔案的內容作為字串來儲存。

另外,我們還可以通過字串型別進行數值操作:

看,在遇到數值操作時,redis會將字串型別轉換成數值。

由於incr等指令本身就具有原子操作的特性,所以我們完全可以利用redis的incr、incrby、decr、decrby等指令來實現原子計數的效果,假如,在某種場景下有3個客戶端同時讀取了mynum的值(值為2),然後對其同時進行了加1的操作,那麼,最後mynum的值一定是5。不少**都利用redis的這個特性來實現業務上的統計計數需求。

【redis資料結構 – lists】

redis的另乙個重要的資料結構叫做lists,翻譯成中文叫做「列表」。

首先要明確一點,redis中的lists在底層實現上並不是陣列,而是鍊錶,也就是說對於乙個具有上百萬個元素的lists來說,在頭部和尾部插入乙個新元素,其時間複雜度是常數級別的,比如用lpush在10個元素的lists頭部插入新元素,和在上千萬元素的lists頭部插入新元素的速度應該是相同的。

雖然lists有這樣的優勢,但同樣有其弊端,那就是,鏈表型lists的元素定位會比較慢,而陣列型lists的元素定位就會快得多。

lists的常用操作包括lpush、rpush、lrange等。我們可以用lpush在lists的左側插入乙個新元素,用rpush在lists的右側插入乙個新元素,用lrange命令從lists中指定乙個範圍來提取元素。我們來看幾個例子:

lists的應用相當廣泛,隨便舉幾個例子:

【redis資料結構 – 集合】

redis的集合,是一種無序的集合,集合中的元素沒有先後順序。

集合相關的操作也很豐富,如新增新元素、刪除已有元素、取交集、取並集、取差集等。我們來看例子:

//向集合myset中加入乙個新元素"one"

127.0.0.1:6379> sadd myset "one"

(integer) 1

127.0.0.1:6379> sadd myset "two"

(integer) 1

//列出集合myset中的所有元素

127.0.0.1:6379> smembers myset

1) "one"

2) "two"

//判斷元素1是否在集合myset中,返回1表示存在

127.0.0.1:6379> sismember myset "one"

(integer) 1

//判斷元素3是否在集合myset中,返回0表示不存在

127.0.0.1:6379> sismember myset "three"

(integer) 0

//新建乙個新的集合yourset

127.0.0.1:6379> sadd yourset "1"

(integer) 1

127.0.0.1:6379> sadd yourset "2"

(integer) 1

127.0.0.1:6379> smembers yourset

1) "1"

2) "2"

//對兩個集合求並集

127.0.0.1:6379> sunion myset yourset

1) "1"

2) "one"

3) "2"

4) "two"

對於集合的使用,也有一些常見的方式,比如,qq有乙個社交功能叫做「好友標籤」,大家可以給你的好友貼標籤,比如「大美女」、「土豪」、「歐巴」等等,這時就可以使用redis的集合來實現,把每乙個使用者的標籤都儲存在乙個集合之中。

【redis資料結構 – 有序集合】

redis不但提供了無序集合(sets),還很體貼的提供了有序集合(sorted sets)。有序集合中的每個元素都關聯乙個序號(score),這便是排序的依據。

很多時候,我們都將redis中的有序集合叫做zsets,這是因為在redis中,有序集合相關的操作指令都是以z開頭的,比如zrange、zadd、zrevrange、zrangebyscore等等

老規矩,我們來看幾個生動的例子:

//新增乙個有序集合myzset,並加入乙個元素baidu.com,給它賦予的序號是1:

//向myzset中新增乙個元素360.com,賦予它的序號是3

127.0.0.1:6379> zadd myzset 3 360.com

(integer) 1

//向myzset中新增乙個元素google.com,賦予它的序號是2

127.0.0.1:6379> zadd myzset 2 google.com

(integer) 1

//列出myzset的所有元素,同時列出其序號,可以看出myzset已經是有序的了。

//只列出myzset的元素

【redis資料結構 – 雜湊】

最後要給大家介紹的是hashes,即雜湊。雜湊是從redis-2.0.0版本之後才有的資料結構。

hashes存的是字串和字串值之間的對映,比如乙個使用者要儲存其全名、姓氏、年齡等等,就很適合使用雜湊。

我們來看乙個例子:

//建立雜湊,並賦值

127.0.0.1:6379> hmset user:001 username antirez password p1pp0 age 34

ok//列出雜湊的內容

127.0.0.1:6379> hgetall user:001

1) "username"

2) "antirez"

3) "password"

4) "p1pp0"

5) "age"

6) "34"

//更改雜湊中的某乙個值

127.0.0.1:6379> hset user:001 password 12345

(integer) 0

//再次列出雜湊的內容

127.0.0.1:6379> hgetall user:001

1) "username"

2) "antirez"

3) "password"

4) "12345"

5) "age"

6) "34"

Redis資料結構

字典 dict 是redis裡最核心的資料結構,正如其全稱remote dictionary service所說,redis其實就是乙個字典服務,字典以key value的形式呈現給使用者,key是簡單的字串,而value可以是各種資料結構,比如字串 string 鍊錶 list 集合 set 排序...

Redis 資料結構

最近接觸到了redis的使用,借這個機會深入的了解一下redis的實現和設計原理。下面先介紹一下redis底層所用到的資料結構。redis的實現幾乎都是基於下面的幾個資料結構之上的。struct sdshdr struct listnode struct list struct dictentry ...

redis 資料結構

今天學習了redis的列表型別 lpush ltrim lrange lpush mylist content ltrim 0,99 lrange 0,1 lrange 兩個引數 分別代表第乙個元素和最後乙個元素 redis的列表型別,可以用來做訊息佇列 使用乙個程序 用lpush命名作為生產者 使...