Redis學習——數據類型及操做

1、String,字符串

字符串是 Redis 最基本的數據類型。一個字符串最大爲 512M 字節。字符串數據類型適用於不少場景,例如,緩存 HTML 片斷或者頁面。redis

Redis 字符串是二進制安全的,也就是說,一個 Redis 字符串能夠包含任意類型的數據,例如一張 JPEG 圖像,或者一個序列化的對象。數據庫

咱們能夠把字符串當作位數組(位圖)來處理,很容易統計一些基於0/1邏輯的業務;數組

使用 INCR 命令族 (INCR,DECR,INCRBY),將字符串做爲原子計數器;緩存

使用 APPEND 命令追加字符串等等。安全

一、set key value [ex 秒數]/[px 毫秒數] [nx]/[xx]

set name tom,永久有效。app

set name tom ex 60,60秒後過時。測試

set name tom px 6000,6000毫秒(6秒)後過時。日誌

ex、px 不能同時寫,不然之後面一個時間爲準。對象

如set name tom ex 60 px 6000,實際上6秒後就過時了。blog

nx表示key不存在時執行操做,xx表示key存在時執行操做。

二、setnx key value:key不存在時設置value

三、get key:獲取key的值

四、mset k1 v1 k2 v2 ... kn vn:multi set 一次性設置多個鍵值

五、msetnx k1 v1 k2 v2 ... kn vn:設置多個鍵值,當鍵不存在時才設置

只要有一個存在就都不會被設置。

六、mget k1 k2 .. kn:獲取多個key的值

七、setrange key offset value:將key對應的值,偏移offset位置的字符替換爲value。

返回新字符串的長度。

偏移量的下標以0開始,value有多少個長度,則替換多少個長度的字符。

若是offset超出字符串的長度,則以空白的部分以0x00填充。

八、getrange key start end:獲取字符串中[start, end]範圍的值

字符串下標左數從0開始,右數從-1開始。

獲取左邊第二個(1)到右邊第一個(-2)的值。

start >= length,返回空字符串。end >= length,截取至字符結尾。

九、getset key newvalue:獲取原值,並設置新值

十、append key value:把value追加到key的原值上

十一、strlen key:獲取key值的長度

十二、incr/decr key:指定key的值加1或減1,返回加1或減1後的值

incr/decr 命令將字符串值解析爲整數,可做爲原子計數器。incr 命令是原子的,由於即便多個客戶端對同一個鍵發送 incr 命令也不會形成競爭條件,讀 - 加/減 - 寫操做在執行時,其餘客戶端此時不會執行相關命令。

incr/decr一般可用於計數、搶單的場合,例若有2000張火車票,同時有10萬人搶2000張火車票,可能一分鐘內就搶完了。若是同時去數據庫查詢剩餘票數或下訂單,數據庫壓力很大。

此時可在redis中設置一個票數的緩存,搶票的人先搶到下訂單的資格,後臺再慢慢去下訂單更新數據庫。得到資格後,自動減一,並返回了剩餘票數。剩餘票數爲0,就可過濾掉絕大部分請求了。

若是key不存在,則默認key爲0,再執行加減的操做。

1三、incrby/decrby key num:指定的key值加或減num,返回加num或減num後的值

num爲整數。

1四、incrbyfloat key float:key值加float,float爲浮點數

若是要減小,float爲負數便可。

1五、setbit key offset value:設置key值的二進制位上offset對應的值

例如,我要將大寫的字母變爲小寫的字母,大寫字母和小寫字母相差32,差別就是大寫字母二進制位偏移量2的位置爲0,小寫字母爲1,。

 

經典的應用就是使用位圖法統計活躍用戶,例如統計連續一週登陸用戶。

若是有1億用戶,登陸日誌存儲在數據庫表中,表急劇增大,直接在數據庫中統計,計算較慢。

那麼使用位圖法就能輕鬆解決這個問題,天天按日期生成一個位圖(位數組),用戶是否登陸就用1/0標識,用戶登陸後,把user_id位上的值置爲1,標識該用戶已登陸。把一週的位圖作and運算,位上爲1的就是連續登陸的用戶。

一個位圖算1億個位,100000000/8/1024/1024 ≈ 12M,也就是說天天只須要12M就能存儲1億用戶是否登陸的狀況,節約空間,計算方便。

ID爲100000000的用戶,設置周1、周2、週三連續登陸,最後作AND操做,得出該用戶連續登陸:

ID爲5000的用戶,週一登陸,週二不登陸,週三登陸(能夠不設置,默認填充0),作AND操做,得出未連續登陸:

1六、getbit key offset:獲取key值的二進制位上offset對應的值

1七、bitop operation destkey key1 key2 ... keyn:對key一、key2 ... keyn作operation操做,並將結果保存到destkey上

operation 能夠是AND、OR、NOT、XOR

1八、bitcount key:返回被置爲1的位的數量

1九、bitops key 1/0:返回第一個被置爲1/0的位

2、List,鏈表

Redis列表是簡單的字符串列表,排序爲插入的順序。列表的最大長度爲2^32 - 1 。

Redis 的列表是使用鏈表實現的。這意味着,即便你的列表中有上百萬個元素,增長一個元素到列表的頭部或者尾部的操做都是在常量時間完成。Redis 採用鏈表來實現列表是由於,對於數據庫系統來講,快速插入一個元素到一個很長的列表很是重要。

咱們能夠用列表獲取最新的內容(像帖子、微博等),用ltrim很容易就獲取最新的內容,並移除舊的內容。

用列表能夠實現生產者消費者模式,生產者調用 lpush 添加項到列表中,消費者調用 rpop 從列表提取,若是沒有元素,則輪詢去獲取,或者使用brpop等待生產者添加項到列表中。

一、lpush key value:把值插入鏈表頭部

插入成功,返回列表的個數。能夠同時插入多個值。

lpushx key value:當key存在是才插入數據

二、lrange key start end:返回鏈表中[start, end]中的元素

左數從0開始,右數從-1開始。因此想取出所有元素能夠用lrange key 0 -1。

三、rpush key value:把值插入鏈表的尾部

rpushx key value:當key存在是才插入數據。

四、lpop key:返回並刪除鏈表頭元素

五、rpop key:返回並刪除鏈表尾部元素

六、lrem key count value:從鏈表中刪除value值

刪除count絕對值個value,count>0,從頭部開始刪除;count<0,從尾部開始刪除。

七、ltrim key start end:截取[start, end]的列表並從新賦給key

有些時候咱們只想用列表存儲最近的項,咱們可使用ltrim命令僅僅只記住最近的10項,而丟棄全部老的項。能夠很容易實現新增一個元素而拋棄超出的元素。

八、lindex key index:返回列表索引index上的值

九、llen key:返回列表的個數

十、linsert key after|before search value:在列表中查找search,在search以後|以前插入value

只會在第一個匹配的search以後|以前插入,不會插入多個value。

 十一、lset key index value:設置列表index位置的元素爲value

十二、brpop/blpop key timeout:等待彈出key的尾部/頭部元素

若是有元素則直接彈出,沒有則阻塞,timeout爲等待超時時間,若是timeout爲0,則一直等待。

通常可用於輪詢,在線聊天,例若有一個message列表,在獲取消息的時候,沒有就等待,有就彈出。

使用一個終端來等待消息:

另外一個終端插入消息:

消息被彈出:

等待超時:

1三、rpoplpush source dest:把source的尾部拿出來放到dest的頭部

使用rpoplpush相比分開rpop,lpush兩步操做是原子性的,使用 rpoplpush 能夠構建更安全的隊列和旋轉隊列。

rpoplpush通常可用於構建安全任務隊列,好比有一個任務隊列task,每次從中取出一個任務來執行,放到另外一個列表bak來備份。這樣任務若是執行成功,從bak列表中移除該任務;失敗,能夠再拿回task列表。

1四、brpoplpush source dest timout:等待彈出,放到dest中

結合了brpop喝rpoplpush的特性,有則彈出放到另外一個列表,沒有則等待。

 

3、Set,集合

Redis 集合是無序的字符串集合,集合中的值是惟一的、無序的。能夠對集合執行不少操做,例如,測試元素是否存在,對多個集合執行交集、並集和差集,等等。

咱們一般能夠用集合存儲一些無關順序的,表達對象間關係的數據,例如用戶的角色,能夠用sismember很容易就判斷用戶是否擁有某個角色。

在一些用到隨機值的場合是很是適合的,能夠用 srandmember/spop 獲取/彈出一個隨機元素。

一、sadd key val1 val2 ... valn:向集合中添加元素

二、srandmember key:隨機或一個元素

在string和list的命令中,能夠經過range來獲取某幾個字符或某幾個元素,但集合是無序的,沒法經過下標或範圍來訪問部分元素,所以要麼隨機選一個,要麼全選。

三、smembers key:返回列表的全部元素

四、sismember key value:判斷是否存在某個元素

存在則返回1,不存在則返回0

五、scard key:返回集合的個數

六、spop key:返回並刪除其中一個隨機元素

七、srem val1 val2 ... valn:刪除元素

八、smove source dest value:將source集合中的value刪除並移到dest中

九、sinter k1 k2 ... kn:求集合的交集

sinterstore dest k1 k2 ... kn:求集合的交集,並將結果賦給dest

十一、sunion k1 k2 ... kn:求集合的並集

 同理,sunionstore則將並集的結果賦給dest。

能夠用sunionstore複製一個集合

十二、sdiff k1 k2 ... kn:求集合的差集

即k1-k2-kn

4、Sorted Set,有序集合

有序集合由惟一的,不重複的字符串元素組成。有序集合中的每一個元素都關聯了一個浮點值,稱爲分數。能夠把有序當作hash和集合的混合體,分數即爲hash的key。

有序集合中的元素是按序存儲的,不是請求時才排序的。

一、zadd key score1 value1 score2 value2 ... scoren valuen:添加元素

score爲分數,他們按照以下規則排序:

  • 若是 A 和 B 是擁有不一樣分數的元素,A.score > B.score,則 A > B。
  • 若是 A 和 B 是有相同的分數的元素,若是按字典順序 A 大於 B,則 A > B。A 和 B 不能相同,由於排序集合只能有惟一元素。

向有序集合中添加元素,會自動排序且爲升序

 有序集合的分數能夠重複,但值不能重複,元素是惟一的。

二、zrange key start end [withscores]:獲取[start, end]的元素(升序)

withscores,是否顯示排序分數。zrange默認返回升序序列。

三、zrevrange key start end [withscores]:獲取[start, end]的元素(降序)

與zrange獲取的順序相反。

四、zrank key member:查member的排名(升序)

 返回的排名升序從下標0開始

五、zrevrank key member:查member的排名(降序)

返回的排名降序從下標0開始

六、zcard key:返回元素個數

七、zcount key min max:返回分數[min, max]區間的元素個數

 +inf表示正無窮,-inf表示負無窮。

八、zscore key member:獲取元素的分數

九、zrangebyscore key min max [withscores] [limit offset N]:獲取[min, max]區間並偏移offset個,取出後N個元素(升序)

相似於分頁查詢,若是N超出個數,返回直到結尾。

十、zrevrangebyscore key max min [withscores] [limit offset N]:獲取[max, min]區間並偏移offset個,取出後N個元素(降序)

與zrangebyscore順序相反,注意範圍是[max, min]

十一、zrem key value1 value2 ... valuen:刪除元素

從這裏也能夠看出有序集合中的元素是惟一性的。

十二、zremrangebyscore key min max:刪除分數[min, max]範圍的元素

1三、zremrangebyrank key start end:刪除排名[min, max]之間的元素

1四、zinterstore dest numkeys key1 [key2 ... keyn] [weights weight1 [weight2 ... weightn]] [aggregate sum|min|max]

求key一、key2的交集,key一、key2的權重分別是weight一、weight2;numkeys指定key的個數。

聚合方法爲sum|min|max,結果保存到dest中,默認交集求和。能夠看作先作交集再作後面的運算。

一樣,取並集用zunionstore,其他參數同樣。

添加兩組數據:

交集求和:

交集最大值:

交集加上權重取最大值:加上權重時:score = score * weight

5、Hash,哈希

Redis的哈希值是字符串字段和字符串值之間的映射,是表示對象的完美數據類型。

哈希中的字段數量沒有限制,因此你能夠在你的應用程序以不一樣的方式來使用哈希。

一、hset key field value:設置key中field的值

沒有field則寫入,有則覆蓋

二、hsetnx key field value:當鍵不存在時才設置值

使用hsetnx就不會覆蓋原值

三、hmset key field1 value1 ... fieldn valuen:設置多個鍵值

四、hget key field:獲取key中field的值

五、hmget key field1 ... fieldn:獲取多個值

六、hgetall key:獲取key中全部的鍵值

七、hdel key field:刪除key中的field

八、hlen key:返回key中的個數

九、hexists key field:判斷是否存在某個key

十、hkeys key:返回全部的鍵

十一、hvals key:返回全部的值

十二、hincyby key field value:增長整數值

 只能增長整數,不能增長小數。也能夠增長負數。

1三、hincrbyfloat key field value:增長小數

轉自:http://www.cnblogs.com/chiangchou/

相關文章
相關標籤/搜索