redis支持的數據結構

  • Binary-safe string:字符串,Binary-safe的意思是它自己不會應爲某些特殊字符而致使字符串結束了,他能夠包含任何字符。好比在C中,字符串的結尾是'\0',意味着這個字符以後的不能被當作當前字符的redis

  • Lists:存儲string的鏈表,存儲順序即插入順序 (不是經過數組實現)數組

  • Sets:每一個字符串惟一的存儲集合bash

  • Sorted Sets:存儲的每個字符串都是惟一的,同時每一個字符串會具有一個score的屬性數據結構

  • Hashes:存儲key和value的映射關係,key和value都是stringspa

  • Bit Array:像bit數組同樣處理String值,每個bit均可以set和clear,計算1的數量等等code

  • HyperLogLogs:用來估計set中惟一值的個數對象

redis的key

key能夠包含任意得字符,好比將一張JPEG文件內容做爲key。空字符串也是一個有效的key。redis的key使用時,有一些建議:排序

  • key最好不要太長。超過1024bytes的key一個是佔用內存,再者每次去找key作匹配也是須要一些時間的索引

    可用經過hash來解決,好比使用SHA1ip

  • key過短也很差。好比"user:1000:followers"顯然比"u1000flw"擁有更好的可讀性,key自己的這點增加所須要的空間比起key對象和object對象來講能夠忽略

    本身掌握好這裏頭的平衡

  • 嘗試遵循必定的模式。好比以"object-type:id"這種方式來做爲key的規則

  • key最大512M

設置key過時

EXPIRE 命令用來設置過時

  • 過時的精度能夠是秒或者毫秒

  • 過時時間的分辨率一直是毫秒

  • 過時時間自己會被持久化,即便redis自己中止服務了,停服期間過時的時間仍是一樣計算

使用 PERSIST 能夠去掉過時時間,永久保留 key

String

SET 命令來設置 string類型值,它會替代已經存儲在redis中的key的值,即便原來存儲的值類型不是string

  • value大小不能超過512M
  • 若是SET值時,發現已經存儲,則不覆蓋原值,能夠經過 set mykey myValue nx ,即後面跟 nx 來實現這種語義;另外若是僅想在key存在的時候覆蓋,能夠經過 set mykey myValue xx 即後面跟 xx 來實現這種語義
  • 批量獲取使用MSET,對應GET爲MGET
  • set key value ex 10 設置10秒後過時

INCR 命令會把 string 類型值當作integer,實現自增1,若是key不存在,它會被置爲0,而後再自增1。若是 string 不能當作 integer 會拋出異常

  • 自增的上限是64 bit的integer。
  • 相似的命令有 INCRBY ,可自定義增加的大小。其他還有DECR DECRBY
  • INCR命令是原子操做。

EXISTS 判斷key是否存在

DEL 刪除key

TYPE 判斷key的類型

TTL 獲取key的存活時間

LIST

  1. LPUSH 命令向list頭添加元素只須要常量時間,可一次添加多個

  2. RPUSH 命令向list尾部添加元素只須要常量時間,可一次添加多個

  3. LRANGE 提取list中必定範圍內的元素,好比 lrange mylist 0 -1 ,範圍是兩個索引,均可以是負數,-1表示最後一個,-2表示倒數第2個,依此類推

  4. RPOP 返回list中的最後一個元素,並從list中移除它,若是沒有元素了就返回 NULL

  5. LTRIM 保留給定索引範圍以內的數據,list中的其他值都刪掉

  6. BRPOP 從list中返會並刪除最後一個元素,若是列表沒有值,就阻塞,根據阻塞的時間,若是是0,就一直阻塞直到有值存在,大於0則阻塞相應的時間長度

  7. BLPOP 對應BRPOP操做第一個元素

使用brpop/blpop 須要注意:

  • 客戶端的請求處理是按照順序來的,第一個阻塞的當有其它客戶端插入數據會第一個處理
  • 它的返回會有兩個值
  • 超時返回NULL

自動建立和移除keys

當往redis中沒有對應key存在的集合中push元素或者刪除一個空的集合,redis須要主動的去建立空的集合或者是刪除沒有值的key。對應的操做有三條規則:

  • 當往集合中添加元素,若是目標的key不存在,在添加以前redis會首先建立一個空的集合
  • 當從集合中移除一個元素,若是value移除後是空的,key就會被刪掉
  • 使用形如 LLEN 的只讀命令,或者是使用移除元素的命令,來操做一個不存在的key,redis的表象就像key自己的value是一個空集合同樣

Hash

使用hash可以用來表明一個對象,放到hash裏面的字段數量理論上是沒有限制的

  1. hmset: 往hash中塞多個字段
  2. hget:獲取當個的字段
  3. hmget:以數組形式返回值
  4. hincrby: 對單個字段進行遞增操做
hmset user:1000 name paxi verified 1 a 10 //塞入user的多個字段
hget user:1000 name  //獲取name字段值
hmget user:1000 name verified //以數組形式返回值,key不存在返回null
hincrby user:1000 a 10 //將字段a增長10
複製代碼

Set

set在redis中用來存儲string的無序集合。

  1. sadd:往set中添加新的元素,能夠單個或者批量的添加
  2. smembers:獲取set中的全部元素
  3. sismember:校驗某個元素是否是屬於給定結合
  4. sinter:獲取多個set的交集
  5. spop:從set中隨機刪除一個元素,並返回它的值
  6. sunionstore:取多個set中的並集
  7. scard:計算set中惟一值的個數(集合論中的基數)
sismember myset 1 //判斷 1 是否是在集合 myset中
sunionstore myset1 myset2 //假如 myset1不存在,就至關於把 myset2 中的元素拷貝到了 myset1
複製代碼

Sorted sets

用來存儲惟一的string,它每個值都包含一個score屬性,它會根據以下規則排序

  • 若是A和B兩個元素有有不一樣的score,且 A.score > B.score,那麼 A>B
  • 若是A和B有着同樣的score,若是從字面排序上A比B要排在前面,那麼 A>B

它內部實現是 dual-ported數據結構 ,內部同時包含了 skip list和 hash table,每次添加元素的時間是O(lgN),可是獲取的時間是常量的

  1. zadd:往 sorter sets中添加元素,能夠同時添加多個,添加一樣的key則會更新元素自己的score
  2. zrange:按順序獲取集合中一段索引範圍以內的元素
  3. zrevrange:按逆序獲取集合中一段索引範圍以內的元素
  4. zrangebyscore:取score範圍內的元素
  5. zremrangebyscore:移除score範圍內的元素
  6. zrank:獲取特定key的排序位置
zadd hackers 1940 「Alan Kay」 //往 hackers中添加 「Alan key」 它的score是1940
zrange hackers 0 -1 withscores //按照順序獲取hackers中的全部元素,0表示第一個,-1表示最後一個,同時返回對應元素的分數
zrevrange hackers 0 -1 //按照逆序
複製代碼

Bitmaps

它並不是一種數據結構,而是在string類型上定義的一種面向bit的操做。它最大的優點是能節省空間

  1. setbit :設置key的特定位置的bit值爲0或者1,當key的長度不夠會自動擴充
  2. getbit:返回特定索引位置的bit值,範圍外的bit返回0
  3. bitop:提供bit級別的操做,包括 AND OR XOR NOT
  4. bitcount:計算bit值是1的個數
  5. bitpos:找到第一個指定的值(指定0或者1)的位置

HyperLogLogs

它是一種機率數據結構,用來統計惟一的值。通常統計惟一的值的時候,須要記錄全部已經訪問過的元素,這會消耗大量的內存,可是使用HyperLogLogs只須要使用常量的內存,最差的狀況下愛只須要12k,此時的精度不會差於1%。

  1. pfadd: 往 其中添加元素
  2. pfcount:計算元素的個數

HyperLogLogs實際只存儲了一個狀態,並不包含真實的元素的值

redis 官網介紹

相關文章
相關標籤/搜索