redis 數據類型

redis 數據類型

redis並不是單純的key-value 存儲的服務器,事實上它支持多種值類型的數據結構服務器。下面就是redis 支持的數據結構.

redis的key

redis的key是安全的二進制安全的。支持使用二進制序列作爲一個key, 例如:既可以將字符串‘foo’作爲一個key, 同樣也支持將JPEG文件內容當作key. redis 認爲空字符是一個合法的key.

其他約束
- redis 的key的長度不宜太長

例如:一個具有1024個字節的key不是一個好注意,這個不僅是從內存上考慮,從一個數據集中查找這個字符時候,需要花費多次key的比較。事實上匹配一個比較大的值的, 從內存和帶寬考慮hashing 它的鍵是更好的選擇。

  • redis 的鍵也同樣不宜太短

例如: 將一個很短的指針“u1000flw”當做一個key, 不如將它寫成“user:1000:followers”. 第二種寫法具有更高的可讀性,雖然增加了少許的空間,當對於key和它的valu的使用空間都是微不足道的, 短小的key很顯然少使用一點內存,我們需要找到兩者之間的平衡。

  • 堅持一個命名規範

    對於redis的key按一定規則命名是很好的習慣。 例如:“object-type:id”
    將冒號,擴折號用在不同的字段之間

    • key允許的最大長度是512Mb

string

redis 字符類型是redis key值的最基本類型。在memcached中字符類型是它的唯一類型,對於後來者的redis 使用字符類型也是很自然的事情。既然redis的key 是字符類型,我們也可以將value設爲字符類型,就這樣我們就將字符類型key映射到了字符類型的value. 字符類型的value對於具有“大量用例”情況是很實用的,例如:換成html的表籤或者直接緩存整個頁面。

示例

> set jzq jiazq
OK
> get jzq
"jiazq"

賦值與獲取

如我們看到的:使用set 和 get 命令redis對字符串類型進行賦值和取值的方式。

SET

set 是賦值操作;如果已經存在的key ,將會直接替換已經存在的value,即使賦值的是空字符串;所有說set是執行的賦值操作。字符類型value 可以是任意類型的字符形式,最大支持512MB。
set 命令有一個附加選項nx ; 當key 存在的時候,就賦值成功;
xx: 當key不存在的時候才賦值成功。
返回值:OK或者nil

> set mykey newval nx
(nil)
> set mykey newval xx
OK
INCR

格式:incr key

incr命令可以將string value解析成integer,然後將它的值加1,最終將新值覆蓋舊值. 如果key 不存在,就先將key賦值爲0然後在操作
返回值:操作後的值

INCRBY

格式: incrby key increment

將key存儲的值增加指定的數字.如果key不存在,就會在執行這個操作之前,先設置key 的值爲0,然後在繼續操作。如果這個key的值不能轉換成integer類型就會報錯
返回值:操作後的值;

> incrby dd 34
(integer) 34
> get dd
"34"
DECR

格式:decr key

將存儲的key值數字減一;如果key 不存在,就先賦值爲0,然後在繼續下面操作,同樣,如果key值不是integer類型將有錯誤提示。
返回值: 操作後的值

> decr la
(integer) 0
> get la
"0"
> decr ld
(integer) -1
> get ld
"-1"
DECRBY

格式: decrby key decrement

將存儲的key的數值減去指定的數值

FAQ

incr 是原子操作嗎?儘管redis多個客戶端在對同一個key執行incr操作命令會進入不同的奴屬隊列,不過出現client1 ,client2讀取都是10,都執行加1,最終設置爲11的情況。最終值將會是12,其他client也會在同一時間讀取到最新的值。

MSET 和 MGE

redis 支持key批量賦值和獲取

格式:
mset key1 value1 key2 value2 …

mget key1 key2 ..

示例

 mset l1 sfs l2 353 l3 12.23
OK
> mget l1 l2 l3
1) "sfs"
2) "353"
3) "12.23"
EXISTS

格式: exists key

返回值: 1或0

判斷redis db 中是否具有一個這麼一個key;

del

格式:del key

返回值:1 或者 0

如果redis db中具有一個key;無論它的值是什麼,都將刪除.

type

格式: type key

返回值: type of key or none

返回key 的類型,如果key不存在了返回none

redis expires

在繼續介紹更多的數據結構之前,我們需要討論redis數據類型另外的一個特性,是所有數據結構的具備的,它叫Redis expires . 最基本的功能是設置一個key的存活時間. 當時間超過設置時間,這個key就會自動銷燬,事實上好像用戶調用了del命令一樣。

  • 既可以使用秒也可以使用毫秒來設置有效時間
  • 當redis 服務器停止時候,會將expires 的key 帶時間參數持久化到硬盤上;

hash

hash 可以很方便的描繪一個對象,事實上,hash的裏的元素字段同樣可以嵌套hash,所以在你的應用程序裏,你可以自定義hash的結構.

HMSET

同時對多個字段賦值;

格式: HMSET KEY field1 value1 filed2 value2 ..

返回值: 字符OK

> HMSET hash:1 name zhangsan sex boy phone 12345
OK
HSET

對hash 單個字段賦值,無論filed 是否存在;

格式: HSET key filed value

返回值: 1

> hset hash1 height 174
(integer) 1
HMGET

格式: HMGET key field1 field2 ..

返回值: array 或者nil

> hmget hash:1 name phone
1) "zhangsan"
2) "12345"
HGEALL

獲取hash key中有字段內容

格式: HGETALL key

返回值: array 或者nil

> hgetall hash:1
1) "name"
2) "zhangsan"
3) "sex"
4) "boy"
5) "phone"
6) "12345"

list

以少許理論開始,來解釋list數據類型,應該更好理解,list 經常會被技術人員以不正確的方式使用.
一般來說,list就是一個有序元素列表. 但是使用數組實現的list和與使用鏈表實現的List確有很到的不同.

redis的list內部是通過鏈表實現. 儘管你有百萬數據在list裏面, 將一個元素添加到list的頭部或者是尾部花費的時間是一樣的. 通過LPUSH命令,將一個元素添加到大小是10的list中,跟將一個元素插入到具有千萬的list中花費的時間是相差無幾的.

redis list的弊端:

通過索引index訪問元素在數組實現的list中是很快的,但對於通過鏈表實現的List,需要從頭依次查找.
redis list 是通過linked list實現,因爲對於一個數據庫系統來說,以非常快的方式將元素添加到一個非常大的list中是很重要的. 另外在添加完元素的同時,可以立即看到list的長度.

如果訪問到list中間的元素很重要,這時候需要使用另外一種數據結構:sorted Sets

第一步

LPUSH

在list的頭部添加指定的元素,當key 不存在時候,在執行命令之前,會先創建一個內容爲空list ; 如果key的類型不是list ,將有錯誤報出,LPUSH 支持多個值.

格式: LPUSH key value1 value2 ..

返回值: SIZE OF LIST

> lpush ele:1 21 34 abc de3
(integer) 4
RPUSH

在list的尾部添加指定的元素,當key 不存在時候,在執行命令之前,會先創建一個內容爲空list ; 如果key的類型不是list ,將有錯誤報出,RPUSH 支持多個值.

格式: RPUSH key value1 value2 ..

返回值: SIZE OF LIST

> lpush ele:1 21 34 abc de3
(integer) 4
lrange

讀取list 中指定索引之間的元素集

格式:lrange key startIndex endIndex

返回值: startIndex 到 endIndex 之間的元素(包括startIndex元素和endIndex元素)

注意:
- 如果endIndex 超過了list的最大長度,不會報錯,會將startIndex到末尾的元素全部返回.
- 如果startIndex 比endIndex 大,會返回空.
- index 支持負值,-1 代表最後一個,-2 代表倒數第二個,依次類推.

獲取所有元素

> lrange ele:1 0 -1
1) "de3"
2) "abc"
3) "34"
4) "21"
5) "cc1"
6) "cc2"

獲取前N個元素

> lrange ele:1 0 3
1) "de3"
2) "abc"
3) "34"
4) "21"

獲取最後N個元素

> lrange ele:1 -3 -1
1) "21"
2) "cc1"
3) "cc2"
LPOP RPOP

在redis list中還有個很重要的操作命令,將數據取出, 即將數據讀取出來,並且將它從list移除.
Pop 像push命令一樣,既可以從頭部取出一個元素:LPop 又可以從尾部取出一個元素RPOP

格式: LPOP key 或者RPOP key

返回值: 元素或者nil

Capped list

在很多時候,我們使用list 希望它能夠存儲最新的元素,像:社交網站的更新,日誌等待..; redis 運行我們使用list 當做有界集合,通過LTRIM 命令 只記錄最近N條元素,並且刪除素有的過時的元素項.

LTRIM

ltrim 語法結構類似與lrange,但ltrim 是刪除操作,lrange 是讀操作;
ltrim 只保留startIndex 到endIndex 之間的元素,其他的全部刪除.

格式: ltrim key startIndex endIndex

返回值: Ok

> lrange ele:1 0 -1
1) "a2"
2) "a3"
3) "a4"
4) "a3"
5) "a2"
6) "a1"
7) "de3"
8) "abc"
9) "34"
> ltrim ele:1 0 4
OK
> lrange ele:1 0 -1
1) "a2"
2) "a3"
3) "a4"
4) "a3"
5) "a2"
> ltrim ele:1 -2 -1
OK
> lrange ele:1 0 -1
1) "a3"
2) "a2"

阻塞list

list 具有一個特性可以讓lists 稱爲隊列,通常作爲構建進間的通信的阻塞操作.

BLPOP

BLPOP 是一個阻塞list pop 操作. 它是LPOP的阻塞版本, 當list 的元素爲空時,去pop元素時候就會阻塞, 直到獲取到元素時候.

格式: BRPOP key1 key2 .. timeout(秒)

返回值: array 或nil

當 timeout 是0 時候,將一直阻塞
非零時,阻塞指定時間等待獲取數據, 時間到是如果還沒有數據,就返回null

自動創建與刪除

當對一個list 進行添加元素時,如果指定key的list 不存在,redis就會自動創建,當從指定的list 獲取元素後,list 爲空,redis自動將list 刪除.

set

Redis Sets 是無序的字符集合.

SADD

向集合中添加一個或者多個元素

格式: key member1 member2 ..

返回值: int 成功加入的元素數量.

> sadd s1 a b c
(integer) 3
> sadd s1 b c d e
(integer) 2

SREM

向集合中刪除一個或者多個元素

格式: SREM key member1 member2

返回值: int 成功刪除的元素個數

> srem s1 d e f
2

smembers

獲取集合中所有元素

格式: smembers key

返回值: array

sismember

判斷元素是否就在 集合中

格式: sismember key element

返回值: 1 或者 0

> sismember s1 a
(integer) 1

> sismember s1 d
(integer) 0

排序的set

sorted sets 是一種能夠將set和hash結合的數據結構. sorted sets 由元素唯一,不可重複的字符元素組成,所以給人的感覺更新set. 然而,在setz中元素都並不是排序的, 當在sorted sets 中每一個元素都關聯有一個float類型的指針值-score . 這就是爲什麼說sorted sets 有點像一個hash, 正是因爲每個元素都對應一個值.

而且所有元素被取出都是按一定順序的(它們不是在請求時候排序的, 排序是一種特別的數據結構). 元素的排序需要遵循下面的規則:

  • 如果A和B 是兩個不同score的元素,如果A.score > B.score 那麼 A > B
  • 如果A和B 具有相同的score元素, 如果字符A存儲的字典順序向量 優於 字符B. A和B字符串就不相等,因爲sorted sets 只能具有元素唯一性.
zadd

格式: zadd key [NX | XX] [CH] [INCR] score member …

添加所有帶有指定scores的member 到 sorted set 中, 支持同時指定多組score-member; 如果指定元素已經存在, score值就會被更新並且元素根據選項是否重插.

Option

-XX: 只更新已存在的元素, 不會插入操作.
-NX: 不會更新已經存在的元素, 總會做插入操作.
-CH: 存在就更新score,不存在就插入.

127.0.0.1:6379> zadd a1 12 abc1
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> zadd a1 23 abc2
(integer) 1
127.0.0.1:6379> zadd a1 34 abc3
(integer) 1
127.0.0.1:6379> zrange a1 0 -1
1) "abc1"
2) "abc2"
3) "abc3"
zrange

獲取順序獲取sets列表, 語法類似lrange

127.0.0.1:6379> zrange a1 0 -1
1) "abc2"
2) "abc1"
3) "abc3"
4) "abc5"
127.0.0.1:6379> zrange a1 -2 -1
1) "abc3"
2) "abc5"
發佈了49 篇原創文章 · 獲贊 13 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章