什么是Redis
Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):
- Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用
- Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲
- Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份
Redis 優(yōu)勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
- 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性
Redis連接
遠(yuǎn)程連接redis客戶端: redis-cli -h host -p port -a password
設(shè)置redis密碼 config set requirepass password
| 命令 | 描述 |
|---|---|
| auth password | 驗(yàn)證密碼是否正確 |
| echo message | 打印字符串 |
| ping | 查看服務(wù)是否運(yùn)行 |
| quit | 關(guān)閉當(dāng)前連接 |
| select index | 切換到指定的數(shù)據(jù)庫 |
Redis keys 命令
| 命令 | 描述 |
|---|---|
| del key | 在key存在時(shí)刪除key |
| dump key | 用于序列化給定 key ,并返回被序列化的值 |
| exists key | 檢測key是否存在 存在則返回1不存在則返回0 |
| expire key seconds | 為給定 key 設(shè)置過期時(shí)間 |
| expireat key timestamp | 左右和expirel類似,不同 的是expireat設(shè)置的參數(shù)是時(shí)間戳 |
| pexpire key milliseconds | 為給定 key 設(shè)置過期時(shí)間 設(shè)置的參數(shù)是毫秒 |
| pexpireat key milliseconds-timestamp | 設(shè)置 key 過期時(shí)間的時(shí)間戳(unix timestamp) 以毫秒計(jì) |
| key pattern | 用于查找所有符合給定模式 pattern 的 key |
| move key db | 將當(dāng)前數(shù)據(jù)庫的key轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫 |
| persist key | 移除 key 的過期時(shí)間,key 將持久保持 |
| ttl key | 以秒為單位,返回給定 key 的剩余生存時(shí)間 |
| pttl | 以毫秒為單位返回 key 的剩余的過期時(shí)間 |
| randomkey | 從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key |
| rename key newkey | 修改 key 的名稱 |
| renamenx key newkey | 僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey |
| type key | 返回key值的數(shù)據(jù)類型 |
Redis 字符串(String)
| 命令 | 描述 |
|---|---|
| set key value | 設(shè)置指定 key 的值 |
| get key | 獲取對應(yīng)key的值 |
| getrange key start end | 獲取key指定偏移量的值 |
| getset key value | 設(shè)定指定key的值并返回該key之前的值 |
| setnx key value | 僅當(dāng)key不存在時(shí)設(shè)置其值 |
| setex key second value | 設(shè)置key的值和過期時(shí)間 |
| setrange key offset value | 將key的值從偏移量為offset的位置覆蓋為value |
| strlen key | 返回指定key值的長度 |
| mset [key value...] | 設(shè)置一個(gè)或多個(gè) key-value 對 |
| msetnx [key value...] | 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對,當(dāng)且僅當(dāng)所有給定 key 都不存在 |
| incr key | 將key的數(shù)值自增1 |
| incrby key increment | 將 key 所儲存的值加上給定的增量值(increment) |
| incrbyfloat key increment | 將 key 所儲存的值加上給定的浮點(diǎn)增量值(increment) |
| decr key | 將key值自減1 |
| decrby key increment | key 所儲存的值減去給定的減量值(decrement) |
| append key value | 如果 key 已經(jīng)存在并且是一個(gè)字符串, APPEND 命令將 指定value 追加到改 key 原來的值(value)的末尾 |
Redis 哈希(Hash)
Redis hash 是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲對象
Redis 中每個(gè) hash 可以存儲 232 - 1 鍵值對(40多億)
| 命令 | 描述 |
|---|---|
| hset key field value | 為哈希表中的字段賦值 |
| hget key filed | 返回哈希表指定字段的值 |
| hgetall | 返回哈希表中,所有的字段和值 |
| hexists key field | 查看哈希表 key 中,指定的字段是否存在 |
| hdel key [field...] | 刪除指定哈希表指定字段 |
| hincrby key field increment | 為哈希表 key 中的指定字段的整數(shù)值加上增量 increment |
| hincrbyfloat key field increment | 為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment |
| hkeys key | 返回哈希表所有字段 |
| hlen key | 返回哈希表字段的數(shù)量 |
| hmget key [field...] | 獲取哈希表多個(gè)字段的值 |
| hmset key[key value...] | 同時(shí)設(shè)置哈希表多個(gè)字段值 |
| hsetnx key [key value...] | 僅當(dāng)哈希表字段不存在值設(shè)置多個(gè)字段值 |
| hvals key | 返回哈希表所有值 |
Redis 列表(List)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)
一個(gè)列表最多可以包含 232 - 1 個(gè)元素 (4294967295, 每個(gè)列表超過40億個(gè)元素)
| 命令 | 描述 |
|---|---|
| lpush key [value...] | 將一個(gè)或多個(gè)值插入到列表頭部 |
| lpushx key [value...] | 將一個(gè)值插入到已存在的列表頭部 |
| lrange key start end | 回列表中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量 START 和 END 指定 |
| llen key | 返回列表長度 |
| lpop key | 移出并獲取列表的第一個(gè)元素 |
| lrem key count value | 根據(jù)參數(shù) COUNT 的值,移除列表中與參數(shù) VALUE 相等的元素 |
| lset key index value | 通過索引來設(shè)置元素的值 |
| ltrim key start end | 對一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除 |
| lindex key | 通過索引獲取列表中的元素 |
| linsert key before or after private value | 在指定元素的前或者后面插入元素 |
| blpop key timeout | 移出并獲取列表的第一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止 |
| brpop key timeout | 移出并獲取列表的最后一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止 |
| brpoplpush source destination timeout | 從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止 |
| rpush key value | 在列表中添加一個(gè)或多個(gè)值(尾部) |
| rpop | 移除并獲取列表最后一個(gè)元素 |
| rpoplpush source destination | 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回 |
| rpushx key value | 為已存在的列表添加值 |
Redis 集合(Set)
Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)
集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲40多億個(gè)成員)
| 命令 | 描述 |
|---|---|
| sadd key [value...] | 將一個(gè)或多個(gè)成員元素加入到集合中,已經(jīng)存在于集合的成員元素將被忽略 |
| scard key | 獲取集合的成員數(shù) |
| sdiff key1[key2] | 返回給定所有集合的差集 |
| sdiffstore destination key1[key2] | 返回給定所有集合的差集并存儲在 destination 中 |
| sinter key1[key2] | 返回給定所有集合的交集 |
| sinterstore destination key1[key2] | 返回給定所有集合的交集并存儲在 destination 中 |
| sismember key value | 判斷 member 元素是否是集合 key 的成員 |
| smembers key | 返回集合中的所有成員 |
| smove source destination value | 將 member 元素從 source 集合移動到 destination 集合 |
| spop key | 移除并返回集合中的一個(gè)隨機(jī)元素 |
| srandmember key [count] | 返回集合中一個(gè)或多個(gè)隨機(jī)數(shù) |
| screm key [value...] | 移除集合中一個(gè)或多個(gè)成員 |
| sunion key1[key2] | 返回所有給定集合的并集 |
| sunionstore destination key1[key2] | 所有給定集合的并集存儲在 destination 集合中 |
| SSCAN key cursor [MATCH pattern] | 迭代集合中的元素 |
Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。 集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲40多億個(gè)成員)
| 命令 | 描述 |
|---|---|
| zadd key score1 member1[score2 member2] | 向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù) |
| zscard key | 獲取有序集合的成員數(shù) |
| zcount key min max | 計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù) |
| zincrby key increment member | 有序集合中對指定成員的分?jǐn)?shù)加上增量 increment |
Redis 發(fā)布訂閱
Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數(shù)量的頻道。
下圖展示了頻道 channel1 , 以及訂閱這個(gè)頻道的三個(gè)客戶端 —— client2 、 client5 和 client1 之間的關(guān)系:

當(dāng)有新消息通過 PUBLISH 命令發(fā)送給頻道 channel1 時(shí), 這個(gè)消息就會被發(fā)送給訂閱它的三個(gè)客戶端:

| 命令 | 描述 |
|---|---|
| PSUBSCRIBE pattern [pattern ...] | 訂閱一個(gè)或多個(gè)符合給定模式的頻道。 |
| PUBSUB subcommand [argument [argument ...]] | 查看訂閱與發(fā)布系統(tǒng)狀態(tài)。 |
| PUBLISH channel message | 將信息發(fā)送到指定的頻道 |
| PUNSUBSCRIBE [pattern [pattern ...]] | 退訂所有給定模式的頻道 |
| [SUBSCRIBE channel [channel ...] | 訂閱給定的一個(gè)或多個(gè)頻道的信息 |
| UNSUBSCRIBE [channel [channel ...]] | 指退訂給定的頻道 |
Redis 事務(wù)
Redis 事務(wù)可以一次執(zhí)行多個(gè)命令, 并且?guī)в幸韵聝蓚€(gè)重要的保證:
- 批量操作在發(fā)送 EXEC 命令前被放入隊(duì)列緩存
- 收到 EXEC 命令后進(jìn)入事務(wù)執(zhí)行,事務(wù)中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行
- 在事務(wù)執(zhí)行過程,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中
一個(gè)事務(wù)從開始到執(zhí)行會經(jīng)歷以下三個(gè)階段:
- 開始事務(wù)
- 命令入隊(duì)
- 執(zhí)行事務(wù)
| 命令 | 描述 |
|---|---|
| multi | 開啟事物 |
| exec | 提交事物 |
| discard | 取消事物 |
| watch [key...] | 監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動,那么事務(wù)將被打斷 |
| unwatch | 取消 WATCH 命令對所有 key 的監(jiān)視 |