五種基本類型及其用法
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三個字段來存儲汽車的顏色、名稱和價格。

**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
"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
##### 當字段不存在的時候賦值
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
"name"
"color"
127.0.0.1:6379> HVALS car:1
"BMW"
"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