五種基本類型及其用法
STRING類型
獲得符合規(guī)則的鍵名列表
KEYS pattern
pattern可以以glob通配符的形式出現(xiàn)
| 符號(hào) | 含義 |
|---|---|
| ? |匹配一個(gè)字符
|| * |匹配任意個(gè)字符|
| [] |匹配括號(hào)見的任意字符,可以用-來表示一個(gè)范圍,如a[b-d]可以匹配ab,ac,ad|
| \x |匹配字符x,用于轉(zhuǎn)意,若需要匹配?則使用 \?|
EXISTS key
如果key存在則返回整數(shù)類型的1,否則返回0
DEL key [key ...]
可以刪除一個(gè)或者多個(gè)key,返回值是刪除key的個(gè)數(shù)
TYPE key
用來獲取key值的數(shù)據(jù)類型字符串類型是redis中最基本的數(shù)據(jù)類型,他可以儲(chǔ)存任何形式的字符串,包括二進(jìn)制字符,因?yàn)樗嵌M(jìn)制安全的。你可以用string類型來存儲(chǔ)郵箱、對(duì)象乃至圖片,允許存儲(chǔ)的數(shù)據(jù)最大容量是512MB,是其他4種數(shù)據(jù)類型的基礎(chǔ)。
賦值和取值
賦值:為key賦值valueSET key value
取值:獲取key的值GET key
遞增數(shù)字
key的值加 1
INCR key
key的值加 3
INCRBY key 3
key的值減 1
DECR key
key的值減 2
DECRBY key 2
key的值加 2.1
INCRBYFLOAT 2.1
INCR以及INCRBY只適用于INT類型的操作,即key的值為整數(shù),遞增的量也是整數(shù)。下例會(huì)報(bào)錯(cuò):
127.0.0.1:6379> set foo 2.1
OK
127.0.0.1:6379> INCR foo
(error) ERR value is not an integer or out of range
127.0.0.1:6379> INCRBYFLOAT foo 2.1
"4.2"
向尾部追加值
APPEND key value
用法示例:
127.0.0.1:6379> SET hi hello
OK
127.0.0.1:6379> APPEND hi " world !"
(integer) 13
127.0.0.1:6379> GET hi"hello world !"http://若字符串中含有空格,則需要加引號(hào)
獲取字符串長(zhǎng)度
STRLEN key //返回key的值的長(zhǎng)度,如果key不存在則返回0
同時(shí)獲得/設(shè)置對(duì)個(gè)鍵值
MSET key1 value1 key2 value2 key3 value3 ...
//同時(shí)設(shè)置多個(gè)鍵值
MGET key1 key2 key3 ...
//同時(shí)獲取多個(gè)鍵值
127.0.0.1:6379> MSET key1 1 key2 2 key3 3
OK127.0.0.1:6379> MGET key1 key2 key3
1) "1"
2) "2"
3) "3"
位操作
GETBIT key offset
// 獲取key offset位置的值 offset從左往右計(jì)算,從0開始
SETBIT key offset value
// 將key offset位置的值設(shè)置為value,value只能為0/1
BITCOUNT key [start] [end]
// 獲取key中值為1的位數(shù)
BITOP operation result key1 [key2 ...]
// 對(duì)key1 key2 進(jìn)行operation位運(yùn)算,結(jié)果存放于result
BITPOS key value [start] [end]
// start end之間首次出現(xiàn)value的位置```
---
#### 散列類型(HASH)
散列類型適合存儲(chǔ)對(duì)象:使用對(duì)象類別和ID構(gòu)成鍵名,使用字段表示對(duì)象的屬性,而字段值則儲(chǔ)存屬性值。例如存儲(chǔ)ID為2的汽車對(duì)象,可以分別使用名為color、name和price三個(gè)字段來存儲(chǔ)汽車的顏色、名稱和價(jià)格。

**redis可以單獨(dú)的為任何鍵自由的增減字段而不影響其他鍵。**
##### 取值和賦值
HSET key field value
// 賦值
HGET key field
// 取值
HMSET key field value [field value ...]
// 設(shè)置某個(gè)值的多個(gè)字段
HMGET key field [field ...]// 獲取某個(gè)值的多個(gè)字段
HGETALL key
// 獲取某個(gè)值的全部字段
127.0.0.1:6379> HSET car:1 name BMW
(integer) 1
127.0.0.1:6379> HSET car:1 color black
(integer) 1
127.0.0.1:6379> HGET car:1 name
"BMW"
127.0.0.1:6379> HGET car:1 color
"black"
127.0.0.1:6379> HMGET car:1 name color
"BMW"
"black"
127.0.0.1:6379> HMSET car:2 name audi color white
OK
127.0.0.1:6379> HMGET car:2 name color
"audi"
"white"
127.0.0.1:6379> HGETALL car
(empty list or set)
127.0.0.1:6379> HGETALL car:1
"name" //字段名
"BMW" //字段值
"color" //字段名
"black" //字段值
##### 判斷字段是否存在
HEXISTS key field
// 判斷key中的field是否存在,存在返回1,不存在返回0
##### 當(dāng)字段不存在的時(shí)候賦值
HSETNX key field value
//當(dāng)field字段不存在時(shí)再進(jìn)行賦值
127.0.0.1:6379> HEXISTS car:1 name
(integer) 1
127.0.0.1:6379> HEXISTS car:1 value
(integer) 0
127.0.0.1:6379> HSETNX car:1 value 900000
(integer) 1 //賦值成功返回1
127.0.0.1:6379> HSETNX car:1 value 900000
(integer) 0 //賦值失敗返回0
##### 增加數(shù)字
HINCRBY key field increment
// 將key的field字段值增加increment
127.0.0.1:6379> HGET car:1 amount
"20"
127.0.0.1:6379> HINCRBY car:1 amount 5
(integer) 25
##### 刪除字段
HDEL key field [field]
// 刪除一個(gè)或者多個(gè)字段,返回值是被刪除字段的個(gè)數(shù)
127.0.0.1:6379> HDEL car:1 value amount(integer) 2
##### 只獲取字段名 或 字段值
HKEYS key
// 只獲取key中所有的字段名而不需要字段的值
HVALS key
// 只獲取key中所有的字段值而不需要字段名
127.0.0.1:6379> HKEYS car:1
"name"
"color"
127.0.0.1:6379> HVALS car:1
"BMW"
"black"
##### 獲得字段數(shù)量
```HLEN key
// 獲取field的數(shù)量
列表類型
向列表兩端添加元素
LPUSH key value1 [value2 ...]
// 向列表左端添加元素,按照value的順序,從左往右依次添加
// 最終 value2在value1的左邊 ......
RPUSH key value1 [value2 ...]
// 向列表右端添加元素,最終value1在value2的左邊
從列表兩端彈出元素
LPOP key
// 從列表左端彈出
RPOP key
// 從列表右端彈出
獲取列表中元素個(gè)數(shù)
LLEN key
// 獲取key中元素的個(gè)數(shù),若key不存在返回0
獲得列表的片段
LRANGE key start stop
// 獲取索引從start到stop之間的所有元素
LRANGE 命令在獲取列表片段時(shí)并不會(huì)像LPOP一樣刪除該片段,另外LRANGE命令取出的片段包含索引在start和stop位置的元素,同時(shí)LRANGE支持負(fù)索引,表示從右邊開始計(jì)算序數(shù),“-1”表示最右邊的元素,-2 表示右數(shù)第二個(gè)元素,以此類推……所以,若想獲取所有元素 請(qǐng)用命令: LRANGE key 0 -1 。如果stop過大,則會(huì)返回到列表最右邊的元素;如果stop
- 當(dāng)count>0,LREM會(huì)從列表左邊開始刪除前count個(gè)值為value的元素;
- 當(dāng)count<0,LREM會(huì)從列表右邊開始刪除前|count|個(gè)值為value的元素;
- 當(dāng)count=0,LREM會(huì)刪除所有值為value的元素。
++列表示例++
127.0.0.1:6379> LPUSH numbers 1 //1
(integer) 1
127.0.0.1:6379> LPUSH numbers 2 3 // 3 2 1
(integer) 3
127.0.0.1:6379> RPUSH numbers 0 -1 // 3 2 1 0 -1
(integer) 5
127.0.0.1:6379> LPOP numbers // 2 1 0 -1
"3"
127.0.0.1:6379> RPOP numbers // 2 1 0
"-1"
127.0.0.1:6379> LLEN numbers // 2 1 0
(integer) 3
127.0.0.1:6379> LRANGE numbers 0 2 //2 1 0
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LRANGE numbers -2 -1
1) "1"
2) "0"
127.0.0.1:6379> LRANGE numbers 0 -1
1) "2"
2) "1"
3) "0"
127.0.0.1:6379> LREM numbers 1 0 // 2 1
(integer) 1
獲取/設(shè)置指定索引的元素值
LINDEX key index
// 獲取索引為index的元素值
LSET key index value
// 設(shè)置索引位置為index的元素值為value
// 若index為負(fù)數(shù),則為從右開始計(jì)算
只保留指定列表片段
LTRIM key start end
// 只保留列表start和end(start和end位置也會(huì)保留)之間的片段
向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
// 先會(huì)在列表中從左到右查找值為pivot的元素
// 然后根據(jù)第二個(gè)參數(shù)是before還是after來決定將value插入前邊還是后邊
將元素從一個(gè)列表轉(zhuǎn)移到另一個(gè)列表
RPOPLPUSH source destination
// 先從source中RPOP出一個(gè)元素,再把這個(gè)元素LPUSH到destination中
++列表示例++
127.0.0.1:6379> LRANGE numbers 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
9) "0"
10) "-1"
11) "-2"
12) "-3"
13) "-4"
14) "-5"
127.0.0.1:6379> LINDEX numbers 5
"3"
127.0.0.1:6379> LSET numbers 5 0
OK
127.0.0.1:6379> LINDEX numbers 5
"0"
127.0.0.1:6379> LTRIM numbers 3 10
OK
127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "0"
4) "2"
5) "1"
6) "0"
7) "-1"
8) "-2"
127.0.0.1:6379> LINSERT numbers AFTER 0 3
(integer) 9
127.0.0.1:6379> LRANGE numbers 0 -1
1) "5"
2) "4"
3) "0"
4) "3"
5) "2"
6) "1"
7) "0"
8) "-1"
9) "-2"
127.0.0.1:6379> LINSERT numbers BEFORE 5 6
(integer) 10
127.0.0.1:6379> LRANGE numbers 0 -1
1) "6"
2) "5"
3) "4"
4) "0"
5) "3"
6) "2"
7) "1"
8) "0"
9) "-1"
10) "-2"
127.0.0.1:6379> RPOPLPUSH numbers another
"-2"
127.0.0.1:6379>
127.0.0.1:6379> LRANGE numbers 0 -1
1) "6"
2) "5"
3) "4"
4) "0"
5) "3"
6) "2"
7) "1"
8) "0"
9) "-1"
127.0.0.1:6379> LRANGE another 0 -1
1) "-2"
127.0.0.1:6379> RPOPLPUSH numbers another
"-1"
127.0.0.1:6379> LRANGE another 0 -1
1) "-1"
2) "-2"
集合類型
集合類型常用的操作是向集合中加入或者刪除元素、判斷某個(gè)元素是否存在等,由于集合類型在redis內(nèi)部是使用值為空的散列表(hash table)實(shí)現(xiàn)的,所以這些操作的時(shí)間復(fù)雜度都是O(1).更方便的是還可以將多個(gè)集合進(jìn)行并集、交集、差集運(yùn)算。
||集合類型|列表類型|
|---|---|---|
|存儲(chǔ)內(nèi)容|至多232-1個(gè)字符串|至多232-1個(gè)字符串|
|有序性|否|是|
|唯一性|是|否|
增加/刪除元素
SADD key member1 [member2 ...]
//向集合中增加一個(gè)或者多個(gè)元素,返回值為成功加入的個(gè)數(shù)
SREM key member1 [member2 ...]
//向集合中刪除一個(gè)或者多個(gè)元素,返回值為刪除成功的個(gè)數(shù)
獲得集合中的所有元素
SMEMBERS key
// 返回集合中的所有元素
判斷元素是否在集合中
SISMEMBER key member
// 判斷一個(gè)元素是否在集合中,時(shí)間復(fù)雜度為O(1)
// 值存在時(shí),返回1,不存在時(shí)返回0
集合間運(yùn)算
SDIFF key1 [key2 ...]
//key1-key2,key1 key2的差集
SINTER key [key ...]
//對(duì)多個(gè)集合求交集
SUNION key [key ...]
//SUNION對(duì)多個(gè)集合求并集
獲取集合中元素個(gè)數(shù)
SCARD key
// 獲取key中的元素個(gè)數(shù)
進(jìn)行集合運(yùn)算并將結(jié)果存儲(chǔ)
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
//進(jìn)行相應(yīng)運(yùn)算,但不直接返回運(yùn)算結(jié)果,而是將結(jié)果存到destination中
隨機(jī)操作
// 隨機(jī)獲得集合中的元素
SRANDMEMBER key [count]
//count 為正數(shù)時(shí),隨機(jī)從集合獲取count個(gè)不重復(fù)的元素
//count為負(fù)數(shù)時(shí),隨機(jī)從集合獲取|count|個(gè)元素,有可能重復(fù)
//從集合中隨機(jī)彈出一個(gè)元素
SPOP key
操作舉例
127.0.0.1:6379> SADD letters a
(integer) 1
127.0.0.1:6379> SADD letters a b c
(integer) 2
127.0.0.1:6379> SREM letters c d
(integer) 1
127.0.0.1:6379> SMEMBERS letters
1) "a"
2) "b"
127.0.0.1:6379> SISMEMBER letters a
(integer) 1
127.0.0.1:6379> SISMEMBER letters c
(integer) 0
127.0.0.1:6379> SADD setA 1 2 3
(integer) 3
127.0.0.1:6379> SADD setB 2 3 4
(integer) 3
127.0.0.1:6379> SDIFF setA setB
1) "1"
127.0.0.1:6379> SINTER setA setB
1) "2"
2) "3"
127.0.0.1:6379> SUNION setA setB
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SCARD letters
(integer) 2
127.0.0.1:6379> SRANDMEMBER letters
"a"
127.0.0.1:6379>
127.0.0.1:6379> SRANDMEMBER letters 2
1) "a"
2) "b"
127.0.0.1:6379> SRANDMEMBER letters 5
1) "a"
2) "b"
127.0.0.1:6379> SRANDMEMBER letters -5
1) "b"
2) "b"
3) "a"
4) "b"
5) "a"
127.0.0.1:6379> SPOP letters
"a"
127.0.0.1:6379> SMEMBERS letters
1) "b"
有序集合類型
有序集合類型為集合中的每一個(gè)元素都關(guān)聯(lián)了分?jǐn)?shù),這使得不僅可以集合類型操作,而且還能輕易的獲得分?jǐn)?shù)最高的(最低的)N個(gè)元素等與分?jǐn)?shù)相關(guān)的操作。雖然集合中元素不同,但是他們的分?jǐn)?shù)卻可以相同。
++有序集合類型和列表類型有些相似++
二者都是有序的,二者都可以獲得某一范圍的元素
++但也有不同的地方++
- 列表類型是基于鏈表實(shí)現(xiàn)的,獲取兩端的數(shù)據(jù)速度極快,但是當(dāng)元素較多時(shí),獲取中間部分的元素的速度會(huì)比較慢。更適合新鮮事,或者日志這樣很少訪問中間元素的應(yīng)用。
- 有序集合類型是使用散列表和跳躍表(skip list)實(shí)現(xiàn)的,所以即使讀取中間位置的數(shù)據(jù)速度也很快(時(shí)間復(fù)雜度:O(log(N)))
- 列表中不能很簡(jiǎn)單的調(diào)整某個(gè)元素的位置,但是有序集合可以(更改分?jǐn)?shù)即可)
- 有序集合更加消耗內(nèi)存
命令
ZADD key score member [score member ...]
// 用來向有序集合加入一個(gè)元素和該元素的分?jǐn)?shù)
// 分?jǐn)?shù)可以是雙精度浮點(diǎn)數(shù)
ZSCORE key member
// 獲取元素的分?jǐn)?shù)
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
// 獲得排名在某個(gè)范圍的元素列表
// ZRANGE 為從小到大,ZREVRANGE為從大到小
// 時(shí)間復(fù)雜度為O(log n+m),n為有序集合的基數(shù),m為返回元素個(gè)數(shù)
// 如果兩元素分?jǐn)?shù)相等,redis會(huì)按照字典順序來排列
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
// 獲得指定分?jǐn)?shù)范圍的元素
ZINCRBY key increment member
// 把member的分?jǐn)?shù)增加increment
ZCARD key
// key中元素的數(shù)量
ZCOUNT key min max
// min和max之間的元素個(gè)數(shù)
ZREM key member [member ...]
// 刪除一個(gè)或多個(gè)元素
// 返回值為成功刪除的數(shù)量
ZREMRANGEBYRANK key start stop
// 刪除排名在start到stop之間的元素
ZREMRANGEBYSCORE key min max
// 刪除指定分?jǐn)?shù)范圍內(nèi)的所有元素
ZRANK key member
ZREVRANK key member
// 獲取member的排名,從小到大/從大到小
/////////////////////
127.0.0.1:6379> ZADD scoreboard 89 Tom 67 Peter 100 David
(integer) 3
127.0.0.1:6379> ZADD scoreboard 76 Peter
(integer) 0
127.0.0.1:6379> ZADD testboard 17E+307 a
(integer) 1
127.0.0.1:6379> ZADD testboard 1.5 b
(integer) 1
127.0.0.1:6379> ZADD testboard +inf c
(integer) 1
127.0.0.1:6379> ZADD testboard -inf d
(integer) 1
127.0.0.1:6379> ZSCORE testboard c
"inf"
127.0.0.1:6379>
127.0.0.1:6379> ZSCORE testboard d
"-inf"
127.0.0.1:6379> ZSCORE scoreboard Tom
"89"
127.0.0.1:6379> ZRANGE scoreboard 0 2
1) "Peter"
2) "Tom"
3) "David"
127.0.0.1:6379> zrevrange scoreboard 0 -1
1) "David"
2) "Tom"
3) "Peter"
127.0.0.1:6379> zrevrange scoreboard 0 -1 withscores
1) "David"
2) "100"
3) "Tom"
4) "89"
5) "Peter"
6) "76"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 100
1) "Tom"
2) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 80 (100
1) "Tom"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf
1) "Tom"
2) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf withscores
1) "Tom"
2) "89"
3) "David"
4) "100"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 1,1
(error) ERR syntax error
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 1 1
1) "David"
127.0.0.1:6379> ZRANGEBYSCORE scoreboard (80 +inf limit 0 1
1) "Tom"
127.0.0.1:6379> ZINCRBY scoreboard 4 Jerry
"4"
127.0.0.1:6379> ZINCRBY scoreboard 4 Jerry
"8"
127.0.0.1:6379> ZINCRBY scoreboard -1 Jerry
"7"
127.0.0.1:6379>
127.0.0.1:6379> ZCARD scoreboard
(integer) 4
127.0.0.1:6379> ZCOUNT scoreboard 90 100
(integer) 1
127.0.0.1:6379> ZCOUNT scoreboard 90 (100
(integer) 0