一.Redis簡介
1.非關係型數據庫(Nosql)
在瞭解Redis以前,咱們須要先了解一下非關係型數據庫。html
當前主流的關係型數據庫有Oracle、DB二、Microsoft SQL Server、MySQL等。
非關係型數據庫有Cloudant、MongoDb、redis、HBase等。redis
那麼,到底什麼是非關係型數據庫呢?
非關係型數據庫:NoSQL(NoSQL = Not Only SQL ),意即"不只僅是SQL"。表示在應用開發時,不是必須使用關係型數據庫,可使用NoSQL替代關係型數據庫的部分功能。sql
對比關係型數據庫,非關係型數據庫有如下優勢:
(1)無需通過sql層的解析,讀寫性能很高;
(2)基於鍵值對,數據沒有耦合性,容易擴展;
(3)存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,而關係型數據庫則只支持基礎類型。shell
目前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種。nosql
-
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 是否存在。
-
DEL 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 密碼