標籤:
前言
最近因項目需要用到redis,所以藉助《Redis入門指南》(李子驊 編著)這本書快速入門了一下,此處記錄下一些知識點(主要是命令),方便以後查閱。
簡介
Redis是一個開源的key-value儲存,並用於構建高效能,可擴充的Web應用程式的完美解決方案。
Redis的三個主要特點:
Redis的優勢
異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
支援豐富的資料類型:Redis支援最大多數開發人員已經知道的像列表,集合,有序集合,散列等資料類型。這使得它非常容易解決各種各樣的問題,因為我們知道哪些問題是可以通過它的資料類型更好地處理。
操作都是原子性:所有Redis操作是原子的,這保證了如果兩個用戶端同時訪問的Redis伺服器將獲得更新後的值。
多功能工具 + 生產力:Redis是一個多實用的工具,可以在多個用例如緩衝,訊息,隊列使用(Redis原生支援發布/訂閱),任何短暫的資料,應用程式,如Web應用程式工作階段,網頁命中計數等。
啟動與停止啟動
1.直接啟動
$ redis-server
預設使用6379連接埠。
趣聞一則:
6379是手機鍵盤上MERZ對應的數字,MERZ是一名意大利歌女的名字。
2.通過初始化指令碼啟動redis,可以使得redis隨機啟動(適合生產環境)。具體參見《Redis入門指南》。
停止
$ redis-cli SHUTDOWN
redis收到SHUTDOWN命令後會先斷開所有用戶端串連,然後根據配置執行持久化,最後完成退出。
此外也可以使用“kill redis進程的PID”來正常結束redis。
redis命令列用戶端
我們可以通過redis-cli向redis發送命令,同時可以擷取命令執行後的傳回值。
配置
redis可以通過設定檔和命令列參數進行配置,設定檔範本參見redis.conf,它位於原始碼目錄的根目錄中。
多資料庫
redis是一個字典結構的儲存伺服器,一個redis執行個體提供了多個用來儲存資料的字典,用戶端可以指定將資料存放區在哪個字典中。
同一個執行個體中的每個字典相當於一個獨立的資料庫,它對外是以一個從0開始的遞增數字命名,不支援自訂名字。預設使用0號,可以通過SELECT命令來切換。
另外redis也不支援位每個資料庫設定不同的訪問密碼,且多個資料庫之間並不是完全隔離的,比如FLUSHALL命令可以清空一個執行個體中的所以資料庫。
因此不同的字典適合當做命名空間來使用,比如0號用於生產環境,1號用於測試環境等等。
而不同應用的資料最好儲存在不同執行個體當中。
入門-資料類型熱身
1.擷取符合規則的鍵名列表
KEYS pattern
其中pattern支援glob風格萬用字元格式。
? 匹配一個字元
* 匹配任意個字元
[ ] 匹配括弧間的任一字元
\ 用於轉義
例子:
> SET bar 1OK> KEYS *1) "bar"
(redis不區分命令大小寫)
2.判斷一個鍵是否存在
EXISTS key
存在返回1,不存在返回0。
3.刪除鍵
DEL key [key ...]
可以刪除多個鍵,傳回值是刪除的鍵的個數。
DEL的參數不支援萬用字元,但可以結合Linux的管道和xargs命令自己實現刪除所以符合規則的鍵,比如刪除所有以”user:”開頭的鍵:
redis-cli KEYS "user:*" | xargs redis-cli DEL
4.擷取索引值的資料類型
TYPE key
傳回值可能是:
string(字串類型)
hash(散列類型)
list(清單類型)
set(集合類型)
zset(有序集合類型)
字串類型
Redis的字串是位元組序列。在Redis中字串是二進位安全的,這意味著他們有一個已知的長度,是沒有任何特殊字元終止決定的,所以可以儲存任何東西,最大長度可達512兆。
Redis使用一個sdshdr類型的變數來儲存字串,而redisObject的ptr欄位指向的是該變數的地址。
struct sdshdr { int len; //字串長度 int free; //buf中剩餘的空間 char buf[]; //字串內容};
相關命令:
1.賦值與取值
SET key valueGET key
例子:
redis 127.0.0.1:6379> SET name "jiange"OKredis 127.0.0.1:6379> GET name"jiange"
2.遞增數字
當儲存的內容是整數形式時,可以進行自增,當索引值不存在時會預設為0,因此第一次遞增之後結果為1。
INCR key
產生自增id:
對於文章資料 post:$postID:data ,我們需要每一篇文章有一個唯一的自增id->”\$postID”,可使用名為 物件類型(複數形式):count(命名僅供參考,可以使用其他任意名字)的鍵來儲存當前類型對象的數量,每增加一個新對象就對它使用INCR:
$postID = INCR posts:count$serializedPost = serialize($title,$content,$author,$time)SET post:$postID:data, $serializedPost
3.增加指定整數
INCRBY key increment
4.減少指定整數
DECR keyDECRBY key decrement
5.增加指定浮點數
INCRBYFLOAT key increment
6.向尾部追加值
APPEND key value
7.擷取字串長度
STRLEN key
8.同時獲得/設定多個索引值
MGET key [key ...]MSET key value [key value ...]
9.位操作
GETBIT key offsetSETBIT key offset valueBITCOUNT key [start] [end] //獲得二進位中1的個數BITOP operation destkey key [key ...]//operation包括AND,OR,XOR,NOT
散列類型
散列類型的索引值也是一種字典類型,其儲存了欄位和欄位值的映射,欄位值只能是字串,一個散列類型鍵可以包含至多2^32-1個欄位。
散列類型適合儲存物件:使用物件類別和ID構成key,使用欄位表示對象的屬性,而欄位值則儲存屬性值。
比如:
鍵 欄位 欄位值 color 白色car:2 name 奧迪 price 90萬
該汽車對象的ID為2。
相關命令:
1.賦值和取值
HSET key field valueHGET key fieldHMSET key field value [field value ...]HMGET key field [field ...]HGETALL key
HSET命令不區分插入和更新操作,當執行的是插入時返回1,更新時返回0。當鍵本身不存在時,HSET命令會自動建立它。
2.判斷欄位是否存在
HEXISTS key field
3.當欄位不存在時賦值
HSETNX key field value
如果欄位已存在,將不執行任何操作。
4.增加數字
HINCRBY key field increment
5.刪除欄位
HDEL key field [field ...]
6.只擷取欄位名或欄位值
HKEYS keyHVALS key
7.獲得欄位數量
HLEN key
清單類型
list可以儲存一個有序的字串列表,常用的操作是向列表兩端添加元素,或者獲得列表的某一個片段。其內部使用雙向鏈表實現,因此在頭部和尾部添加和擷取元素的速度很快,缺點是通過索引訪問元素比較慢。
一個清單類型的鍵最多能容納2^32-1個元素。
相關命令:
1.向列表兩端增加元素
LPUSH key value [value ...]RPUSH key value [value ...]
分別向索引值位key的列表左邊和右邊添加元素,傳回值表示增加元素後列表的長度。
2.向列表兩端彈出元素
LPOP keyRPOP key
3.擷取列表中元素的個數
LLEN key
當索引值不存在時會返回0;
4.獲得列表片段
LRANGE key start stop
LRANGE支援負索引,表示從右邊開始計算序數,-1表示最右邊第一個元素,-2表示最右邊第二個元素;
LRANGE numbers 0 -1 可以獲得列表所有元素
當start的索引位置在stop的索引位置後面時,返回空列表;
當stop超過實際的索引範圍時,則返回到列表最右邊的元素;
5.刪除列表中指定的值
LREM key count value
rem位remove的縮寫;
以上命令刪除列表中前count個值為value的元素,返回的是實際刪除的元素個數;
當count > 0時,從列表左邊開始刪除;
當count < 0時,從列表右邊開始刪除;
當count = 0時,從列表中刪除【所有】值為value的元素;
6.獲得/設定指定索引的元素值
LINDEX key indexLSET key index value
LINDEX用來返回指定索引的元素,索引從0開始,index是負數則表示從右邊開始計算;
7.只保留列表指定欄位
LTRIM key start end
該命令可以刪除指定索引範圍之外的所有元素(左右都是閉區間);
8.向列表中插入元素
LINSERT key BEFORE|AFTER pivot value
在值為pivot的元素前面or後面插入值value;
9.將元素從一個列錶轉到另一個列表
RPOPLPUSH source destination
集合類型
集合中每個元素都是不同的,且沒有順序,一個集合類型的鍵可以儲存至多2^32-1個字串。
集合類型在redis內部是使用值為空白的散列表實現的。
多個集合類型鍵之間可以進行並集,交集和差集運算。
相關命令:
1.增加/刪除元素
SADD key member [member ...]SREM key member [member ...]
傳回值是成功加入/刪除的元素數量;
2.獲得集合中的所有元素
SMEMBERS key
3.判斷元素是否在集合中
SISMEMBER key member
時間複雜度為O(1);
4.集合間運算
SDIFF key [key ...]SINTER key [key ...]SUNION key [key ...]
5.獲得集合中元素個數
SCARD key
6.進行集合運算並儲存結果
SDIFFSTORE destination key [key ...]SINTERSTORE destination key [key ...]SUNIONSTORE destination key [key ...]
7.隨機獲得集合中的元素
SRANDMEMBER key [count]
事實上,這裡的隨機是隨機挑選一個桶(上面提到,set是用hash實現的),再從桶裡隨機播放一個元素,因此每個元素被選中的機率並不一樣。
8.從集合中彈出一個元素
SPOP key
隨機彈出一個元素。
有序集合類型
有序集合類似集合。不同的是,一個有序集合的每個元素帶有分數,便於排序。
有序集合類型是使用散列表和跳躍表實現的,所以即使讀取位於中間部分的資料,速度也很快(時間複雜度為O(log(N)))。
相關命令:
1.增加元素
ZADD key score member [score member ...]
如果一個元素已經存在,則用新的分數替換原有的分數。
傳回值為新加入到集合中的元素個數。
2.獲得元素的個數
ZSCORE key member
3.獲得排名在某個範圍的元素列表
ZRANGE key start stop [WITHSCORES]ZREVRANGE key start stop [WITHSCORES]
ZRANGE會按照元素分數從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素)。
WITHSCORES可以同時獲得元素的分數。
ZREVRANGE則是按分數從大到小排序。
4.獲得指定分數範圍的元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
按照分數從小到大的順序返回分數在min和max之間(包含min和max)的元素。
LIMIT offset count 在獲得的元素列表的基礎上向後位移offset個元素,並且只擷取前count個元素。
5.增加某個元素的分數
ZINCRBY key increment member
6.獲得集合中元素的數量
ZCARD key
7.獲得指定分數範圍內的元素個數
ZCOUNT key min max
8.刪除一個或多個元素
ZREM key member [member ...]
9.按照排名範圍刪除元素
ZREMRANGEBYRANK key start stop
10.按照分數範圍刪除元素
ZREMRANGEBYSCORE key min max
11.獲得元素的排名
ZRANK key memberZREVRANK key member
12.計算有序集合的交集
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
redis快速入門-資料類型