Redis基礎命令學習
阿新 • • 發佈:2018-11-01
Redis基礎內容-整理學習
Redis基礎資料型別
Redis支援多種資料型別
String:
轉載自
使用String時就是簡單的key-value模型,當然value也支援數字型別的資料
- SET key value [EX seconds][PX milliseconds] [NX|XX] :繫結key和value值(覆蓋並忽略原始型別),EX seconds為過時時間,PX milliseconds為過期時間(NX:只有key不存在的時候才會設定key的值,XX:只有key存在的時候才會設定key的值)
- SETRANGE key offset value:命令覆蓋字串offset為開始的位置,之後用value覆蓋該位置之後的所有資料,即substr+concat類似,若offset>length,會自動補充0位(\x00是16進位制的0)進入位置,直到offset到達之後開始插入資料,若value的長度大於原字串可覆蓋的長度,會重新申請記憶體,這時候由於要分配記憶體,可能出現阻塞。
- MSET key value [key value …]:一次設定多個key-value,若key的值存在,會直接覆蓋。該操作是原子的。
- MSETNX key value [key value…]:關於NX可參照普通的SET命令,NX標識如果有key存在,則操作都不會執行,即要麼全改要麼全不改。
- SETEX key seconds value:和SET key value ex seconds 相同
- PSETEX key seconds value:和SET key value px seconds 相同
- SETNX key value:和SET key value nx相同
- GET key:根據給定的key獲取對應的value值,但value的型別必須為String
- MGET key [key …]:根據給定的key集獲得對應的value集,如果有key對應的資料為空對應的位置也為nil,為了應對在高併發情況下資料修改速度過快導致兩次應該是同一時刻的資料產生誤差(該操作僅僅是同一時刻交於redis去實現,一次性傳輸)
- GETRANGE key start end:切割字串,相當於2.0的SUBSTR,可用複數定義尾部未知的下標位置,-1是倒數第一個,-2是倒數定,若start和end超出範圍,只會返回範圍內的結果
- GETSET key value:設定key的值,並返回之前的值,值必須為String不然會報錯
- STRLEN key:返回key對應String的長度,值必須為String不然會報錯
- APPEND key value:如果key存在且value為String,則String尾部追加value,如果不存在建立這空字串的key,再追加
- INCR key:對key的整數值進行原子的+1操作,不存在的話建立一個key預設0再進行+1,存在且value不是String或無法轉換為整數會報錯(這種資料其實底層儲存的就是一個整數,沒有資料浪費),操作僅限於64位的有符號整數
- DECR key:原子-1,雷同INCR
- INCRBY key increment:原子的加increment
- DECRBY key increment:原子的減increment
- INCRBYFLOAT key increment:float的原子加操作,沒有原子減操作,可以直接加複數
- SETBIT key offset value
List:
Redis的List為雙向連結串列模型,使用List結構能夠簡單得到某組資料的排名等資料,Redis內部的List是怎麼樣的呢。
typedef struct listNode {
// 前置節點
struct listNode *prev;
// 後置節點
struct listNode *next;
// 節點的值
void *value;
} listNode;
以上是Redis對節點的定義。
typedef struct list {
// 頭節點
listNode *head;
// 尾節點
listNode *tail;
// 連結串列中的節點數
unsigned int len;
// 節點值複製函式
void *(*dup) (void *ptr);
// 節點值釋放函式
void (*free) (void *ptr);
// 節點值對比函式
int (*match) (void *ptr, void *key);
} list;
以上程式碼段是Redis中的列表的封裝。list結構記錄了連結串列的頭指標,尾指標,連結串列的節點數。dup,free和match三個成員則表示對節點的值進行復制,釋放和比較的函式。由於這裡的節點的value的內容是任意的,複製和釋放並不一定能用類似於memcpy和free的函式來處理
Redis列表的特性
- 雙端:每個節點都有prev,next節點,因此根據某個節點獲取其上下節點的時間複雜度都是O(1)
- 無環:首節點的prev和尾節點的next都是null
- 帶表頭指標和表尾指標:通過list的head和tail兩個指標,可以隨意的從連結串列的頭和尾進行操作
- 帶連結串列長度計數器:可以直接通過len屬性獲取連結串列長度,時間複雜度是O(1)
- 多型:連結串列使用void*指標來儲存Value,並且通過dup,free,match方法來操作節點的value值,因此連結串列可以儲存任意型別的值
指令
- RPUSH key value [value …]:將指定值傳入key的列表的尾部,key不存在的話,在PUSH執行會自動建立一個空列表,如果key對應資料已有值且不是一個list,則會返回一個錯誤。同時push多個從左至右依次向尾部插入資料。(可以將使用者並行的請求放入佇列中,後臺依次從佇列中獲取任務,處理後將結果返回到結果佇列,並行轉序列,當然也可以多核並行處理佇列中的請求)
- LPUSH key value [value …]:與RPUSH的功能一致,不過LPUSH是從列表左邊開始入值
- RPUSHX key value:與上雷同,但是僅在佇列存在時有效,沒有佇列存在時不會自動建立,返回0標識插入資料失敗
- LPUSHX key value:反向
- LPOP key:從佇列左邊出隊一個元素,複雜度O(1),list為空的話返回nil
- RPOP key:從佇列右邊出隊一個元素。
- BLPOP key [key …] timeout:刪除並獲取列表集的第一個列表的第一個元素,如果為nil,則取下一個列表的第一個元素,以此類推。如果列表集都沒有元素則阻塞,直到timeout(秒)到期或者有一個可用,不然返回nil(BRPOP相反)
- RPOPLPUSH source destination:刪除列表中右邊第一個元素新增到目標列表的左邊,官方給定的兩個案例說明其用處:1.被用於安全佇列中,處理得到訊息的消費者突然崩潰,訊息丟失的情況,是怎麼解決的呢?消費者端在得到訊息的時候會把訊息放入到一個正在處理的列表。當訊息被處理了之後,該命令會使用LREM命令移除對應的訊息。甚至可以新增一個客戶端來監控這個正在處理的列表,若是訊息長時間存在了(即表示處理該訊息的客戶端崩潰了)則將這些超時資訊重新新增入佇列中。2.被用於迴圈列表中:LRANGE需要將整個列表都從伺服器端傳送到客戶端,但如果source=destination,客戶端在訪問一個具有n個元素的列表時,可以在O(n)的時間裡一個接一個獲取元素,這樣就能夠很容易的實現這樣一個系統:(1)有N個客戶端對同一個列表進行旋轉(rotating),他們會取的不同的元素,知道列表裡所有元素都被訪問過,又從頭開始這個操作{ 解釋:N個客戶端輪詢訪問的時候不會改變佇列的順序,只會改變佇列的首尾,在此輪訓狀態下,該佇列幾乎可視為迴圈佇列,在迴圈列中只要確定要好了當前位置,就能保證無論首尾位置是什麼,下一個元素是不會更改的 };(2)有其他元素往列表末端加入新的元素
可用於在伺服器上的監控程式,在儘可能端的時間內,並行的檢查網站可訪問性。
這種模式是易於拓展和安全的,即使客戶端的接收的資訊丟失了,也會存在在佇列中。 - BRPOPLPUSH source destination timeout:阻塞的 其他與上面相同
- LLEN key:獲得List長度
- LRANGE key start stop:在列表中獲取指定返回的元素 不會報錯,end>length的情況會預設end為length,start>end會返回空集合
- LINDEX key index: 獲取元素,時間複雜度為O(n),-1表示最後一個元素,下標超出會返回nil
- LSET key index value:設定佇列裡一個元素的值
- LREM key count value:該命令用於從key對應的list中,移除前count次出現的值為value的元素。count>0標識左到右移除值為value的元素;count<0標識右到左移除值為value的元素;count=0標識移除所有值為value的數
- LTRIM key start stop:就引數用法而言類似LRANGE,不過這個會對list進行裁剪,start到stop之間的元素會作為新佇列覆蓋的佇列中
- LINSERT key BEFORE|AFTER privot value:將value插入key對應列表的基準值privot的前面候著後面,key不存在不會產生操作,key存在但不是List會報錯,找不到privot會返回-1,只匹配匹配到的第一個資料
Hash:
可以堪稱具有string key和string value的容器,因此非常適合儲存物件,如果hash中包含很少的欄位,那麼該型別的資料也將僅佔用很少的磁碟空間,每一個hash可以儲存4294967295(無符號整數的十進位制最大值)個鍵值對
- HSET key field value:為指定的key設定field/value鍵值對
- HMSET key field value [field value …]:為指定的key設定多個鍵值對
- HGET key field:獲取指定key中的field值
- HMGET key field [field …]:獲取指定key中多個field值對應的值
- HGETALL key:獲取指定key下所有的field-value值
- HDEL key field [field …]:刪除key下指定的field
- DEL key:刪除整個hash
- HINCRBY key field increment:設定key中的field的值增加increment,若指定槽位未儲存數字型別的資料,會丟擲異常
- HEXISTS key field:判斷當前key的field是否存在
- HLEN key:獲取當前key所包含的field的數量
- HKEYS key:獲取key的所有field
- HVALS key:獲取所有的value
Set:
Set和List都是字串序列,非常相似,不同的點是Set是用Hash表來保證字串的唯一性,且沒有先後順序,不像List一樣能夠在首位增刪資料。
- SADD key members [members …]:往key中新增Set成員,members重複後只觸發一次儲存操作,不會報錯
- SMEMBERS key:檢視set的全部元素
- SISMEMBER key member:判斷是否key中存在member
- SREM key member [member …]:刪除key中值等於member的資料
- SCARD key:查詢key中的set的資料項數量
- SRANDMEMBER key:輸出key中的set中的隨機一個數據項
- SPOP key:隨機刪除key中的set中的一個數據項並返回
- SMOVE source destination member:從key為source的set中提取member資料項加入到destination的set中
- SINTER key [key …]:求多個key的交集,如果key只有一個的話,返回key對應的Set
- SUNION key [key …]:求多個key的並集
- SDIFF key [key …]:求多個key的差集
Sorted Set:
SortedSet與Set極為相似,他們都是字串的集合,都不允許重複的成員出現在一個set集合中,區別是SortedSet每一個成員都會有一個分數(Score)與之關聯,redis通過分數來為那個集合指定的成員進行從大到小的排序,然而SortedSet成員是唯一的,但是Score是可以重複的。
在SortedSet中新增刪除更新都是極快的操作,時間複雜度為集合中成員數量的對數,並且因為位置有序,所以訪問集合中部的成員也是非常高效的,適用於一些遊戲排名或者微博熱點等場景
- ZADD key [NX|XX] [CH] [INCR] score member [score member …]:將成員和成員的分數存放的sortedset中,如果該元素已存在,會用新的分數替換原有的分數,返回加入的個數。
- ZSCORE key member:獲取指定成員的分數
- ZCARD key:查詢集合中成員數量
- ZREM key member1 member2:移除集合中指定的成員,可指定多個
- ZRANGE key start end [withscores]:獲取集合中start到end的成員,後面的可選引數表明是否返回分數
- ZREVRANGE key start stop [withscores]:按照元素分數從大到小的順序返回從start到stop之間的所有元素,包括兩端,後面可選引數表明是否返回分數
- ZREMRANGEBYRANK key start stop:按照排名名次的範圍刪除元素,(0,2)表明前三位
- ZREMRANGEBYSCORE key start stop:按照分數範圍刪除元素
- ZINCRBY key increment member:設定指定成員增加分數,返回更改後的分數
- ZCOUNT key min max:獲取分數在[min,max]之間的成員,前後包含
- ZRANK key member:從小到大返回該元素的排名
- ZREVRANK key member:從大到小返回該元素的排名