Redis快速入門
一.Redis簡介
1.非關係型資料庫(Nosql)
在瞭解Redis之前,我們需要先了解一下非關係型資料庫。
當前主流的關係型資料庫有Oracle、DB2、Microsoft SQL Server、MySQL等。
非關係型資料庫有Cloudant、MongoDb、redis、HBase等。
那麼,到底什麼是非關係型資料庫呢?
非關係型資料庫:NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。 表示在應用開發時,不是必須使用關係型資料庫,可以使用NoSQL替代關係型資料庫的部分功能。
對比關係型資料庫,非關係型資料庫有以下優點:
(1)無需經過sql層的解析,讀寫效能很高;
(2)基於鍵值對,資料沒有耦合性,容易擴充套件;
(3)儲存資料的格式:nosql的儲存格式是key,value形式、文件形式、圖片形式等等,文件形式、圖片形式等等,而關係型資料庫則只支援基礎型別。
目前NoSQL還不能完全替代關係型資料庫,一般使用關係型資料庫結合NoSQL資料庫進行完成專案。一般有以下幾種應用場景:
(1)當資料比較複雜時不適用NoSQL資料庫;
(2)關係型資料庫依然作為資料儲存的主要軟體;
(3)NoSQL資料庫當作快取工具來使用(NoSQL讀寫效能遠高於關係型資料庫),把使用頻率較高 的內容不僅僅儲存到關係型資料庫中還儲存到NoSQL中。
2.Redis
(1)Redis概念
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
(2)Redis特點
- Redis採用的是基於記憶體的單程序單執行緒模型的 KV 資料庫,由C語言編寫,官方提供的資料是可以達到100000+的QPS(每秒內查詢次數)。
- Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,sortedset,hash等資料結構的儲存。
- 支援過期時間,支援事務,訊息訂閱。
- Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。
- Redis支援資料的備份,即master-slave模式的資料備份。
- 支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
(3)Redis持久化策略
Redis的持久化方式有2種,持久化策略有4種。
-
RDB:資料快照模式
- 預設的持久化策略,每隔一定時間後把記憶體中的資料持久化到dump.rdb檔案中。
- 缺點:資料過於集中,可能導致最後的資料沒有持久化到dump.db中。解決辦法:使用命令SAVE或BGSAVE手動持久化。
-
AOF:資料追加模式
- 監聽Redis的日誌檔案,監聽如果發現執行了修改、刪除、新增命令,立即根據這條命令把資料持久化。
- 缺點:效率低
- 如果只希望資料儲存在記憶體中的話,倆種策略都可以關閉
- 也可以同時開啟倆種策略,當Redis重啟時,AOF檔案會用於重建原始資料
二.Redis常用命令
1.命令手冊網址
http://doc.redisfans.com/
2.主要資料型別
- String(字串)
- Hash(雜湊型別)
- List(列表型別)
- Set(集合型別)
- SortedSet(有序集合型別)
3.常用基本命令
(1)Key(鍵)
-
KEYS pattern:查詢所有符合給定模式 pattern 的 key 。(特殊符號用隔開)
- KEYS * 匹配資料庫中所有 key 。
- KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
- KEYS h*llo 匹配 hllo 和 heeeeello 等。
- KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
-
EXISTS key:檢查給定 key 是否存在。
- 若 key 存在,返回 1 ,否則返回 0 。
-
DEL key [key ...]:刪除給定的一個或多個 key 。
- 返回值:被刪除 key 的數量。
-
TYPE key:返回 key 所儲存的值的型別。
- 返回值:none (key不存在),string (字串),list (列表),set (集合),zset (有序集),hash (雜湊表)
- FLUSHALL:清空所有資料庫
(2)String(鍵)
-
GET key:返回 key 所關聯的字串值。
- 如果 key 不存在那麼返回特殊值 nil 。
- 假如 key 儲存的值不是字串型別,返回一個錯誤,因為 GET 只能用於處理字串值。
-
SET key value [EX seconds] [PX milliseconds] [NX|XX]:將字串值 value 關聯到 key 。
- 如果 key 已經持有其他值, SET 就覆寫舊值,無視型別。
- 對於某個原本帶有生存時間(TTL)的鍵來說, 當 SET 命令成功在這個鍵上執行時, 這個鍵原有的 TTL 將被清除。
- EX second :設定鍵的過期時間為 second 秒。 SET key value EX second 效果等同於 SETEX key second value 。
- PX millisecond :設定鍵的過期時間為 millisecond 毫秒。 SET key value PX millisecond 效果等同於 PSETEX key millisecond value 。
- NX :只在鍵不存在時,才對鍵進行設定操作。 SET key value NX 效果等同於 SETNX key value 。
- XX :只在鍵已經存在時,才對鍵進行設定操作。
-
INCR key:將 key 中儲存的數字值增一。
- 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 INCR 操作。
- 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
- 本操作的值限制在 64 位(bit)有符號數字表示之內。
- 返回值:執行 INCR 命令之後 key 的值。
- INCRBY key increment:將 key 所儲存的值加上增量 increment 。(操作流程及返回值類似)
-
DECR key:將 key 中儲存的數字值減一。
- 如果 key 不存在,那麼 key 的值會先被初始化為 0 ,然後再執行 DECR 操作。
- 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那麼返回一個錯誤。
- 本操作的值限制在 64 位(bit)有符號數字表示之內。
- 返回值:執行 DECR 命令之後 key 的值。
- DECRBY key decrement:將 key 所儲存的值減去減量 decrement 。(操作流程及返回值類似)
- INCRBYFLOAT key increment:為 key 中所儲存的值加上浮點數增量 increment 。(操作流程及返回值類似)
-
APPEND key value
- 如果 key 已經存在並且是一個字串, APPEND 命令將 value 追加到 key 原來的值的末尾。
- 如果 key 不存在, APPEND 就簡單地將給定 key 設為 value ,就像執行 SET key value 一樣。
-
STRLEN key:返回 key 所儲存的字串值的長度。
- 當 key 儲存的不是字串值時,返回一個錯誤。
- 返回值:字串值的長度。當 key 不存在時,返回 0 。
-
MGET key [key ...]:返回所有(一個或多個)給定 key 的值。
- 如果給定的 key 裡面,有某個 key 不存在,那麼這個 key 返回特殊值 nil 。因此,該命令永不失敗。
- 返回值:一個包含所有給定 key 的值的列表。
-
MSET key value [key value ...]:同時設定一個或多個 key-value 對。
- 如果某個給定 key 已經存在,那麼 MSET 會用新值覆蓋原來的舊值,如果這不是你所希望的效果,請考慮使用 MSETNX 命令:它只會在所有給定 key 都不存在的情況下進行設定操作。
- MSET 是一個原子性(atomic)操作,所有給定 key 都會在同一時間內被設定,某些給定 key 被更新而另一些給定 key 沒有改變的情況,不可能發生。
- 返回值:總是返回 OK (因為 MSET 不可能失敗)
(3)Hash(鍵)
-
HSET key field value:將雜湊表 key 中的域 field 的值設為 value 。
- 如果 key 不存在,一個新的雜湊表被建立並進行 HSET 操作。
- 如果域 field 已經存在於雜湊表中,舊值將被覆蓋
- 返回值:如果 field 是雜湊表中的一個新建域,並且值設定成功,返回 1 。如果雜湊表中域 field 已經存在且舊值已被新值覆蓋,返回 0 。
-
HMSET key field value [field value ...]:同時將多個 field-value (域-值)對設定到雜湊表 key 中。
- 此命令會覆蓋雜湊表中已存在的域。
- 如果 key 不存在,一個空雜湊表被建立並執行 HMSET 操作。
- 返回值:如果命令執行成功,返回 OK 。當 key 不是雜湊表(hash)型別時,返回一個錯誤。
-
HGET key field:返回雜湊表 key 中給定域 field 的值。
- 給定域的值。
- 返回值:當給定域不存在或是給定 key 不存在時,返回 nil 。
-
HMGET key field [field ...]:返回雜湊表 key 中,一個或多個給定域的值。
- 如果給定的域不存在於雜湊表,那麼返回一個 nil 值。
- 因為不存在的 key 被當作一個空雜湊表來處理,所以對一個不存在的 key 進行 HMGET 操作將返回一個只帶有 nil 值的表。
- 返回值:一個包含多個給定域的關聯值的表,表值的排列順序和給定域引數的請求順序一樣。
-
HGETALL key:返回雜湊表 key 中,所有的域和值。
- 在返回值裡,緊跟每個域名(field name)之後是域的值(value),所以返回值的長度是雜湊表大小的兩倍。
- 返回值:以列表形式返回雜湊表的域和域的值。若 key 不存在,返回空列表。
-
HEXISTS key field:檢視雜湊表 key 中,給定域 field 是否存在。
- 返回值:如果雜湊表含有給定域,返回 1 。如果雜湊表不含有給定域,或 key 不存在,返回 0 。
-
HSETNX key field value:將雜湊表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在。若域 field 已經存在,該操作無效。
- 返回值:設定成功,返回 1 。如果給定域已經存在且沒有操作被執行,返回 0 。
-
HINCRBY key field increment:為雜湊表 key 中的域 field 的值加上增量 increment 。
- 增量也可以為負數,相當於對給定域進行減法操作。
- 如果 key 不存在,一個新的雜湊表被建立並執行 HINCRBY 命令。
- 如果域 field 不存在,那麼在執行命令前,域的值被初始化為 0 。
- 對一個儲存字串值的域 field 執行 HINCRBY 命令將造成一個錯誤。
- 本操作的值被限制在 64 位(bit)有符號數字表示之內。
- 執行 HINCRBY 命令之後,雜湊表 key 中域 field 的值。
-
HDEL key field [field ...]:刪除雜湊表 key 中的一個或多個指定域,不存在的域將被忽略。
- 返回值:被成功移除的域的數量,不包括被忽略的域。
-
HKEYS key:返回雜湊表 key 中的所有域。
- 返回值:一個包含雜湊表中所有域的表。當 key 不存在時,返回一個空表。
-
HVALS key:返回雜湊表 key 中所有域的值。
- 返回值:一個包含雜湊表中所有值的表。當 key 不存在時,返回一個空表。
-
HLEN key:返回雜湊表 key 中域的數量。
- 返回值:雜湊表中域的數量。當 key 不存在時,返回 0 。
(4)List(鍵)
內部使用雙向連結串列實現,所以獲取越接近兩端的元素速度越快,但通過索引訪問時會比較慢。
-
LPUSH key value [value ...]:將一個或多個值 value 插入到列表 key 的表頭
- 如果有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表頭: 比如說,對空列表 mylist 執行命令 LPUSH mylist a b c ,列表的值將是 c b a ,這等同於原子性地執行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三個命令。
- 如果 key 不存在,一個空列表會被建立並執行 LPUSH 操作。
- 當 key 存在但不是列表型別時,返回一個錯誤。
- 返回值:執行 LPUSH 命令後,列表的長度。
-
RPUSH key value [value ...]:將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
- 如果有多個 value 值,那麼各個 value 值按從左到右的順序依次插入到表尾:比如對一個空列表 mylist 執行 RPUSH mylist a b c ,得出的結果列表為 a b c ,等同於執行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
- 如果 key 不存在,一個空列表會被建立並執行 RPUSH 操作。
- 當 key 存在但不是列表型別時,返回一個錯誤。
- 執行 RPUSH 操作後,表的長度。
-
LPOP key:移除並返回列表 key 的頭元素。
- 返回值:列表的頭元素。當 key 不存在時,返回 nil 。
-
RPOP key:移除並返回列表 key 的尾元素。
- 返回值:列表的尾元素。當 key 不存在時,返回 nil 。
-
LLEN key:返回列表 key 的長度。
- 如果 key 不存在,則 key 被解釋為一個空列表,返回 0 .
- 如果 key 不是列表型別,返回一個錯誤。
-
LRANGE key start stop:返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定。
- 下標(index)引數 start 和 stop 都以 0 為底,也可以使用負數下標。
-
超出範圍的下標值不會引起錯誤。
- 如果 start 下標比列表的最大下標 end ( LLEN list 減去 1 )還要大,那麼 LRANGE 返回一個空列表。
- 如果 stop 下標比 end 下標還要大,Redis將 stop 的值設定為 end 。
- 返回值:一個列表,包含指定區間內的元素。
-
LREM key count value:根據引數 count 的值,移除列表中與引數 value 相等的元素。
-
count 的值可以是以下幾種:
- count > 0 : 從表頭開始向表尾搜尋,移除與 value 相等的元素,數量為 count 。
- count < 0 : 從表尾開始向表頭搜尋,移除與 value 相等的元素,數量為 count 的絕對值。
- count = 0 : 移除表中所有與 value 相等的值。
- 返回值:被移除元素的數量。因為不存在的 key 被視作空表(empty list),所以當 key 不存在時, LREM 命令總是返回 0。
-
-
LINDEX key index:返回列表 key 中,下標為 index 的元素。
- 下標(index)引數 start 和 stop 都以 0 為底,也可以使用負數下標。
- 如果 key 不是列表型別,返回一個錯誤。
- 返回值:列表中下標為 index 的元素。如果 index 引數的值不在列表的區間範圍內(out of range),返回 nil 。
-
LSET key index value:將列表 key 下標為 index 的元素的值設定為 value 。
- 當 index 引數超出範圍,或對一個空列表( key 不存在)進行 LSET 時,返回一個錯誤。
- 返回值:操作成功返回 ok ,否則返回錯誤資訊。
-
LTRIM key start stop:對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
- 超出範圍的下標值不會引起錯誤。
- 返回值:命令執行成功時,返回 ok 。
-
RPOPLPUSH source destination:命令 RPOPLPUSH 在一個原子時間內,執行以下兩個動作:
- 將列表 source 中的最後一個元素(尾元素)彈出,並返回給客戶端。
- 將 source 彈出的元素插入到列表 destination ,作為 destination 列表的的頭元素。
- 舉個例子,你有兩個列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,執行 RPOPLPUSH source destination 之後, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,並且元素 c 會被返回給客戶端。
- 如果 source 不存在,值 nil 被返回,並且不執行其他動作。
- 如果 source 和 destination 相同,則列表中的表尾元素被移動到表頭,並返回該元素,可以把這種特殊情況視作列表的旋轉(rotation)操作。
- 返回值:被彈出的元素。
(5)Set(鍵)
集合型別值具有唯一性,常用操作是向集合新增、刪除、判斷某個值是否存在,集合內部是使用值為空的散列表實現的。
-
SADD key member [member ...]:將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
- 假如 key 不存在,則建立一個只包含 member 元素作成員的集合。
- 當 key 不是集合型別時,返回一個錯誤。
- 返回值:被新增到集合中的新元素的數量,不包括被忽略的元素。
-
SREM key member [member ...]:移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
- 當 key 不是集合型別,返回一個錯誤。
- 返回值:被成功移除的元素的數量,不包括被忽略的元素。
-
SMEMBERS key:返回集合 key 中的所有成員。不存在的 key 被視為空集合。
- 返回值:集合中的所有成員。
-
SISMEMBER key member:判斷 member 元素是否集合 key 的成員。
- 返回值:如果 member 元素是集合的成員,返回 1 。如果 member 元素不是集合的成員,或 key 不存在,返回 0 。
-
SDIFF key [key ...]:返回一個集合的全部成員,該集合是所有給定集合之間的差集。
- 不存在的 key 被視為空集。
- 返回值:交整合員的列表。
-
SINTER key [key ...]:返回一個集合的全部成員,該集合是所有給定集合的交集。
- 不存在的 key 被視為空集。
- 當給定集合當中有一個空集時,結果也為空集(根據集合運算定律)。
- 返回值:交整合員的列表。
-
SUNION key [key ...]:返回一個集合的全部成員,該集合是所有給定集合的並集。
- 不存在的 key 被視為空集。
- 返回值:並整合員的列表。
-
SCARD key:返回集合 key 的基數(集合中元素的數量)。
- 返回值:集合的基數。當 key 不存在時,返回 0 。
- 集合運算後儲存結果
-
語法:
- SDIFFSTROE destination key [key ...] ,差運算並存儲到destination新集合中
- SINTERSTROE destination key [key ...],交運算並存儲到destination新集合中
- SUNIONSTROE destination key [key ...],並運算並存儲到destination新集合中
-
SRANDMEMBER key [count]:如果命令執行時,只提供了 key 引數,那麼返回集合中的一個隨機元素。
- 如果 count 為正數,且小於集合基數,那麼命令返回一個包含 count 個元素的陣列,陣列中的元素各不相同。如果 count 大於等於集合基數,那麼返回整個集合。
- 如果 count 為負數,那麼命令返回一個數組,陣列中的元素可能會重複出現多次,而陣列的長度為 count 的絕對值。
- 返回值:只提供 key 引數時,返回一個元素;如果集合為空,返回 nil 。如果提供了 count 引數,那麼返回一個數組;如果集合為空,返回空陣列。
-
SPOP key:移除並返回集合中的一個隨機元素。
- 如果只想獲取一個隨機元素,但不想該元素從集合中被移除的話,可以使用 SRANDMEMBER 命令。
- 返回值:被移除的隨機元素。當 key 不存在或 key 是空集時,返回 nil 。
(6)SortedSet(鍵)
-
ZADD key score member [[score member] [score member] ...]:將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
- 如果某個 member 已經是有序集的成員,那麼更新這個 member 的 score 值,並通過重新插入這個 member 元素,來保證該 member 在正確的位置上。
- score 值可以是整數值或雙精度浮點數。
- 如果 key 不存在,則建立一個空的有序集並執行 ZADD 操作。
- 當 key 存在但不是有序集型別時,返回一個錯誤。
- 返回值:被成功新增的新成員的數量,不包括那些被更新的、已經存在的成員。
-
ZSCORE key member:返回有序集 key 中,成員 member 的 score 值。
- 如果 member 元素不是有序集 key 的成員,或 key 不存在,返回 nil 。
- 返回值:member 成員的 score 值,以字串形式表示。
-
ZRANGE key start stop [WITHSCORES]:返回有序集 key 中,指定區間內的成員。
- 其中成員的位置按 score 值遞增(從小到大)來排序。
- 具有相同 score 值的成員按字典序(lexicographical order )來排列。
- 下標引數 start 和 stop 都以 0 為底,超出範圍的下標並不會引起錯誤。
- 可以通過使用 WITHSCORES 選項,來讓成員和它的 score 值一併返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
- 返回值:指定區間內,帶有 score 值(可選)的有序整合員的列表。
-
ZREVRANGE key start stop [WITHSCORES]:返回有序集 key 中,指定區間內的成員。
- 其中成員的位置按 score 值遞減(從大到小)來排列。
- 具有相同 score 值的成員按字典序的逆序(reverse lexicographical order)排列。
- 除了成員按 score 值遞減的次序排列這一點外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一樣。
-
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。
- 有序整合員按 score 值遞增(從小到大)次序排列。
- 具有相同 score 值的成員按字典序(lexicographical order)來排列(該屬性是有序集提供的,不需要額外的計算)。
- 可選的 LIMIT 引數指定返回結果的數量及區間(就像SQL中的 SELECT LIMIT offset, count ),注意當 offset 很大時,定位 offset 的操作可能需要遍歷整個有序集,此過程最壞複雜度為 O(N) 時間。
- 可選的 WITHSCORES 引數決定結果集是單單返回有序集的成員,還是將有序整合員及其 score 值一起返回。
- 返回值:指定區間內,帶有 score 值(可選)的有序整合員的列表。
-
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:返回有序集 key 中, score 值介於 max 和 min 之間(預設包括等於 max 或 min )的所有的成員。有序整合員按 score 值遞減(從大到小)的次序排列。
- 具有相同 score 值的成員按字典序的逆序(reverse lexicographical order )排列。
- 除了成員按 score 值遞減的次序排列這一點外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一樣。
- 返回值:指定區間內,帶有 score 值(可選)的有序整合員的列表。
-
ZINCRBY key increment member:為有序集 key 的成員 member 的 score 值加上增量 increment 。
- 可以通過傳遞一個負數值 increment ,讓 score 減去相應的值,比如 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。
- 當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。
- key 不是有序集型別時,返回一個錯誤。
- ore 值可以是整數值或雙精度浮點數。
- 返回值:member 成員的新 score 值,以字串形式表示。
彩蛋
Redis預設不需要密碼,如果想要給Redis設定密碼,需要編輯Redis目錄下的redis.conf檔案,新增如下內容:
requirepass 將要設定的密碼
如果給Redis設定了密碼,需要通過以下方式訪問:
./redis-cli -h ip地址 -p 埠號 -a 密碼