Redis學習(3)——數據結構

Redis是一個數據結構類型的服務器,不是單純的key-value存儲。Redis裏面的鍵是二進制安全的(二進制安全是指數據在傳輸過程中保證數據的安全性,包括加密等),因此鍵的內容不應該包含空格或者換行符。比如”hello world”和”hello world\n”是錯誤的。


一 Keys上的操作



1) DEL key [key...]
   刪除多個key,不存在的key,則忽略
   返回實際刪除了的key的個數

2) EXISTS key
   返回1和0表示key是否存在

3) EXPIRE key seconds
   設置key的存活時間

4) EXPIREAT key timestamp
   UNIX timestamp(seconds since January 1, 1970)來設置存活期

5) KEYS pattern
   返回match pattern的keys的列表

6) MOVE key db
   在當前數據庫中將key移動到指定的db中
   如果key在當前db中不存在或者指定的db中已有這個key,就不移動
   返回1或者0表示是否moved

7) OBJECT REFCOUNT <key>
   返回關聯到key上的引用的個數
   OBJECT ENCODING <key>
   返回key在數據庫內部的壓縮編碼方式
   OBJECT IDLETIME <key>
   返回key多久沒有被讀寫
  在2.2.3版本後纔可使用,目前裝的是2.0.2版本,不支持

8) PERSIST key
   移除key上的時間限制屬性,使其永久存在
   版本2.1.2後有效

9) RANDOMKEY
   從數據庫隨機的返回一個key

10) RENAME key newkey
   重新命名一個key,其他不變

11) RENAMENX key newkey
   重新命名一個key,如果newkey已經存在時,命令失敗

12)SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
   各種排序方式

13) TTL key
   返回一個key還能在數據庫中存活多久(seconds)
   如果key不存在或者沒有時間限制,返回-1
   expire mykey可以設置一個key的存活時間

14) TYPE key
   返回key的類型(string,list,set...)


二 Strings


這是最簡單的redis數據類型,在只使用這個數據類型的時候,Redis就和一個有持久存儲功能的memcached服務器類似。在Redis中,值最大可以有1GB,因此可以將圖片等內容都緩存進去。SET操作,GET操作是基本的存儲和讀取操作,INCR命令可以將值自增1.



1) APPEND key value
   如果key不存在,創建一個新的key
   如果key已經存在,在value後apend,改變了value的值

2) DECR key
   key減1,對整型適用(或者以整型代表的字符串)
   對其他類型,返回錯誤

3) DECRBY key decrement
   將key減少指定的這麼多
   如果key不存在,從零開始減少

4) GET key
   不解釋

5) GETRANGE key start end
   返回substring,包含開始和結束索引
   0代表第一個索引,-1最後一個索引

6) GETSET key value
   對已經存在的key,設置其新的value,並返回老的value
   如果key不是string類型,返回錯誤

7) INCR key
   增加,同上

8) INCRBY key increment
   同上,不解釋

9) MGET key [key ...]
   返回多個值

10) MSET key value [key value ...]
   同時設置多個key-value的值

11) MSETNX key value [key value ...]
   當有一個key已經存在時,整條命令都不執行

12) SET key value
   不解釋

13) SETEX key seconds value
   設置一個key併爲它設置時間
   等同於下列命令:
   SET mykey value
   EXPIRE mykey seconds

14) SETNX key value
   SET if Not eXists,當key不存在時設置一個新的key
   否則,什麼也不做

15) SETRANGE key offset value
   從已存在key的offeset索引處用value代替以前的值
   版本2.1.8後有效

16) STRLEN key
   不解釋




三 Hashes

Redis的hash是string類型的field和value映射表,添加刪除的時間複雜度是O(1)。適合用來存儲對象,可以減少內存的使用。減少內存使用的原因是新建hash對象時開始使用zipmap來存儲。



1) HDEL key field [field ...]
   刪除hash表(key)中的多個域
   對不存在的域忽略,返回實際刪除的域的個數

2) HEXISTS key field
   hash表(key)中是否存在域field

3) HGET key field
   從hash表中得到域field的值

4) HGETALL key
   返回hash表中的所有域和它對應的值

5) HINCRBY key field increment
   將hash表中指定域增加一個值

6) HKEYS key
   返回所有的域

7) HLEN key
   返回hash表的長度

8) HMGET key field [field ...]
   返回hash表多個域的值

9) HMSET key field value [field value ...]
   同上

10) HSET key field value
   設置一對值

11) HSETNX key field value
   僅當域不存在時設置

12) HVALS key
   返回所有的values





四 Lists

Redis的List類型是使用雙向鏈表存儲的,因此不管是在List的頭還是尾部插入數據,所消耗的時間的是固定的。



1) BLPOP key [key ...] timeout
   Remove and get the first element in a list, or block until one is available
   Lpop的blocking版本,在timeout時間時間內,pop第一個非空的key中的第一個元素(元素連同它所在的key一起返回)
   可以允許key中有空值,它會去找第一個非空的key
   如果都空,blocking發生作用,它會等待直到有一個key經過了lpush或rpush非空


2) BRPOP key [key ...] timeout    
   Remove and get the last element in a list, or block until one is available
   最後一個。同上


3) BRPOPLPUSH source destination timeout
   Pop a value from a list, push it to another list and return it; or block until one is available


4) LINDEX key index
   用索引獲取值(後進列表的索引在前)


5) LINSERT key BEFORE|AFTER pivot value
   將value插入在pivot之前或者之後


6) LLEN key
   不解釋


7) LPOP key
   pop並返回第一個值(索引0的值)


8) LPUSH key value [value ...]
   不解釋


9) LPUSHX key value
   同上一條的區別是,只有當key已經存在並非空時,才push一個value


10) LRANGE key start stop
   返回索引從start到stop的值


11) LREM key count value
   刪除|count|個value,count爲正表示從左往右數,爲負表示從右往左數
   0表示刪除全部值爲value的項
   返回值是實際刪除的個數


12) LSET key index value
   要設置的index範圍必須已存在


13) LTRIM key start stop
   trim一個list,保留start到stop之間的


14) RPOP key
   pop最後一個key


15) RPOPLPUSH source destination
   pop最後一個元素,append到另一個list裏,並返回這個值


16) RPUSH key value [value ...]
   加到列表最後


17) RPUSHX key value
   僅當列表已經非空時,加到列表最後





五 Sets

Redis的SETs是沒有排序的二進制字符串集,換種說法就是字符串的無序集合。因爲它是通過哈希表來實現的,因此它的添加,刪除,查找的時間複雜度都是O(1)。Set除了基本的添加刪除操作之外,還存在集合的取並集,交集,差集。通過這些操作可以輕鬆實現SNS和BLOG的好友推薦,標籤等功能。




1) SADD key member
   如果member已存在,命令失效. 注意是集合,元素不能重複


2) SCARD key
   返回集合中元素的個數


3) SDIFF key [key ...]
   差集,在第一個集合中存在,但在其他集合中都不存在的元素


4) SDIFFSTORE destination key [key ...]
   同上,只是將返回的集合存在集合 destination中


5) SINTER key [key ...]
   交集


6) SINTERSTORE destination key [key ...]
   同上


7) SISMEMBER key member
   是否屬於一個集合


8) SMEMBERS key
   返回集合所有元素


9) SMOVE source destination member
   從一個set裏將元素移動到另一個set裏


10) SPOP key
   pop一個隨進的元素,因爲集合是無序的


11) SRANDMEMBER key
   返回一個隨機的元素


12) SREM key member [member ...]
   移除一個或多個元素
   不在的元素忽略

13) SUNION key [key ...]
   並集

14) SUNIONSTORE destination key [key ...]
   同上





六 Sorted Sets

和set一樣是字符串的集合,不同的是每個元素都會關聯一個double類型的score。實現使用的是skip list和hash table,skip list的實現使用的是雙線鏈表。Score的主要作用是排序,因此 sorted set主要用作索引。



1) ZADD key score member [score] [member]
   增加一個或多個元素,如果該元素已經存在,更新它的socre值
   雖然有序集合有序,但它也是集合,不能重複元素,添加重複元素只會
   更新原有元素的score值


2) ZCARD key
   元素個數


3) ZCOUNT key min max
   SCORE值在min和max之間的元素的個數


4) ZINCRBY key increment member
   給有序集合key裏面的元素member增加increment
   若key不存在,創建一個key
   若member不存在,創建一個member,從0開始增加
   僅當key存在但類型不是有序集合時,出錯


5) ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

   nubberkeys指定要求交集的集合的個數
   將nubberkeys個集合求交集,結果放在集合destination中
   (如果des已存在,覆蓋它)

   參數[WEIGHTS weight [weight ...]]
   指定求交集集合的權重,在計算新的score時使用

   參數[AGGREGATE SUM|MIN|MAX]
   當兩個集合中有同一個名字的元素,但score不同時,指定取哪一個score
   的元素


6) ZRANGE key start stop [WITHSCORES]

   索引start到stop處的元素


7) ZRANGEBYSCORE key min max [WITHSCORES]
   score在min到max之間的元素


8) ZRANK key member
   返回menber的索引(score從低到高升序排列)


9) ZREM key member [member ...]
   不解釋


10) ZREMRANGEBYRANK key start stop
   不解釋


11) ZREMRANGEBYSCORE key min max
   不解釋


12) ZREVRANGE key start stop [WITHSCORES]
返回索引之間的元素


13) ZREVRANGEBYSCORE key max min [WITHSCORES]
同上,返回score區間內的


14) ZREVRANK key member
   同8),score降序


15) ZSCORE key member
   不解釋


16) ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

   求並集,其他同5)求交集


基本KEY操作:

Java代碼  收藏代碼
  1. exits key              //測試指定key是否存在,返回1表示存在,0不存在

  2. del key1 key2 ....keyN //刪除給定key,返回刪除key的數目,0表示給定key都不存在

  3. type key               //返回給定key的value類型。返回 none 表示不存在key,string字符類型,list 鏈表類型 set 無序集合類型...

  4. keys pattern           //返回匹配指定模式的所有key,下面給個例子

  5. randomkey              //返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串

  6. rename oldkey newkey   //原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。可能是oldkey不存在或者和newkey相同

  7. renamenx oldkey newkey //同上,但是如果newkey存在返回失敗

  8. dbsize                 //返回當前數據庫的key數量

  9. expire key seconds     //爲key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在

  10. ttl key                //返回設置過過期時間的key的剩餘過期秒數 -1表示key不存在或者沒有設置過過期時間

  11. select db-index        //通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。返回1表示成功,0失敗

  12. move key db-index      //將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在,或者已經在指定數據庫中

  13. flushdb                //刪除當前數據庫中所有key,此方法不會失敗。慎用

  14. flushall               //刪除所有數據庫中的所有key,此方法不會失敗。更加慎用


String操作

Java代碼  收藏代碼
  1. set key value         //設置key對應的值爲string類型的value,返回1表示成功,0失敗

  2. setnx key value       //同上,如果key已經存在,返回0 。nx 是not exist的意思

  3. get key               //獲取key對應的string值,如果key不存在返回nil

  4. getset key value      //原子的設置key的值,並返回key的舊值。如果key不存在返回nil

  5. mget key1 key2 ... keyN            //一次獲取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗,首先清空當前數據庫,然後設置k1,k2.獲取時k3對應返回nil

  6. mset key1 value1 ... keyN valueN   //一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置

  7. msetnx key1 value1 ... keyN valueN //同上,但是不會覆蓋已經存在的key

  8. incr key              //對key的值做加加操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key爲1

  9. decr key              //同上,但是做的是減減操作,decr一個不存在key,則設置key爲-1

  10. incrby key integer    //同incr,加指定值 ,key不存在時候會設置key,並認爲原來的value是 0

  11. decrby key integer    //同decr,減指定值。decrby完全是爲了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

  12. append key value      //給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子

  13. substr key start end  //返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的,接着上面例子


List操作

Java代碼  收藏代碼
  1. lpush key string          //在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型

  2. rpush key string          //同上,在尾部添加

  3. llen key                  //返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤

  4. lrange key start end      //返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表

  5. ltrim key start end       //截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤

  6. lset key index value      //設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤

  7. lrem key count value      //從key對應list中刪除count個和value相同的元素。count爲0時候刪除全部

  8. lpop key                  //從list的頭部刪除元素,並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤

  9. rpop                      //同上,但是從尾部刪除

  10. blpop key1...keyN timeout //從左到右掃描返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空則對list2做lpop並返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout爲0表示一直阻塞。當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果超時發生,則返回nil。有點像unix的select或者poll

  11. brpop                     //同blpop,一個是從頭部刪除一個是從尾部刪除

  12. rpoplpush srckey destkey  //從srckey對應list的尾部移除元素並添加到destkey對應list的頭部,最後返回被移除的元素值,整個操作是原子的.如果srckey是空或者不存在返回nil


Set操作

Java代碼  收藏代碼
  1. sadd key member                //添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤

  2. srem key member                //從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤

  3. spop key                       //刪除並返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nil

  4. srandmember key                //同spop,隨機取set中的一個元素,但是不刪除元素

  5. smove srckey dstkey member     //從srckey對應set中移除member並添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤

  6. scard key                      //返回set的元素個數,如果set是空或者key不存在返回0

  7. sismember key member           //判斷member是否在set中,存在返回1,0表示不存在或者key不存在

  8. sinter key1 key2...keyN        //返回所有給定key的交集

  9. sinterstore dstkey key1...keyN //同sinter,但是會同時將交集存到dstkey下

  10. sunion key1 key2...keyN        //返回所有給定key的並集

  11. sunionstore dstkey key1...keyN //同sunion,並同時保存並集到dstkey下

  12. sdiff key1 key2...keyN         //返回所有給定key的差集

  13. sdiffstore dstkey key1...keyN  //同sdiff,並同時保存差集到dstkey下

  14. smembers key                   //返回key對應set的所有元素,結果是無序的


SortedSet操作

Java代碼  收藏代碼
  1. zadd key score member        //添加元素到集合,元素在集合中存在則更新對應score

  2. zrem key member              //刪除指定元素,1表示成功,如果元素不存在返回0

  3. zincrby key incr member      //增加對應member的score值,然後移動元素並保持skip list保持有序。返回更新後的score值

  4. zrank key member             //返回指定元素在集合中的排名(下標),集合中元素是按score從小到大排序的

  5. zrevrank key member          //同上,但是集合中元素是按score從大到小排序

  6. zrange key start end         //類似lrange操作從集合中去指定區間的元素。返回的是有序結果

  7. zrevrange key start end      //同上,返回結果是按score逆序的

  8. zrangebyscore key min max    //返回集合中score在給定區間的元素

  9. zcount key min max           //返回集合中score在給定區間的數量

  10. zcard key                    //返回集合中元素個數

  11. zscore key element           //返回給定元素對應的score

  12. zremrangebyrank key min max  //刪除集合中排名在給定區間的元素

  13. zremrangebyscore key min max //刪除集合中score在給定區間的元素


Hash操作

Java代碼  收藏代碼
  1. hset key field value       //設置hash field爲指定值,如果key不存在,則先創建

  2. hget key field             //獲取指定的hash field

  3. hmget key filed1....fieldN //獲取全部指定的hash filed

  4. hmset key filed1 value1 ... filedN valueN //同時設置hash的多個field

  5. hincrby key field integer  //將指定的hash filed 加上給定值

  6. hexists key field          //測試指定field是否存在

  7. hdel key field             //刪除指定的hash field

  8. hlen key                   //返回指定hash的field數量

  9. hkeys key                  //返回hash的所有field

  10. hvals key                  //返回hash的所有value

  11. hgetall                    //返回hash的所有filed和value



轉載初處:keshion.iteye.com/blog/1294851

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章