本文做爲Redis的通識教程,旨在讓你們對Redis有一個概念性和總體性的認識,而且能夠快速上手,爲深刻Redis打下基礎。html
文章概要:redis
Redis是一種非關係型數據庫(non-relational database, 簡稱nosql)。算法
Redis是一個遠程內存數據庫,Redis客戶端能夠經過TCP協議請求服務端。sql
Redis性能強勁,且支持持久化和複製,能夠方便地存儲和讀取海量數據。shell
那麼Redis到底有多快? Redis 自帶了一個叫 redis-benchmark 的工具來模擬 N 個客戶端同時發出 M 個請求,你可使用 redis-benchmark -h 來查看參數。數據庫
下面測試了100萬次SET和GET操做的性能:緩存
$ redis-benchmark -n 1000000 -t set,get -P 16 –q
SET: 198098.27 requests per second
GET: 351988.72 requests per second
複製代碼
若是僅僅侷限於一處,容易「只見樹木,不見森林」,或者「手裏那個錘子,看什麼都像釘子」。bash
所以,咱們首先與市場上經常使用的數據庫系統作下橫向對比,這樣你能夠更直觀地感覺Redis的特色。session
同時Redis做爲經常使用的緩存實現,咱們也比較一下經常使用的緩存實現的優缺點。數據結構
Redis 5 帶來了新的流數據類型(Stream data type),在這以前,Redis能夠存儲鍵(key)與5種不一樣數據結構類型之間的映射,這5種數據結構類型分別爲STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)。
編號 | 結構類型 | 結構存儲的值 | 結構的讀寫能力 |
---|---|---|---|
1 | STRING | 字符串、整數、浮點數 | 對整個字符串或者字符串的其中一部分執行操做;對整數和浮點數執行自增(increment)或者自減(decrement)操做 |
2 | LIST | 一個鏈表,鏈表上的每一個節點都包含了一個字符串 | 從鏈表的兩端推入或者彈出元素(隊列操做);根據偏移量對鏈表進行修剪(trim);讀取單個或者多個元素;根據值查找或者移除元素 |
3 | SET | 包含字符串的無序收集器(unordered collection)且不可重複 | 添加、獲取、移除單個元素;檢查一個元素是否存在於集合中;計算交集、並集、差集;從集合裏面隨機獲取元素 |
4 | HASH | 包含鍵值對的無序散列表 | 添加、獲取、移除單個鍵值對;獲取全部鍵值 |
5 | ZSET | 字符串成員(member)與浮點數分值(score)之間的有序映射,元素的排列順序由分值的大小決定 | 添加、獲取、刪除單個元素;根據分值範圍(range)或者成員來獲取元 |
對於字符串,Redis支持最基礎的SET
GET
和 DEL
操做。也支持不少複雜的操做,下面簡要介紹一下。
編號 | 命令 | 描述 |
---|---|---|
1 | SET key value | 設置指定 key 的值 |
2 | GET key | 獲取指定 key 的值 |
3 | DEL key | 刪除此key以及其對應的value,這個命令對5種數據類型都適用 |
4 | GETRANGE key start end | 返回 key 中字符串值的子字符 |
5 | SETRANGE key offset value | 用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始 |
6 | STRLEN key | 返回 key 所儲存的字符串值的長度 |
下面簡單演示一下Command操做字符串:
127.0.0.1:6379> GET key-string
(nil)
127.0.0.1:6379> SET key-str "my string value"
OK
127.0.0.1:6379> GET key-str
"my string value"
127.0.0.1:6379> DEL key-str
(integer) 1
127.0.0.1:6379> GET key-str
(nil)
127.0.0.1:6379>
複製代碼
SETEX與SETNX在作分佈式鎖的時候頗有用。
編號 | 命令 | 描述 |
---|---|---|
1 | SETEX key seconds value | 將值 value 關聯到 key ,並將 key 的過時時間設爲 seconds (以秒爲單位) |
2 | SETNX key value | 只有在 key 不存在時設置 key 的值 |
舉個 SETEX 應用的例子:
在實現分佈式session時,當用戶登陸時設置指定的過時時間。每當用戶請求一個接口,就從新設置一下過時時間。當在指定的時間內未調用任何接口時,分佈式session就失效了。
對於數字,支持以下操做:
編號 | 命令 | 描述 |
---|---|---|
1 | INCR key | 將 key 中儲存的數字值增一 |
2 | INCRBY key increment | 將 key 所儲存的值加上給定的增量值(increment) |
3 | INCRBYFLOAT key increment | 將 key 所儲存的值加上給定的浮點增量值(increment) |
4 | DECR key | 將 key 中儲存的數字值減一 |
5 | DECRBY key decrement | key 所儲存的值減去給定的減量值(decrement) |
下面簡單演示一下Command:
127.0.0.1:6379> SET key-num 0
OK
127.0.0.1:6379> INCR key-num
(integer) 1
127.0.0.1:6379> GET key-num
"1"
127.0.0.1:6379> INCR key-num
(integer) 2
127.0.0.1:6379> GET key-num
"2"
127.0.0.1:6379> INCR key-num
(integer) 3
127.0.0.1:6379> GET key-num
"3"
127.0.0.1:6379> INCRBY key-num 100
(integer) 103
127.0.0.1:6379> GET key-num
"103"
127.0.0.1:6379> INCRBY key-num 100
(integer) 203
127.0.0.1:6379> DECR key-num
(integer) 202
127.0.0.1:6379> DECRBY key-num 100
(integer) 102
127.0.0.1:6379> DECRBY key-num 100
(integer) 2
127.0.0.1:6379> DECRBY key-num 100
(integer) -98
複製代碼
編號 | 命令 | 描述 |
---|---|---|
1 | MGET key1 [key2..] | 獲取全部(一個或多個)給定 key 的值 |
2 | MSET key value [key value ...] | 同時設置一個或多個 key-value 對 |
3 | MSETNX key value [key value ...] | 同時設置一個或多個 key-value 對,當且僅當全部給定 key 都不存在 |
127.0.0.1:6379> MSET a 1 b 2 c 3
OK
127.0.0.1:6379> MGET a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> MSETNX a 1 b 2 c 3
(integer) 0
127.0.0.1:6379> MSETNX a 1 b 2 d 4
(integer) 0
127.0.0.1:6379> MSETNX d 4 e 5
(integer) 1
127.0.0.1:6379>
複製代碼
編號 | 命令 | 描述 |
---|---|---|
1 | GETBIT key offset | 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit) |
2 | SETBIT key offset value | 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit) |
3 | BITCOUNT key [start] [end] | 計算字符串中的設置位數 |
4 | BITOP operation destkey key [key ...] | 在多個鍵(包含字符串值)之間執行按位操做並將結果存儲在目標鍵中。 |
Redis的獨特之處之一就在於它支持一個鏈表結構,下面是對鏈表結構的操做命令,熟悉這些命令對於你掌握Redis的鏈表結構十分重要。
編號 | 命令 | 描述 |
---|---|---|
1 | BLPOP key1 [key2 ] timeout | 移出並獲取列表的第一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
2 | BRPOP key1 [key2 ] timeout | 移出並獲取列表的最後一個元素, 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
3 | BRPOPLPUSH source destination timeout | 從列表中彈出一個值,將彈出的元素插入到另一個列表中並返回它; 若是列表沒有元素會阻塞列表直到等待超時或發現可彈出元素爲止。 |
4 | LINDEX key index | 經過索引獲取列表中的元素 |
5 | LINSERT key BEFORE | AFTER pivot value |
6 | LLEN key | 獲取列表長度 |
7 | LPOP key | 移出並獲取列表的第一個元素 |
8 | LPUSH key value1 [value2] | 將一個或多個值插入到列表頭部 |
9 | LPUSHX key value | 將一個值插入到已存在的列表頭部 |
10 | LRANGE key start stop | 獲取列表指定範圍內的元素 |
11 | LREM key count value | 移除列表元素 |
12 | LSET key index value | 經過索引設置列表元素的值 |
13 | LTRIM key start stop | 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除。 |
14 | RPOP key | 除列表的最後一個元素,返回值爲移除的元素。 |
15 | RPOPLPUSH source destination | 移除列表的最後一個元素,並將該元素添加到另外一個列表並返回 |
16 | RPUSH key value1 [value2] | 在列表中添加一個或多個值 |
17 | RPUSHX key value | 爲已存在的列表添加值 |
127.0.0.1:6379> LPUSH list1 1
(integer) 1
127.0.0.1:6379> RPOP list1
"1"
127.0.0.1:6379> RPOP list1
(nil)
127.0.0.1:6379> BRPOP list1 10
(nil)
(10.10s)
127.0.0.1:6379>
127.0.0.1:6379> LPUSH list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> LSET list1 4 50
OK
127.0.0.1:6379> LSET list1 5 50
(error) ERR index out of range
複製代碼
其中BLPOP
BRPOP
BRPOPLPUSH
是阻塞式的,一般用在消息隊列中。
Redis 的 Set 是 String 類型的無序集合。集合成員是惟一的,這就意味着集合中不能出現重複的數據。
Redis 中集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是 O(1)。
Redis限制了每一個key只能存儲512M數據,集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
編號 | 命令 | 描述 |
---|---|---|
1 | SADD key member1 [member2] | 向集合添加一個或多個成員 |
2 | SCARD key | 獲取集合的成員數 |
3 | SDIFF key1 [key2] | 返回給定全部集合的差集 |
4 | SDIFFSTORE destination key1 [key2] | 返回給定全部集合的差集並存儲在 destination 中 |
5 | SINTER key1 [key2] | 返回給定全部集合的交集 |
6 | SINTERSTORE destination key1 [key2] | 返回給定全部集合的交集並存儲在 destination 中 |
7 | SISMEMBER key member | 判斷 member 元素是不是集合 key 的成員 |
8 | SMEMBERS key | 返回集合中的全部成員 |
9 | SMOVE source destination member | 將 member 元素從 source 集合移動到 destination 集合 |
10 | SPOP key | 移除並返回集合中的一個隨機元素 |
11 | SRANDMEMBER key [count] | 返回集合中一個或多個隨機數 |
12 | SREM key member1 [member2] | 移除集合中一個或多個成員 |
13 | SUNION key1 [key2] | 返回全部給定集合的並集 |
14 | SUNIONSTORE destination key1 [key2] | 全部給定集合的並集存儲在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
127.0.0.1:6379> SADD set1 a b c d e
(integer) 5
127.0.0.1:6379> SCARD set
(integer) 0
127.0.0.1:6379> SCARD set1
(integer) 5
127.0.0.1:6379> SISMEMBER set1 f
(integer) 0
127.0.0.1:6379> SISMEMBER set1 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"
3) "a"
4) "b"
5) "e"
127.0.0.1:6379> SPOP set1
"d"
127.0.0.1:6379> SPOP set1
"a"
127.0.0.1:6379> SMOVE set1 set2 b
(integer) 1
127.0.0.1:6379> SMOVE set1 set2 c
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "b"
2) "c"
複製代碼
SPOP
因爲其隨機性,能夠做爲抽獎程序等業務場景下的基礎實現。
Redis hash 是一個string類型的field和value的映射表,相似於Java語言中的Map結構,hash特別適合用於存儲對象。
編號 | 命令 | 描述 |
---|---|---|
1 | HDEL key field1 [field2] | 刪除一個或多個哈希表字段 |
2 | HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 |
3 | HGET key field | 獲取存儲在哈希表中指定字段的值 |
4 | HGETALL key | 獲取在哈希表中指定 key 的全部字段和值 |
5 | HINCRBY key field increment | 爲哈希表 key 中的指定字段的整數值加上增量 increment |
6 | HINCRBYFLOAT key field increment | 爲哈希表 key 中的指定字段的浮點數值加上增量 increment |
7 | HKEYS key | 獲取全部哈希表中的字段 |
8 | HLEN key | 獲取哈希表中字段的數量 |
9 | HMGET key field1 [field2] | 獲取全部給定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] | 同時將多個 field-value (域-值)對設置到哈希表 key 中 |
11 | HSET key field value | 將哈希表 key 中的字段 field 的值設爲 value |
12 | HSETNX key field value | 只有在字段 field 不存在時,設置哈希表字段的值。 |
13 | HVALS key | 獲取哈希表中全部值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的鍵值對。 |
127.0.0.1:6379> HSET User001 name "Tom"
(integer) 1
127.0.0.1:6379> HSET User001 birthday "1990-01-20"
(integer) 1
127.0.0.1:6379> HSET User001 gender "Man"
(integer) 1
127.0.0.1:6379> HKEYS User001
1) "name"
2) "birthday"
3) "gender"
127.0.0.1:6379> HGETALL User001
1) "name"
2) "Tom"
3) "birthday"
4) "1990-01-20"
5) "gender"
6) "Man"
複製代碼
有序集合和散列同樣,都用於存儲鍵值對。有序集合的鍵被稱爲成員(member),每一個成員都是各不相同的;而有序集合的值則被稱爲分值(score),分值必須爲浮點數。
編號 | 命令 | 描述 |
---|---|---|
1 | ZADD key score1 member1 [score2 member2] | 向有序集合添加一個或多個成員,或者更新已存在成員的分數 |
2 | ZCARD key | 獲取有序集合的成員數 |
3 | ZCOUNT key min max | 計算在有序集合中指定區間分數的成員數 |
4 | ZINCRBY key increment member | 有序集合中對指定成員的分數加上增量 increment |
5 | ZINTERSTORE destination numkeys key [key ...] | 計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中 |
6 | ZLEXCOUNT key min max | 在有序集合中計算指定字典區間內成員數量 |
7 | ZRANGE key start stop [WITHSCORES] | 經過索引區間返回有序集合成指定區間內的成員 |
8 | ZRANGEBYLEX key min max [LIMIT offset count] | 經過字典區間返回有序集合的成員 |
9 | ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] | 經過分數返回有序集合指定區間內的成員 |
10 | ZRANK key member | 返回有序集合中指定成員的索引 |
11 | ZREM key member [member ...] | 移除有序集合中的一個或多個成員 |
12 | ZREMRANGEBYLEX key min max | 移除有序集合中給定的字典區間的全部成員 |
13 | ZREMRANGEBYRANK key start stop | 移除有序集合中給定的排名區間的全部成員 |
14 | ZREMRANGEBYSCORE key min max | 移除有序集合中給定的分數區間的全部成員 |
15 | ZREVRANGE key start stop [WITHSCORES] | 返回有序集中指定區間內的成員,經過索引,分數從高到底 |
16 | ZREVRANGEBYSCORE key max min [WITHSCORES] | 返回有序集中指定分數區間內的成員,分數從高到低排序 |
17 | ZREVRANK key member | 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序 |
18 | ZSCORE key member | 返回有序集中,成員的分數值 |
19 | ZUNIONSTORE destination numkeys key [key ...] | 計算給定的一個或多個有序集的並集,並存儲在新的 key 中 |
20 | ZSCAN key cursor [MATCH pattern] [COUNT count] | 迭代有序集合中的元素(包括元素成員和元素分值) |
127.0.0.1:6379> ZADD Users 1 zhangsan 2 lisi 3 wangwu 4 maliu
(integer) 4
127.0.0.1:6379> ZCARD Users
(integer) 4
127.0.0.1:6379> ZRANK Users maliu
(integer) 3
127.0.0.1:6379> ZSCAN Users 0
1) "0"
2) 1) "zhangsan"
2) "1"
3) "lisi"
4) "2"
5) "wangwu"
6) "3"
7) "maliu"
8) "4"
127.0.0.1:6379>
複製代碼
本文帶你們認識了Redis,並經過橫向對比的方式讓你們對Redis的特性和功能有了總體性的瞭解,而後咱們依次介紹了Redis的5種基本數據結構,以及操做它的命令。做爲Redis的入門教程,本文旨在讓你們對Redis有一個概念性和總體性的認識,爲深刻Redis打下基礎。
今天我僅帶你們瞭解了 Redis知識圖譜 的冰山一角,但願在咱們共同的努力下,不斷完善咱們的 技能圖譜,一塊兒來搭建咱們的 知識體系,笑傲在這個算法與智能的時代。