Redis基礎(chǔ)(1)——數(shù)據(jù)類型

五種基本類型及其用法


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à)格。


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2353159-f9b9c793aecde868.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


**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

  1. "BMW"

  2. "black"

127.0.0.1:6379> HMSET car:2 name audi color white

OK

127.0.0.1:6379> HMGET car:2 name color

  1. "audi"

  2. "white"

127.0.0.1:6379> HGETALL car

(empty list or set)

127.0.0.1:6379> HGETALL car:1

  1. "name" //字段名

  2. "BMW" //字段值

  3. "color" //字段名

  4. "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

  1. "name"

  2. "color"

127.0.0.1:6379> HVALS car:1

  1. "BMW"

  2. "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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容