Redis的數據結構

Redis的數據結構

1、Redis數據結構介紹

Redis是一種高級的key-value存儲系統,其中value支持五種數據結構
  1. 字符串(String)
  2. 哈希(hash)
  3. 字符串列表(list)底層是鏈表形式的
  4. 字符串集合(set)
  5. 有序字符串集合(sorted set)
關於key的定義,如下幾點須要注意:
  1. key不要太長,應該小於1024字節,消耗額外查找性能
  2. key也不要過短,影響可讀性
  3. 在項目中key應該有一個統一的命名規範

*Redis的更多命令查看文檔:http://redisdoc.com/或百度

2、存儲String

1.概述

    字符串類型是Redis中最爲基礎的數據存儲類型,它在Redis中是二進制安全的(存入和獲取的數據二進制層面上徹底相同)。Redis中字符串類型的value每條最多能夠容納的數據長度是512M。

2.經常使用命令

(1) 賦值:
     set key value
    設定key特有指定的字符串value,若是該key存在則進行覆蓋操做,老是返回"OK」
(2) 取值:
    get key
    獲取特定key的value。若是與該key關聯的value不是String類型,redis將返回錯誤信息,由於get命令只能獲取String類型的value。若value不存在,返回"(nil)"
*nil:無,零;零分;
    getset key value
    先獲取特定key對應value,再從新設置該key的值
(3) 刪除:
    d el key(全部數據類型通用)
    刪除指定key的鍵值對,返回(integer)刪除的鍵值對個數
(4) 數值增減:
    *Redis將自動解析value中是否能夠增減的數將其轉換爲數字再增減。
    將返回遞增後的數據
    incr key
    將指定的key的value原子性地遞增1。若該key不存在,默認建立這個key並設value初始值爲0,在incr後其值將變爲1。若value的值不能轉爲整型,如'hello',則該操做失敗並返回錯誤信息

key不存在:
value不能轉爲整型:
    decr key
    將指定的key的value原子性地遞減1。若該key不存在,默認建立這個key並設value初始值爲0,在incr後其值將變爲-1。若value的值不能轉爲整型,如'hello',則該操做失敗並返回錯誤信息
key不存在:
value不能轉爲整型:

(5) 拼接字符串:
    append key appendValue
    若是該key存在,則在原來的value後追加填入的appendValue值;若不存在,則從新建立一個對應的鍵值對。返回拼接後字符串的長度
key存在:
key不存在:
(6) 其餘命令:
    *原子性增長/減少:(相似"i+=5")
         incrby key increment
        decrby key decrement
等等,自查文檔

3、存儲hash

1.概述

    Redis 中的Hashes類型能夠當作具備 String Key 和String Value的 map 容器。因此該類型很是適合於存儲值對象的信息。如 Username 、Password和Age等。若是 Hash 中包含不多的字段,那麼該類型的數據也將僅佔用不多的磁盤空間。每個 Hash 能夠存儲 4294967295 個鍵值對。

2.經常使用命令

!圖例中hash表命名爲myset,更好的應該是命名爲myhash,忽略這個細節
(1) 賦值:
    爲指定的key設定field/value對(hash鍵值對)
    hset key field value 將自動建立一個hash類型的value
     設置 key 中的多個 filed/value
      hmset key field value [field2 value2 ...]
(2)取值:
    獲取指定key中指定field的value
    hget key field
    獲取key中多個field的值
    hmget key field [field2 ...]
    獲取指定key的全部f/v
    hgetall key
(3)刪除:
    刪除一個或多個字段,返回被刪除字段個數(返回0表示要刪除的字段不存在)
    hdel key field [field2 ...]
    刪除整個hash表
    del key
(4) 增長數字:
    設置key中的field的值增長increment(返回增長後的結果)(field不存在的話類同String的增減數據)
    hincrby key field increment
field不存在:
無hdecrby key field decrement這個命令
可使increment爲負數代替
(5)其餘命令:
    判斷指定key中的指定field是否存在
    hexists key field
    獲取指定key中包含的field的數量
    hlen key
    獲取全部的fields("key")
    hkeys key
    獲取全部的value
    hvals key

  1. 字符串(String)
  2. 哈希(hash)
  3. 字符串列表(list)底層是鏈表形式的
  4. 字符串集合(set)
  5. 有序字符串集合(sorted set


格式改變


4、存儲list類型

1.概述

    在 Redis 中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表同樣,咱們能夠在其頭部 (left) 和尾部(right)添加新的元素。在插入時,若是該鍵並不存在,Redis將爲該鍵建立一個新的鏈表。與此相反,若是鏈表中全部的元素均被移除,那麼該鍵也將會被從數據庫中刪除。 List 中能夠包含的最大元素數量是4294967295個。
    從元素插入和刪除的效率視角來看,若是咱們是在鏈表的兩頭插入或刪除元素,這將會是很是高效的操做,即便鏈表中已經存儲了百萬條記錄,該操做也能夠在常量時間內完成。然而須要說明的是,若是元素插入或刪除操做是做用於鏈表中間,那將會是很是低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。
    在Redis的鏈表中,0表明頭元素,一、二、3等依次類推;-1表明尾元素,-二、-3類推爲倒數第2、倒數第三等。

2.經常使用命令(命令中l表明left/list,r表明right)

1) lpush key value1 [value2...] :在指定的key所關聯的list的頭部 添加 全部的 values,若是該key不存在,該命令在添加的以前建立一個與該key關聯的空鏈表,以後再向該鏈表的頭部添加數據。添加成功,返回元素的個數。
 
2) rpush key value1 [value2...] :在該list的尾部 添加 元素
3) lrange key start end 獲取 鏈表中從start到end的元素的值,start、end可 爲負數,若爲-1則表示鏈表尾部的元素,-2則表示倒數第二個,依次類推…
    獲取 全部 value用: lrange key 0 -1
4) lpushx key value 僅當參數中指定的key存在時 (若是與key對應的list中沒有值時,則該key是不存在的)在指定的key所關聯的list的頭部插入value。這個命令不能夠一次插入多個value
    若不存在:
    不能夠插入多個value
5) rpushx key value :同上,在該list的尾部添加元素
6) lpop key :返回並 彈出 指定的key關聯的鏈表中的第一個元素,即頭部元素。 彈出:從list中獲取且移除
7) rpop key :從尾部 彈出 元素。
8) rpoplpush resource(源list) destination(目標list) :將鏈表中的尾部元素彈出並添加到頭部(循環操做)
「排隊隊列」

9) llen key :返回指定的key關聯的鏈表中的元素的數量。
10) lset key index value :設置鏈表中的index的腳標的元素值,0表明鏈表的頭元素,-1表明鏈表的尾元素。
    替換元素
11) lrem key count value 刪除 count個值爲value的元素, 若是count大於0,從頭向尾遍歷並刪除count個值爲value的元素,若是count小於0,則從尾向頭遍歷並刪除(根據具體場景進行選擇,優化性能)。若是count等於0,則刪除鏈表中全部等於value的元素。
12) linsert key before/after pivot value :在值爲pivot元素前或者後插入value這個元素。 失敗返-1
     向list中間插入元素

*pivot:樞軸; 中心點

5、存儲set類型

1.概述

    在 Redis 中,咱們能夠將Set類型看做爲沒有排序的字符集合,和 List 類型同樣,咱們也能夠在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操做。須要說明的是,這些操做的時間是常量時間。 Set 可包含的最大元素數是4294967295個。
    和 List 類型不一樣的是,Set集合中不容許出現重複的元素。和List類型相比, Set 類型在功能上還存在着一個很是重要的特性,即在服務器端完成多個 Sets 之間的聚合計算操做,如 unions(並集) 、intersections(交集)和 differences(差集) 。因爲這些操做均在服務端完成, 所以效率極高,並且也節省了大量的網絡IO開銷。

2.經常使用命令

1)sadd key value1 value2...:向set中添加數據,若是該key的值已有則不會重複添加
2)smembers key獲取set中全部的成員
3)scard key:獲取set中成員的數量

4)sismember key member判斷參數中指定的成員是否在該set中,1表示存在,0表示不存在或者該key自己就不存在
5)srem key member1 member2...刪除set中指定的成員
6)srandmember key:隨機返回set中的一個成員
7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,並且與key的順序有關。即返回差集

8)sdiffstore destination key1 key2:將key一、key2相差的成員存儲在destination上
9)sinter  key1 key2... 返回交集。 

10)sinterstore destination key1 key2:將返回的交集存儲在destination上
11)sunion key1 key2返回並集

12)sunionstore destination key1 key2:將返回的並集存儲在destination上

6、存儲sorted set類型

1.概述

    Sorted-Sets和Sets類型極爲類似,它們都是字符串的集合,都不容許重複的成員出 如今一個Set中。它們之間的主要差異是Sorted-Sets中的每個成員都會有一個分數(score)與之關聯,Redis正是經過分數來爲集合中的成員進行從小到大的排序。然而須要額外指出的是,儘管Sorted-Sets中的成員必須是惟一的,可是分數(score) 倒是能夠重複的
redis

    在Sorted-Set中添加、刪除或更新一個成員都是很是快速的操做,其時間複雜度爲集合中成員數量的對數。因爲Sorted-Sets中的成員在集合中的位置是有序的,所以,即使是訪問位於集合中部的成員也仍然是很是高效的。事實上,Redis所具備的這一特徵在不少其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis一樣的高效,在其它數據庫中進行建模是很是困難的。 數據庫

    使用sorted set的場景:遊戲排名、微博熱點話題等使用場景。安全

2.經常使用命令(rev表明reverse)

1)zadd key score member score2 member2 ...:將全部成員以及該成員的分數存放到sorted-set中,若member不存在,建立這個member,若member已存在,則更新這個member的分數(添加
2)zcard key獲取集合中的成員數量
3) zcount key min max 獲取分數在[min,max]之間的成員個數
4) zincrby key increment member :設置指定成員的增長的分數。返回增長後該成員的score
5) zrange key start end [withscores] 獲取集合中腳標爲start-end的成員,從分數低到高排序[withscores]參數代表返回的成員包含其分數(類同list中的lrange)
    從高到低排序 有命令: zrevrange key start stop [withscores]
6) zrangebyscore key min max [withscores] [limit offset count] :返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]offset,代表從腳標爲offset的元素開始並返回count個成員
7) zrank key member :返回成員在集合中的排名
    有從大到小排序的: zrevrank key member
8) zrem key member[member ] :移除集合中指定的成員,能夠指定多個成員。
9) zscore key member :返回指定成員的分數
10) zremrangebyrank key start stop :按照排名順序刪除元素

11)zincrby key increment member:設置成員增長的分數,返回增長後的分數

7、通用命令

1) keys pattern:獲取全部與pattern匹配的key,返回全部匹配的keys(*表示一個或多個任意字符,?表示任意一個字符)( 搜索
2) del key1 key2... :刪除指定key的數據
3) exists key :判斷key是否存在,1爲t,0爲f
4) rename key newkey :重命名key
5) expire key :設置過時時間(過時即移除),單位爲秒( !注意:設置爲0或-1的話會刪除這個key
    可使用 persist key 在不刪除key的狀況下移除設置的超時時間,更多超時的命令詳見文檔
6) ttl key :獲取該key所生的過時時間,若該key沒有設置超時expire時間,返回-1;返回-2表示key不存在
7) type key :獲取指定key對應的數據類型,返回字符串(string、list、set、hash、zset),若不存在則返回none

附件列表

相關文章
相關標籤/搜索