Redis入門教程(二)— 基本數據類型

閱讀如下內容時,手邊打開一個redis-cli一塊兒輸入,輸入命令敲擊回車鍵前在心中想好你的答案,若是結果不合你的預期,請分析緣由,使極大地提升學習效率。若是沒有條件,每一個數據類型後有代碼運行結果,供你參考。java

Reids做爲一個key-value型存儲系統,下面咱們就分別從key和value提及:redis

key數據庫

key支持非二進制安全的字符類型(not binary-safe strings)。它不支持空格和換行等,key的命名通常建議使用object-type:id:field,即對象類型 :對象ID:對象屬性方式。安全

對於key的命名,不要太長,佔內存,致使查詢慢;不要過短,顯然car:1:color比c:1:c的可讀性高太多app

key的相關操做dom

  • KEYS pattern 返回匹配指定模式的全部key列表( ? :匹配一個字符 * : 匹配任意個字符 [a-z] : 匹配括號中的任一字符 \x : 轉義字符 ) 如:keys *
  • EXISTS key 判斷鍵是否存在,存在返回1,不然返回0 如:exists car
  • DEL key [key2 ...] 刪除鍵,能夠刪除一個或者多個,返回值是刪除的鍵的個數 如:del car
  • TYPE key 獲取鍵值的數據類型 如:type car
  • RANDOMKEY 隨機返回當前數據庫中的一個key,若是數據庫爲空,返回空串 如:randomkey
  • RENAME oldkey newkey 從新命名一個key,若是newkey存在,將會被覆蓋,成功返回1,不然返回0。失敗多是oldkey不存在或者與newkey相同 如:rename car train
  • RENAMENX oldkey newkey 功能同上,若是newkey存在,返回失敗 如:renamenx car train
  • DBSIZE 返回當前數據庫的key數量 如:dbsize
  • EXPIRE key seconds 爲key指定過時時間,單位秒。成功返回1,不然返回0。0表示key已經設置過時或者不存在 如:expire train 60
  • TTL key 返回key剩餘過時時間,單位秒。返回-1表示key不存在或者沒有設置過時時間 如:ttl train
  • MOVE key db_index 將key從當前數據庫移動到指定數據庫。成功返回1,不然返回0。0表示key不存在或者已經在指定數據庫中 如:move key 1
  • FLUSHDB 刪除當前數據庫中的全部key,此方法不會失敗,慎用 如:flushdb
  • FLUSHALL 刪除全部數據庫中的全部key,此方法不會失敗,慎用 如:flushall

Value學習

Redis有這豐富的數據類型,包括Strings,Hashes,Lists,Sets和Ordered Sets日誌

1. 字符串 Stringscode

字符串類型是Redis中最基本的數據類型,它能夠存儲任何形式的字符串,包括二進制數據。能夠用它存儲用戶的郵箱、JSON話的對象甚至是一張圖片。一個字符串類型鍵容許存儲的數據最大容量是512MB。對象

字符串類型是其餘4中數據類型的基礎,其餘數據類型和字符串類型的差異從某種角度來講只是組織字符串的形式不一樣。

  • SET key value 設置指定key的值 如:set age 101
  • SETNX key value 設置指定key的值(只在可key不存在時) 如:setnx price 101
  • GET key 獲取指定key的值 如:get age
  • GETRANGE key start end 返回key中字符串值得子字符(與java不一樣,包含end) 如:getrange age 0 1
  • GETSET key value 將給定key的值設爲value並返回key的舊值 如:getset age 12
  • MSET key value [key value...] 同時設置一個或多個key-value對 如:mset age1 1 age2 2
  • MGET key [key2 ...] 獲取全部給定key的值 如:mget age1 age2
  • SETEX key seconds value 將值value關聯到key,並將key的過時時間設爲seconds秒 如:setex age3 60 3
  • STRLEN key 返回key所儲存的字符串值的長度 如:strlen age
  • INCR key 將key中儲存的數字值增一 如:incr age
  • INCRBY key increment 將key所儲存的值加上給定的增量值 如:incrby age 12
  • INCRBYFLOAT key increment 將key所儲存的值加上給定的浮點值 如:incrbyfloat price 12.4
  • DECR key 將key中儲存的數字值減一,等同於incrby key -1 如:decr age
  • DECRBY key decrement 將key所儲存的值減去指定的值 如:decrby age 12
  • APPEND key value 若是key存在,在其末尾追加value 如:append age years
127.0.0.1:6379> set age 101
OK
127.0.0.1:6379> setnx price 101
(integer) 1
127.0.0.1:6379> get age
"101"
127.0.0.1:6379> getrange age 0 1
"10"
127.0.0.1:6379> getset age 12
"101"
127.0.0.1:6379> mset age1 1 age2 2
OK
127.0.0.1:6379> mget age1 age2
1) "1"
2) "2"
127.0.0.1:6379> setex age3 60 3
OK
127.0.0.1:6379> strlen age
(integer) 2
127.0.0.1:6379> incr age
(integer) 13
127.0.0.1:6379> incrby age 12
(integer) 25
127.0.0.1:6379> incrbyfloat price 12.4
"113.4"
127.0.0.1:6379> decr age
(integer) 24
127.0.0.1:6379> decrby age 12
(integer) 12
127.0.0.1:6379> append age years
(integer) 7

2. 哈希 Hashes

哈希類型是一個String類型的字段(field)和字段值(value)的映射表,字段值只能是字符串,換句話說,散列類型不能嵌套其餘的數據類型,每一個hash能夠存儲2^32-1鍵值對(40多億)。

提示:除了散列類型,Redis的其餘數據類型一樣不支持數據類型嵌套。好比集合類型的每一個元素都只能是字符串,不能是另外一個集合或散列表等。

散列類型適合存儲對象:使用對象類別和ID構成鍵名,使用字段表示對象的屬性,而字段值則存儲屬性值。例如要存儲ID爲2的汽車對象,能夠分別使用名爲color、name和price的3個字段存儲該汽車的顏色、名稱和價格:

hset car price 500
hset car name BMW
hset car color red
  • HSET key field value 將哈希表key中的字段field的值設爲value 如:hset student name zhangsan
  • HSETNX key field value 只有在字段field不存在時,設置哈希表字段的值 如:hsetnx student age 12
  • HMSET key field1 value1 [field2 value2 ...] 同時將多個 field-value (域-值)對設置到哈希表 key 中 如:hmset student sex boy address beijing
  • HGET key field 獲取存儲在哈希表中指定字段的值 如:hget student name
  • HMGET key filed1 [field2...] 獲取全部給定字段的值 如:hmget student name age
  • HGETALL key 獲取在哈希表中指定 key 的全部字段和值 如:hgetall student
  • HEXISTS key field 查看哈希表 key 中,指定的字段是否存在 如:hexists student name
  • HINCRBY key field increment 爲哈希表 key 中的指定字段的整數值加上增量 increment 如:hincrby student age 1
  • HINCRBYFLOAT key field increment 爲哈希表 key 中的指定字段的浮點數值加上增量 increment 如:hincrbyfloat student age 1.2
  • HDEL key field1 [field2...] 刪除一個或多個哈希表字段 如:hdel student age address
  • HVALS key 獲取哈希表中全部值 如:hvals student
  • HKEYS key 獲取全部哈希表中的字段 如:hkeys student
  • HLEN key 獲取哈希表中字段的數量 如:hlen student
127.0.0.1:6379> hset student name zhangsan
(integer) 1
127.0.0.1:6379> hsetnx student age 12
(integer) 1
127.0.0.1:6379> hmset student sex boy address beijing
OK
127.0.0.1:6379> hget student name
"zhangsan"
127.0.0.1:6379> hmget student name age
1) "zhangsan"
2) "12"
127.0.0.1:6379> hgetall student
1) "name"
2) "zhangsan"
3) "age"
4) "12"
5) "sex"
6) "boy"
7) "address"
8) "beijing"
127.0.0.1:6379> hexists student name
(integer) 1
127.0.0.1:6379> hincrby student age 1
(integer) 13
127.0.0.1:6379> hincrbyfloat student age 1.2
"14.2"
127.0.0.1:6379> hdel student age address
(integer) 2
127.0.0.1:6379> hvals student
1) "zhangsan"
2) "boy"
127.0.0.1:6379> hkeys student
1) "name"
2) "sex"
127.0.0.1:6379> hlen student
(integer) 2

3. 列表 List

列表類型(List)能夠存儲一個有序的字符串列表,常見的操做有向列表兩端添加元素,或者獲取列表的某一個片斷。

其內部使用雙向鏈表實現,因此向列表兩端添加元素、取元素的時間複雜度爲O(1),獲取越接近兩端的元素速度越快;使用鏈表的代價是經過索引訪問元素比較慢,設想在IPhone發售當天有1000我的在排隊,蘋果公司打算給第486位顧客免費贈送一部,工做人員不得不一個一個數到第486我的。若是是新來的人想加入隊伍,直接排到隊尾就能夠。

  • LPUSH key value1 [value2...] 將一個或多個值插入到列表頭部 如:lpush student xiaoli xiaowang xiaoliu xiaozhang
  • RPUSH key value1 [value2...] 在列表尾部中添加一個或多個值 如:rpush student zhangsan lisi wangwu
  • LPUSHX key value 將一個值插入到已存在的列表頭部 如:lpushx student xiaoming
  • RPUSHX key value 將一個值插入到已存在的列表尾部 如:rpushx student maliu
  • LPOP key 移出並獲取列表的第一個元素 如:lpop student
  • RPOP key 移出並獲取列表的最後一個元素 如:rpop student
  • LINDEX key index 經過索引獲取列表中的元素(從0開始) 如:lindex student 0
  • LINSERT key before|after pivot value 在列表的元素前或者後插入元素 如:linsert student before xiaozhang zhangsan
  • LLEN key 獲取列表長度 如:llen student
  • LRANGE key start stop 獲取列表指定範圍內的元素 如:lrange student 0 4
  • LREM key count value 從key對應list中刪除count個和value相同的元素,count爲0時候刪除所有 如:lrem student 2 zhangsan
  • LSET key index value 設置list中指定下標的元素值 如:lset student 2 xiaolei
  • LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除 如:ltrim student 0 3
  • BLPOP key1 [key2...] timeout 從頭部非空list進行lpop操做並返回,就是說,blpop list1 list2 list3,若是list1不存在,list二、list3都是非空則對list2進行lpop操做並返回。若是全部的list都是空或不存在,則會阻塞timeout秒,timeout爲0表示一直阻塞;當阻塞時,若是有client對key1...keyN中的任意key進行push操做,則第一在這個key上被阻塞的client會當即返回。若是超時發生,則返回nil
  • BRPOP key1 [key2...] timeout 同blpop,brpop是從尾部開始執行
  • RPOPLPUSH source destination 從詞面意思能夠看出先作rpop,再作lpush。它的做用是從source對應list的尾部移除元素並添加到destination對應list的頭部,最後返回被移除的元素值,整個操做是原子的。若是source 是空或者不存在則返回nil
  • BRPOPLPUSH source destination timeout 從列表尾部中彈出一個值,將彈出的元素插入到另一個列表中並返回它; 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止
127.0.0.1:6379> lpush student xiaoli xiaowang xiaoliu xiaozhang
(integer) 4
127.0.0.1:6379> rpush student zhangsan lisi wangwu
(integer) 7
127.0.0.1:6379> lpushx student xiaoming
(integer) 8
127.0.0.1:6379> rpushx student maliu
(integer) 9
127.0.0.1:6379> lpop student
"xiaoming"
127.0.0.1:6379> rpop student
"maliu"
127.0.0.1:6379> lindex student 0
"xiaozhang"
127.0.0.1:6379> linsert student before xiaozhang zhangsan
(integer) 8
127.0.0.1:6379> llen student
(integer) 8
127.0.0.1:6379> lrange student 0 4
1) "zhangsan"
2) "xiaozhang"
3) "xiaoliu"
4) "xiaowang"
5) "xiaoli"
127.0.0.1:6379> lrem student 2 zhangsan
(integer) 2
127.0.0.1:6379> lset student 2 xiaolei
OK
127.0.0.1:6379> ltrim student 0 3
OK
127.0.0.1:6379> lrange student 0 3
1) "xiaozhang"
2) "xiaoliu"
3) "xiaolei"
4) "xiaoli"

4. 集合 Set

集合的概念高中數學中就已經學過,集合中的每個元素都是不一樣的,且沒有順序。一個集合類型(Set)鍵能夠存儲至多2^32-1個字符串。

集合類型的經常使用操做是向集合中加入或刪除元素、判斷某個元素是否存在等,因爲集合類型在Redis內部是使用值爲空的散列表(hash table)實現的,因此這些操做的時間複雜度都是O(1)。最方便的是多個集合類型鍵之間還能夠進行交集、並集和差集運算。

  • SADD key member [member2...] 向集合添加一個或多個成員 如:sadd student zhangsan lisi ,sadd monitor wangwu zhangsan
  • SCARD key 獲取集合的成員數 如:scard student
  • SMEMBERS key 返回集合中的全部成員 如:smembers student
  • SREM key member [member2...] 移除集合中一個或多個成員 如:srem student lisi
  • SISMEMBER key member 判斷 member 元素是不是集合 key 的成員 如:sismember student zhangsan
  • SINTER key1 [key2...] 返回給定全部集合的交集 如:sinter student monitor
  • SINTERSTORE destination key1 [key2...] 返回給定全部集合的差集並存儲在 destination 集合中 如:sinterstore sinter student monitor
  • SUNION key1 [key2...] 返回給定全部集合的並集 如:sunion student monitor
  • SUNIONSTORE destination key1 [key2...] 全部給定集合的並集存儲在 destination 集合中 如:sunionstore sunion student monitor
  • SDIFF key1 [key2...] 返回給定全部集合的差集 如:sdiff monitor student
  • SDIFFSTORE destination key1 [key2...] 返回給定全部集合的差集並存儲在 destination 集合中 如:sdiffstore sdiff monitor student
  • SRANDMEMBER key [count] 隨機返回key集合中count個成員 如:srandmember sunion 2
  • SPOP key 移除並返回集合中的一個隨機元素 如:spop sunion
  • SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 如:smove monitor student wangwu
127.0.0.1:6379> sadd student zhangsan lisi
(integer) 2
127.0.0.1:6379> sadd monitor wangwu zhangsan
(integer) 2
127.0.0.1:6379> scard student
(integer) 2
127.0.0.1:6379> smembers student
1) "zhangsan"
2) "lisi"
127.0.0.1:6379> srem student lisi
(integer) 1
127.0.0.1:6379> sismember student zhangsan
(integer) 1
127.0.0.1:6379> sinter student monitor
1) "zhangsan"
127.0.0.1:6379> sinterstore sinter student monitor
(integer) 1
127.0.0.1:6379> sunion student monitor
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> sunionstore sunion student monitor
(integer) 2
127.0.0.1:6379> sdiff monitor student
1) "wangwu"
127.0.0.1:6379> sdiffstore sdiff monitor student
(integer) 1
127.0.0.1:6379> srandmember sunion 2
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> spop sunion
"zhangsan"
127.0.0.1:6379> smove monitor student wangwu
(integer) 1

5. 有序集合 Sorted Set

有序集合與集合的區別在於「有序」二字,不只能夠完成插入、刪除和判斷元素是否存在等集合類型支持的操做,並且還能有序的獲取前N個元素。

有序集合類型在某些方面和列表類型有些類似。

  • 兩者都是有序的。
  • 兩者均可以得到某一範圍的元素。

可是兩者有着很大的區別,這使得它們的應用場景也是不一樣的。

  • 列表類型是經過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,因此它更加適合實現如「新鮮事」或「日誌」這樣不多訪問中間元素的應用。
  • 有序集合類型是使用散列表和跳躍表(Skip list)實現的,因此即便讀取位於中間部分的數據速度也很快(時間複雜度是O(log(N))) 。
  • 有序集合要比列表類型更耗費內存

有序集合類型算得上是Redis的5種數據類型中最高級的類型了,在學習時能夠與列表類型和集合類型對照理解。

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數 如:添加成員 zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu 更新分數 zadd score 100 zhangsan
  • ZSCORE key member 返回有序集中,成員的分數值 如:zscore score zhangsan
  • ZRANGE key start stop [WITHSCORES] 按照成員分數從小到大的順序返回索引從start到stop之間的全部成員值。索引從0開始,-1表示最後一個元素。若是須要同時返回分數,在後面加上WITHSCORES。 如:zrange score 0 -1 withscores
  • ZREVRANGE key start stop [WITHSCORES] 與ZRANGE惟一的不一樣是按照成員分數從大到小的順序返回。 如:zrevrange score 0 -1 withscores
  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] 按照成員分數從小到大的順序返回分數值從min到max之間的全部成員值。若是不想包含端點值,能夠在分數前加上(;min和max還支持無窮大,-inf和+inf分別表明負無窮和正無窮。LIMIT offset count中,offset表示從第一個元素開始偏移的位數,count表示輸出的數量。 如:zrangebyscore score 50 (80 limit 1 2
  • ZREVRANGEBYSCORE key max min [WITHSCORES] 與ZRANGEBYSCORE惟一的不一樣是按照成員分數從大到小的順序返回。 如:zrevrangebyscore score 80 50
  • ZRANGEBYLEX key min max [LIMIT offset count] 按照字典順序區間返回有序集合的成員
  • ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment 如:zincrby score 5 lisi
  • ZCARD key 獲取有序集合的成員數 如:zcard score
  • ZCOUNT key min max 計算在有序集合中指定區間分數的成員數 如:zcount score 50 100
  • ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量
  • ZREM key member [member...] 移除有序集合中的一個或多個成員 如:zrem score wangwu
  • ZREMRANGEBYRANK key start stop 按照元素分數從小到大的順序(索引0表示最小的值)刪除處在指定索引範圍內的全部元素,並返回刪除的元素數量 如:zremrangebyrank score 0 1
  • ZREMRANGEBYSCORE key min max 按照元素分數從小到大的順序(索引0表示最小的值)刪除處在指定分數範圍內的全部元素,並返回刪除的元素數量 如:zremrangebyscore score 90 100
  • ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的全部成員
  • ZRANK key member 返回有序集合中指定成員的索引 如:zrank score xiaoliu
  • ZREVRANK key member 與ZRANK惟一的不一樣是按照成員分數從大到小的順序返回指定的索引 如:zrevrank score xiaoliu
127.0.0.1:6379> zadd score 50 zhangsan 60 lisi 70 wangwu 80 zhaoliu 90 yangqi 120 xiaoming 130 xiaozhang 140 xiaoli 150 xiaoliu
(integer) 9
127.0.0.1:6379> zadd score 100 zhangsan
(integer) 0
127.0.0.1:6379> zscore score zhangsan
"100"
127.0.0.1:6379> zrange score 0 -1 withscores
 1) "lisi"
 2) "60"
 3) "wangwu"
 4) "70"
 5) "zhaoliu"
 6) "80"
 7) "yangqi"
 8) "90"
 9) "zhangsan"
10) "100"
11) "xiaoming"
12) "120"
13) "xiaozhang"
14) "130"
15) "xiaoli"
16) "140"
17) "xiaoliu"
18) "150"
127.0.0.1:6379> zrevrange score 0 -1 withscores
 1) "xiaoliu"
 2) "150"
 3) "xiaoli"
 4) "140"
 5) "xiaozhang"
 6) "130"
 7) "xiaoming"
 8) "120"
 9) "zhangsan"
10) "100"
11) "yangqi"
12) "90"
13) "zhaoliu"
14) "80"
15) "wangwu"
16) "70"
17) "lisi"
18) "60"
127.0.0.1:6379> zrangebyscore score 50 (80 limit 1 2
1) "wangwu"
127.0.0.1:6379> zrevrangebyscore score 80 50
1) "zhaoliu"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zincrby score 5 lisi
"65"
127.0.0.1:6379> zcard score
(integer) 9
127.0.0.1:6379> zcount score 50 100
(integer) 5
127.0.0.1:6379> zrem score wangwu
(integer) 1
127.0.0.1:6379> zremrangebyrank score 0 1
(integer) 2
127.0.0.1:6379> zremrangebyscore score 90 100
(integer) 2
127.0.0.1:6379> zrank score xiaoliu
(integer) 3
127.0.0.1:6379> zrevrank score xiaoliu
(integer) 0
相關文章
相關標籤/搜索