【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命名作為生產者 使...