Redis基礎(1)——數據類型

五種基本類型及其用法


STRING類型

獲得符合規則的鍵名列表
KEYS pattern

pattern可以以glob通配符的形式出現

| 符號 | 含義 |

|---|---|

| ? |匹配一個字符

|| * |匹配任意個字符|

| [] |匹配括號見的任意字符,可以用-來表示一個范圍,如a[b-d]可以匹配ab,ac,ad|

| \x |匹配字符x,用于轉意,若需要匹配?則使用 \?|

EXISTS key

如果key存在則返回整數類型的1,否則返回0

DEL key [key ...]

可以刪除一個或者多個key,返回值是刪除key的個數

TYPE key

用來獲取key值的數據類型字符串類型是redis中最基本的數據類型,他可以儲存任何形式的字符串,包括二進制字符,因為他是二進制安全的。你可以用string類型來存儲郵箱、對象乃至圖片,允許存儲的數據最大容量是512MB,是其他4種數據類型的基礎。

賦值和取值

賦值:為key賦值valueSET key value

取值:獲取key的值GET key

遞增數字

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的值為整數,遞增的量也是整數。下例會報錯:


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://若字符串中含有空格,則需要加引號

獲取字符串長度

STRLEN key //返回key的值的長度,如果key不存在則返回0

同時獲得/設置對個鍵值

MSET key1 value1 key2 value2 key3 value3 ...

//同時設置多個鍵值

MGET key1 key2 key3 ...

//同時獲取多個鍵值

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從左往右計算,從0開始

SETBIT key offset value

// 將key offset位置的值設置為value,value只能為0/1

BITCOUNT key [start] [end]

// 獲取key中值為1的位數

BITOP operation result key1 [key2 ...]

// 對key1 key2 進行operation位運算,結果存放于result

BITPOS key value [start] [end]

// start end之間首次出現value的位置```

---

#### 散列類型(HASH)

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


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


**redis可以單獨的為任何鍵自由的增減字段而不影響其他鍵。**

##### 取值和賦值

HSET key field value

// 賦值

HGET key field

// 取值

HMSET key field value [field value ...]

// 設置某個值的多個字段

HMGET key field [field ...]// 獲取某個值的多個字段

HGETALL key

// 獲取某個值的全部字段

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


##### 當字段不存在的時候賦值

HSETNX key field value

//當field字段不存在時再進行賦值

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


##### 增加數字

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]

// 刪除一個或者多個字段,返回值是被刪除字段的個數

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"


##### 獲得字段數量

```HLEN key

// 獲取field的數量


列表類型

向列表兩端添加元素

LPUSH key value1 [value2 ...]

// 向列表左端添加元素,按照value的順序,從左往右依次添加

// 最終 value2在value1的左邊 ......

RPUSH key value1 [value2 ...]

// 向列表右端添加元素,最終value1在value2的左邊

從列表兩端彈出元素

LPOP key

// 從列表左端彈出

RPOP key

// 從列表右端彈出

獲取列表中元素個數

LLEN key

// 獲取key中元素的個數,若key不存在返回0

獲得列表的片段

LRANGE key start stop

// 獲取索引從start到stop之間的所有元素

LRANGE 命令在獲取列表片段時并不會像LPOP一樣刪除該片段,另外LRANGE命令取出的片段包含索引在start和stop位置的元素,同時LRANGE支持負索引,表示從右邊開始計算序數,“-1”表示最右邊的元素,-2 表示右數第二個元素,以此類推……所以,若想獲取所有元素 請用命令: LRANGE key 0 -1 。如果stop過大,則會返回到列表最右邊的元素;如果stop

  • 當count>0,LREM會從列表左邊開始刪除前count個值為value的元素;
  • 當count<0,LREM會從列表右邊開始刪除前|count|個值為value的元素;
  • 當count=0,LREM會刪除所有值為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

獲取/設置指定索引的元素值

LINDEX key index

// 獲取索引為index的元素值

LSET key index value

// 設置索引位置為index的元素值為value

// 若index為負數,則為從右開始計算

只保留指定列表片段

LTRIM key start end

// 只保留列表start和end(start和end位置也會保留)之間的片段

向列表中插入元素

LINSERT key BEFORE|AFTER pivot value

// 先會在列表中從左到右查找值為pivot的元素

// 然后根據第二個參數是before還是after來決定將value插入前邊還是后邊

將元素從一個列表轉移到另一個列表

RPOPLPUSH source destination

// 先從source中RPOP出一個元素,再把這個元素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"


集合類型

集合類型常用的操作是向集合中加入或者刪除元素、判斷某個元素是否存在等,由于集合類型在redis內部是使用值為空的散列表(hash table)實現的,所以這些操作的時間復雜度都是O(1).更方便的是還可以將多個集合進行并集、交集、差集運算。

||集合類型|列表類型|

|---|---|---|

|存儲內容|至多232-1個字符串|至多232-1個字符串|

|有序性|否|是|

|唯一性|是|否|

增加/刪除元素

SADD key member1 [member2 ...]

//向集合中增加一個或者多個元素,返回值為成功加入的個數

SREM key member1 [member2 ...]

//向集合中刪除一個或者多個元素,返回值為刪除成功的個數

獲得集合中的所有元素

SMEMBERS key

// 返回集合中的所有元素

判斷元素是否在集合中

SISMEMBER key member

// 判斷一個元素是否在集合中,時間復雜度為O(1)

// 值存在時,返回1,不存在時返回0

集合間運算

SDIFF key1 [key2 ...]

//key1-key2,key1 key2的差集

SINTER key [key ...]

//對多個集合求交集

SUNION key [key ...]

//SUNION對多個集合求并集

獲取集合中元素個數

SCARD key

// 獲取key中的元素個數

進行集合運算并將結果存儲

SDIFFSTORE destination key [key ...]

SINTERSTORE destination key [key ...]

SUNIONSTORE destination key [key ...]

//進行相應運算,但不直接返回運算結果,而是將結果存到destination中

隨機操作

// 隨機獲得集合中的元素

SRANDMEMBER key [count]

//count 為正數時,隨機從集合獲取count個不重復的元素

//count為負數時,隨機從集合獲取|count|個元素,有可能重復

//從集合中隨機彈出一個元素

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"


有序集合類型

有序集合類型為集合中的每一個元素都關聯了分數,這使得不僅可以集合類型操作,而且還能輕易的獲得分數最高的(最低的)N個元素等與分數相關的操作。雖然集合中元素不同,但是他們的分數卻可以相同。

++有序集合類型和列表類型有些相似++

二者都是有序的,二者都可以獲得某一范圍的元素

++但也有不同的地方++

  • 列表類型是基于鏈表實現的,獲取兩端的數據速度極快,但是當元素較多時,獲取中間部分的元素的速度會比較慢。更適合新鮮事,或者日志這樣很少訪問中間元素的應用。
  • 有序集合類型是使用散列表和跳躍表(skip list)實現的,所以即使讀取中間位置的數據速度也很快(時間復雜度:O(log(N)))
  • 列表中不能很簡單的調整某個元素的位置,但是有序集合可以(更改分數即可)
  • 有序集合更加消耗內存
命令

ZADD key score member [score member ...]

// 用來向有序集合加入一個元素和該元素的分數

// 分數可以是雙精度浮點數

ZSCORE key member

// 獲取元素的分數

ZRANGE key start stop [WITHSCORES]

ZREVRANGE key start stop [WITHSCORES]

// 獲得排名在某個范圍的元素列表

// ZRANGE 為從小到大,ZREVRANGE為從大到小

// 時間復雜度為O(log n+m),n為有序集合的基數,m為返回元素個數

// 如果兩元素分數相等,redis會按照字典順序來排列

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

// 獲得指定分數范圍的元素

ZINCRBY key increment member

// 把member的分數增加increment

ZCARD key

// key中元素的數量

ZCOUNT key min max

// min和max之間的元素個數

ZREM key member [member ...]

// 刪除一個或多個元素

// 返回值為成功刪除的數量

ZREMRANGEBYRANK key start stop

// 刪除排名在start到stop之間的元素

ZREMRANGEBYSCORE key min max

// 刪除指定分數范圍內的所有元素

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容