Redis 學習-上

肥龍發表於2022-02-23

一、Redis 概述

1.1、Redis 定義

  • Redis (Remote Dictionary Server):遠端字典服務
  • 是一個開源的使用 ANSI C 語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、 key-Value 資料庫,並提供多種語言的 API。
  • 資料都是快取在記憶體中 ,Redis 會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案。
  • Reids 官方網站:https://redis.io/

1.2、Redis 特性

  • 資料間沒有必然的關聯關係
  • 內部採用單執行緒機制進行工作
  • 高效能
  • 支援多種資料格式(字串、列表、集合、雜湊、有序集合...)
  • 支援持久化,可進行資料災難恢復

二、Redis 常用資料型別

2.1、Redis key

1、redis 鍵的特性

  • 在 redis 中無論什麼資料型別,在資料庫中都市以 key-Value 形式儲存,通過進行對 Redis-key 的操作,來完成對資料中資料的操作。
  • 空字串也是一個有效的鍵
  • 允許的最大 key 大小為 512MB
  • key 中允許存在 點或破折號/冒號,如:"comment?reply-to"

2、redis 相關命令

  • exists key:判斷鍵是否存在

  • del key:刪除鍵值對

  • move key db:將鍵值對移動到指定資料庫

  • expire key second:設定鍵值對過期時間

  • type key:檢視 value 的資料型別

  • TTL key:返回 key 的過期時間,一般來說有三種

    • 當前 key 沒有設定過期時間,所以會返回 -1
    • 當前 key 有設定過期時間,而且 key 已經過期,所以會返回 -2
    • 當前 key 有設定過期時間,且 key 還沒有過期,故會返回 key 的正常剩餘時間
  • rename key newkey:修改 key 的名稱

  • renamenx key newkey:僅當 newkey 不存在時,將 key 改名為 newkey

2.2、String 字串

2.2.1、概述

  • 字串型別是Redis中最為基礎的資料儲存型別,它在Redis中是二進位制安全的,這便意味著該型別可以接受任何格式的資料,如JPEG影像資料或Json物件描述資訊等。在Redis中字串型別的Value最多可以容納的資料長度是512M。

2.2.2、相關命令

1、賦值命令

命令原型:*SET* key value

時間複雜度:O(1)

命令描述:設定該Key持有指定的字串Value,如果該Key已經存在,則覆蓋其原有值。

返回值:總是返回"OK"。

2、取值命令

命令原型:G*ET* key

時間複雜度:O(1)

命令描述:獲取指定Key的Value。如果與該Key關聯的Value不是string型別,Redis將返回錯誤資訊,因為GET命令只能用於獲取string Value。

返回值:與該Key相關的Value,如果該Key不存在,返回nil。

3、GETSET命令

命令原型:G*ETSET* key value

時間複雜度:O(1)

命令描述:原子性的設定該Key為指定的Value,同時返回該Key的原有值。和GET命令一樣,該命令也只能處理string Value,否則Redis將給出相關的錯誤資訊。

返回值:返回該Key的原有值,如果該Key之前並不存在,則返回nil。

4、遞增數字

命令原型:*INCR* key

時間複雜度:O(1)

命令描述:將指定Key的Value原子性的遞增1。如果該Key不存在,其初始值為0,在incr之後其值為1。如果Value的值不能轉換為整型值,如Hello,該操作將執行失敗並返回相應的錯誤資訊。注意:該操作的取值範圍是64位有符號整型。

返回值:遞增後的Value值。

5、遞減數字

命令原型:DE*CR* key

時間複雜度:O(1)

命令描述:將指定Key的Value原子性的遞減1。如果該Key不存在,其初始值為0,在decr之後其值為-1。如果Value的值不能轉換為整型值,如Hello,該操作將執行失敗並返回相應的錯誤資訊。注意:該操作的取值範圍是64位有符號整型。

返回值:遞增後的Value值。

6、增加指定的整數

命令原型:*INCRBY* key increment

時間複雜度:O(1)

命令描述:將指定Key的Value原子性的增加increment。如果該Key不存在,其初始值為0,在incrby之後其值為increment。如果Value的值不能轉換為整型值,如Hello,該操作將執行失敗並返回相應的錯誤資訊。注意:該操作的取值範圍是64位有符號整型。

返回值:增加後的value值。

7、減少指定的整數

命令原型:DE*CRBY* key decrement

時間複雜度:O(1)

命令描述:將指定Key的Value原子性的減少decrement。如果該Key不存在,其初始值為0,在decrby之後其值為-decrement。如果Value的值不能轉換為整型值,如Hello,該操作將執行失敗並返回相應的錯誤資訊。注意:該操作的取值範圍是64位有符號整型。

返回值:減少後的value值。

8、SETEX命令

命令原型:SETEX key seconds value

時間複雜度:O(1)

命令描述:原子性完成兩個操作,一是設定該Key的值為指定字串,同時設定該Key在Redis伺服器中的存活時間(秒數)。該命令主要應用於Redis被當做Cache伺服器使用時。

返回值:

9、SETNX命令

命令原型:SETNX key value

時間複雜度:O(1)

命令描述:如果指定的Key不存在,則設定該Key持有指定字串Value,此時其效果等價於SET命令。相反,如果該Key已經存在,該命令將不做任何操作並返回。

返回值:1表示設定成功,否則0。

10、向尾部追加值

命令原型:APPEND key value

時間複雜度:O(1)

命令描述:如果該Key已經存在,APPEND命令將引數Value的資料追加到已存在Value的末尾。如果該Key不存在,APPEND命令將會建立一個新的Key/Value。

返回值:追加後Value的長度。

11、獲取字串長度

命令原型:STRLEN key value

時間複雜度:O(1)

命令描述:返回指定Key的字元值長度,如果Value不是string型別,Redis將執行失敗並給出相關的錯誤資訊。

返回值:返回指定Key的Value字元長度,如果該Key不存在,返回0。

12、設定多個鍵值

命令原型:*MSET* key value [key value ...]

時間複雜度:O(N)

命令描述:N表示指定Key的數量。該命令原子性的完成引數中所有key/value的設定操作,其具體行為可以看成是多次迭代執行SET命令。

返回值:該命令不會失敗,始終返回OK。

13、獲取多個鍵值

命令原型:*MGET* key [key ...]

時間複雜度:O(N)

命令描述:N表示獲取Key的數量。返回所有指定Keys的Values,如果其中某個Key不存在,或者其值不為string型別,該Key的Value將返回nil。

返回值:返回一組指定Keys的Values的列表。

14、MSETNX命令

命令原型:*MSETNX* key value [key value ...]

時間複雜度:O(N)

命令描述:N表示指定Key的數量。該命令原子性的完成引數中所有key/value的設定操作,其具體行為可以看成是多次迭代執行SETNX命令。然而這裡需要明確說明的是,如果在這一批Keys中有任意一個Key已經存在了,那麼該操作將全部回滾,即所有的修改都不會生效。

返回值:1表示所有Keys都設定成功,0則表示沒有任何Key被修改。

2.2.3、String 的應用場景

1、計數器

2、快取基礎資料

3、物件儲存快取

4、頁面防重提交

2.3、List 列表

2.3.1、概述

  • 在Redis中,List型別是按照插入順序排序的字串連結串列。和資料結構中的普通連結串列一樣,我們可以在其頭部(left)和尾部(right)新增新的元素。在插入時,如果該鍵並不存在,Redis將為該鍵建立一個新的連結串列。與此相反,如果連結串列中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。List中可以包含的最大元素數量是4294967295。
  • 從元素插入和刪除的效率視角來看,如果我們是在連結串列的兩頭插入或刪除元素,這將會是非常高效的操作,即使連結串列中已經儲存了百萬條記錄,該操作也可以在常量時間內完成。然而需要說明的是,如果元素插入或刪除操作是作用於連結串列中間,那將會是非常低效的。相信對於有良好資料結構基礎的開發者而言,這一點並不難理解。

2.3.2、相關命令

1、向列表左邊新增元素

命令原型:*LPUSH* key value [value ...]

時間複雜度:O(1)

命令描述:在指定Key所關聯的List Value的頭部插入引數中給出的所有Values。如果該Key不存在,該命令將在插入之前建立一個與該Key關聯的空連結串列,之後再將資料從連結串列的頭部插入。如果該鍵的Value不是連結串列型別,該命令將返回相關的錯誤資訊。

返回值:插入後連結串列中元素的數量。

2、向列表右邊新增元素

命令原型:R*PUSH* key value [value ...]

時間複雜度:O(1)

命令描述:在指定Key所關聯的List Value的尾部插入引數中給出的所有Values。如果該Key不存在,該命令將在插入之前建立一個與該Key關聯的空連結串列,之後再將資料從連結串列的尾部插入。如果該鍵的Value不是連結串列型別,該命令將返回相關的錯誤資訊。

返回值:插入後連結串列中元素的數量。

3、*LPUSHX命令*

命令原型:****LPUSHX key value

時間複雜度:O(1)

命令描述:僅有當引數中指定的Key存在時,該命令才會在其所關聯的List Value的頭部插入引數中給出的Value,否則將不會有任何操作發生。

返回值:插入後連結串列中元素的數量。

4、R*PUSHX命令*

命令原型:R****PUSHX key value

時間複雜度:O(1)

命令描述:僅有當引數中指定的Key存在時,該命令才會在其所關聯的List Value的尾部插入引數中給出的Value,否則將不會有任何操作發生。

返回值:插入後連結串列中元素的數量。

5、從列表左邊彈出元素

命令原型:LPOP key

時間複雜度:O(1)

命令描述:返回並彈出指定Key關聯的連結串列中的第一個元素,即頭部元素。如果該Key不存在,返回nil。LPOP命令執行兩步操作:第一步是將列表左邊的元素從列表中移除,第二步是返回被移除的元素值。

返回值:連結串列頭部的元素。

6、從列表右邊彈出元素

命令原型:RPOP key

時間複雜度:O(1)

命令描述:返回並彈出指定Key關聯的連結串列中的最後一個元素,即尾部元素。如果該Key不存在,返回nil。

返回值:連結串列尾部的元素。

7、獲取列表中元素的個數

命令原型:LLEN key

時間複雜度:O(1)

命令描述:返回指定Key關聯的連結串列中元素的數量,如果該Key不存在,則返回0。如果與該Key關聯的Value的型別不是連結串列,則返回相關的錯誤資訊。

返回值:連結串列中元素的數量。

8、獲得列表片段

命令原型:****LRANGE key start stop

時間複雜度:O(S+N)

命令描述:時間複雜度中的S為start參數列示的偏移量,N表示元素的數量。該命令的引數start和end都是0-based。即0表示連結串列頭部(leftmost)的第一個元素。其中start的值也可以為負值,-1將表示連結串列中的最後一個元素,即尾部元素,-2表示倒數第二個並以此類推。該命令在獲取元素時,start和end位置上的元素也會被取出。如果start的值大於連結串列中元素的數量,空連結串列將會被返回。如果end的值大於元素的數量,該命令則獲取從start(包括start)開始,連結串列中剩餘的所有元素。注:Redis的列表起始索引為0。顯然,LRANGE numbers 0 -1 可以獲取列表中的所有元素。

返回值:返回指定範圍內元素的列表。

9、刪除列表中指定的值

命令原型:****LREM key count value

時間複雜度:O(N)

命令描述:時間複雜度中N表示連結串列中元素的數量。在指定Key關聯的連結串列中,刪除前count個值等於value的元素。如果count大於0,從頭向尾遍歷並刪除,如果count小於0,則從尾向頭遍歷並刪除。如果count等於0,則刪除連結串列中所有等於value的元素。如果指定的Key不存在,則直接返回0。

返回值:返回被刪除的元素數量。

10、設定指定索引的元素值

命令原型:****LSET key index value

時間複雜度:O(N)

命令描述:時間複雜度中N表示連結串列中元素的數量。但是設定頭部或尾部的元素時,其時間複雜度為O(1)。設定連結串列中指定位置的值為新值,其中0表示第一個元素,即頭部元素,-1表示尾部元素。如果索引值Index超出了連結串列中元素的數量範圍,該命令將返回相關的錯誤資訊。

返回值:

11、獲取指定索引的元素值

命令原型:****LINDEX key index

時間複雜度:O(N)

命令描述:時間複雜度中N表示在找到該元素時需要遍歷的元素數量。對於頭部或尾部元素,其時間複雜度為O(1)。該命令將返回連結串列中指定位置(index)的元素,index是0-based,表示頭部元素,如果index為-1,表示尾部元素。如果與該Key關聯的不是連結串列,該命令將返回相關的錯誤資訊。

返回值:返回請求的元素,如果index超出範圍,則返回nil。

12、只保留列表指定片段

命令原型:****LTRIM key start stop

時間複雜度:O(N)

命令描述:N表示被刪除的元素數量。該命令將僅保留指定範圍內的元素,從而保證連結中的元素數量相對恆定。start和stop引數都是0-based,0表示頭部元素。和其他命令一樣,start和stop也可以為負值,-1表示尾部元素。如果start大於連結串列的尾部,或start大於stop,該命令不報錯,而是返回一個空的連結串列,與此同時該Key也將被刪除。如果stop大於元素的數量,則保留從start開始剩餘的所有元素。

返回值:

13、向列表中插入元素

命令原型:****LINSERT key BEFORE|AFTER pivot value

時間複雜度:O(N)

命令描述:時間複雜度中N表示在找到該元素pivot之前需要遍歷的元素數量。這樣意味著如果pivot位於連結串列的頭部或尾部時,該命令的時間複雜度為O(1)。該命令的功能是在pivot元素的前面或後面插入引數中的元素value。如果Key不存在,該命令將不執行任何操作。如果與Key關聯的Value型別不是連結串列,相關的錯誤資訊將被返回。

返回值:成功插入後連結串列中元素的數量,如果沒有找到pivot,返回-1,如果key不存在,返回0。

14、將元素從一個列表轉到另一個列表

命令原型:****RPOPLPUSH source destination

時間複雜度:O(1)

命令描述:原子性的從與source鍵關聯的連結串列尾部彈出一個元素,同時再將彈出的元素插入到與destination鍵關聯的連結串列的頭部。如果source鍵不存在,該命令將返回nil,同時不再做任何其它的操作了。如果source和destination是同一個鍵,則相當於原子性的將其關聯連結串列中的尾部元素移到該連結串列的頭部。

RPOPLPUSH是個很有意思的命令,從名字就可以看出它的功能:先執行RPOP命令再執行LPUSH命令。RPOPLPUSH命令會先從source 列表型別鍵的右邊彈出一個元素,然後將其加入到destination 列表型別鍵的左邊,並返回這個元素的值,整個過程是原子的。

返回值:返回彈出和插入的元素。

2.3.3、List 應用場景

1、訊息佇列

2、更新最新動態

2.4、Hash 雜湊

2.4.1、概念

  • 我們可以將Redis中的Hash型別看成具有String Key和String Value的map容器。所以該型別非常適合於儲存值物件的資訊。如Username、Password和Age等。如果Hash中包含很少的欄位,那麼該型別的資料也將僅佔用很少的磁碟空間。每一個Hash可以儲存4294967295個鍵值對。

2.4.2、相關命令

1、賦值命令

命令原型:****HSET key field value

時間複雜度:O(1)

命令描述:為指定的Key設定Field/Value對,如果Key不存在,該命令將建立新Key以用於儲存引數中的Field/Value對,如果引數中的Field在該Key中已經存在,則用新值覆蓋其原有值。

返回值:1表示新的Field被設定了新值,0表示Field已經存在,用新值覆蓋原有值。

2、取值命令

命令原型:****HGET key field

時間複雜度:O(1)

命令描述:返回指定Key中指定Field的關聯值。

返回值:返回引數中Field的關聯值,如果引數中的Key或Field不存在,返回nil。

3、判斷欄位是否存在

命令原型:****HEXISTS key field

時間複雜度:O(1)

命令描述:判斷指定Key中的指定Field是否存在。

返回值:1表示存在,0表示引數中的Field或Key不存在。

4、獲得欄位數量

命令原型:****HLEN key

時間複雜度:O(1)

命令描述:獲取該Key所包含的Field的數量。

返回值:返回Key包含的Field數量,如果Key不存在,返回0。

5、刪除欄位

命令原型:****HDEL key field [field ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示引數中待刪除的欄位數量。從指定Key的Hashes Value中刪除引數中指定的多個欄位,如果不存在的欄位將被忽略。如果Key不存在,則將其視為空Hashes,並返回0。

返回值:實際刪除的Field數量。

6、當欄位不存在時賦值

命令原型:****HSETNX key field value

時間複雜度:O(1)

命令描述:只有當引數中的Key或Field不存在的情況下,為指定的Key設定Field/Value對,否則該命令不會進行任何操作。

返回值:1表示新的Field被設定了新值,0表示Key或Field已經存在,該命令沒有進行任何操作。

7、增加數字

命令原型:****HINCRBY key field increment

時間複雜度:O(1)

命令描述:增加指定Key中指定Field關聯的Value的值。如果Key或Field不存在,該命令將會建立一個新Key或新Field,並將其關聯的Value初始化為0,之後再指定數字增加的操作。該命令支援的數字是64位有符號整型,即increment可以負數。

返回值:返回運算後的值。

8、獲取指定鍵中所有的欄位/值

命令原型:****HGETALL key

時間複雜度:O(N)

命令描述:時間複雜度中的N表示Key包含的Field數量。獲取該鍵包含的所有Field/Value。其返回格式為一個Field、一個Value,並以此類推。

返回值:Field/Value的列表。

9、只獲取欄位名

命令原型:HKEYS key

時間複雜度:O(N)

命令描述:時間複雜度中的N表示Key包含的Field數量。返回指定Key的所有Fields名。

返回值:Field的列表。

10、只獲取欄位值

命令原型:HVALS key

時間複雜度:O(N)

命令描述:時間複雜度中的N表示Key包含的Field數量。返回指定Key的所有Values名。

返回值:value的列表。

11、設定多個欄位的值

命令原型:****HMSET key field value [field value ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示被設定的Field數量。逐對依次設定引數中給出的Field/Value對。如果其中某個Field已經存在,則用新值覆蓋原有值。如果Key不存在,則建立新Key,同時設定引數中的Field/Value。

返回值:

12、獲取多個欄位的值

命令原型:HMGET key field [field ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示請求的Field數量。獲取和引數中指定Fields關聯的一組Values。如果請求的Field不存在,其值返回nil。如果Key不存在,該命令將其視為空Hash,因此返回一組nil。

返回值:返回和請求Fields關聯的一組Values,其返回順序等同於Fields的請求順序。

2.4.3、Hash 應用場景

1、Hash 更適合物件的儲存,String 更適合字串的儲存。

2.5、Set 集合

2.5.1、概念

  • Redis的Set是string型別的 無序集合 ,集合成員是 唯一 的,這就意味著集合中不能出現重複的資料。
  • Redis 中 集合是通過 雜湊表 實現的,所以新增,刪除,查詢的複雜度都是O(1)。
  • 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可儲存 40多億 個成員)。

2.5.2、相關命令

1、增加元素

命令原型:****SADD key member [member ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示操作的成員數量。如果在插入的過程用,引數中有的成員在Set中已經存在,該成員將被忽略,而其它成員仍將會被正常插入。如果執行該命令之前,該Key並不存在,該命令將會建立一個新的Set,此後再將引數中的成員陸續插入。如果該Key的Value不是Set型別,該命令將返回相關的錯誤資訊。

返回值:本次操作實際插入的成員數量。

2、獲得集合中元素個數

命令原型:****SCARD key

時間複雜度:O(1)

命令描述:獲取Set中成員的數量。

返回值:返回Set中成員的數量,如果該Key並不存在,返回0。

3、判斷元素是否在集合中

命令原型:****SISMEMBER key member

時間複雜度:O(1)

命令描述:判斷引數中指定成員是否已經存在於與Key相關聯的Set集合中。

返回值:1表示已經存在,0表示不存在,或該Key本身並不存在。

4、獲得集合中的所有元素

命令原型:****SMEMBERS key

時間複雜度:O(N)

命令描述:時間複雜度中的N表示Set中已經存在的成員數量。獲取與該Key關聯的Set中所有的成員。

返回值:返回Set中所有的成員。

5、從集合中彈出一個元素

命令原型:****SPOP key

時間複雜度:O(1)

命令描述:隨機的移除並返回Set中的某一成員。 由於Set中元素的佈局不受外部控制,因此無法像List那樣確定哪個元素位於Set的頭部或者尾部。

返回值:返回移除的成員,如果該Key並不存在,則返回nil。

6、刪除元素

命令原型:****SREM key member [member ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示被刪除的成員數量。從與Key關聯的Set中刪除引數中指定的成員,不存在的引數成員將被忽略,如果該Key並不存在,將視為空Set處理。

返回值:從Set中實際移除的成員數量,如果沒有則返回0。

7、隨機獲得集合中的元素

命令原型:****SRANDMEMBER key [count]

時間複雜度:O(1)

命令描述:和SPOP一樣,隨機的返回Set中的一個成員,不同的是該命令並不會刪除返回的成員。還可以傳遞count引數來一次隨機獲得多個元素,根據count的正負不同,具體表現也不同。當count 為正數時,SRANDMEMBER 會隨機從集合裡獲得count個不重複的元素。如果count的值大於集合中的元素個數,則SRANDMEMBER 會返回集合中的全部元素。當count為負數時,SRANDMEMBER 會隨機從集合裡獲得|count|個的元素,這些元素有可能相同。

返回值:返回隨機位置的成員,如果Key不存在則返回nil。

8、將元素從一個集合轉到另一個集合

命令原型:****SMOVE source destination member

時間複雜度:O(1)

命令描述:原子性的將引數中的成員從source鍵移入到destination鍵所關聯的Set中。因此在某一時刻,該成員或者出現在source中,或者出現在destination中。如果該成員在source中並不存在,該命令將不會再執行任何操作並返回0,否則,該成員將從source移入到destination。如果此時該成員已經在destination中存在,那麼該命令僅是將該成員從source中移出。如果和Key關聯的Value不是Set,將返回相關的錯誤資訊。

返回值:1表示正常移動,0表示source中並不包含引數成員。

9、集合間差集運算

命令原型:****SDIFF key [key ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示所有Sets中成員的總數量。返回引數中第一個Key所關聯的Set和其後所有Keys所關聯的Sets中成員的差異。如果Key不存在,則視為空Set。

返回值:差異結果成員的集合。

10、集合間差集運算並將結果儲存

命令原型:****SDIFFSTORE destination key [key ...]

時間複雜度:O(N)

命令描述:該命令和SDIFF命令在功能上完全相同,兩者之間唯一的差別是SDIFF返回差異的結果成員,而該命令將差異成員儲存在destination關聯的Set中。如果destination鍵已經存在,該操作將覆蓋它的成員。

返回值:返回差異成員的數量。

11、集合間交集運算

命令原型:****SINTER key [key ...]

時間複雜度:O(N*M)

命令描述:時間複雜度中的N表示最小Set中元素的數量,M則表示引數中Sets的數量。該命令將返回引數中所有Keys關聯的Sets中成員的交集。因此如果引數中任何一個Key關聯的Set為空,或某一Key不存在,那麼該命令的結果將為空集。

返回值:交集結果成員的集合。

12、集合間交集運算並將結果儲存

命令原型:****SINTERSTORE destination key [key ...]

時間複雜度:O(N*M)

命令描述:命令和SINTER命令在功能上完全相同,兩者之間唯一的差別是SINTER返回交集的結果成員,而該命令將交整合員儲存在destination關聯的Set中。如果destination鍵已經存在,該操作將覆蓋它的成員。

返回值:返回交整合員的數量。

13、集合間並集運算

命令原型:****SUNION key [key ...]

時間複雜度:O(N)

命令描述:時間複雜度中的N表示所有Sets中成員的總數量。該命令將返回引數中所有Keys關聯的Sets中成員的並集。

返回值:並集結果成員的集合。

14、集合間並集運算並將結果儲存

命令原型:****SUNIONSTORE destination key [key ...]

時間複雜度:O(N)

命令描述:該命令和SUNION命令在功能上完全相同,兩者之間唯一的差別是SUNION返回並集的結果成員,而該命令將並整合員儲存在destination關聯的Set中。如果destination鍵已經存在,該操作將覆蓋它的成員。

返回值:返回並整合員的數量

2.5.3、Set 應用場景

1、使用場景: ①交集,並集,差集:(Set)

//book表儲存book名稱set book:1:name    ”The Ruby Programming Language”set book:2:name     ”Ruby on rail”set book:3:name     ”Programming Erlang” //tag表使用集合來儲存資料,因為集合擅長求交集、並集sadd tag:ruby 1 sadd tag:ruby 2 sadd tag:web 2 sadd tag:erlang 3//即屬於ruby又屬於web的書?inter_list = redis.sinter("tag.web", "tag:ruby") //即屬於ruby,但不屬於web的書?inter_list = redis.sdiff("tag.ruby", "tag:web") //屬於ruby和屬於web的書的合集?inter_list = redis.sunion("tag.ruby", "tag:web")

2.6、Zset 有序集合

2.6.1、概念

  • 不同的是每個元素都會關聯一個double型別的分數(score)。redis正是通過分數來為集合中的成員進行從小到大的排序。score相同:按字典順序排序
  • 有序集合的成員是唯一的,但分數(score)卻可以重複

2.6.2、相關命令

1、增加元素

命令原型:****ZADD key score member [score] [member]

時間複雜度:O(log(N))

命令描述:時間複雜度中的N表示Sorted Set中成員的數量。新增引數中指定的所有成員及其分數到指定key的Sorted Set中,在該命令中我們可以指定多組score/member作為引數。如果在新增時引數中的某一成員已經存在,該命令將更新此成員的分數為新值,同時再將該成員基於新值重新排序。如果鍵不存在,該命令將為該鍵建立一個新的Sorted Set Value,並將score/member對插入其中。如果該鍵已經存在,但是與其關聯的Value不是Sorted Set型別,相關的錯誤資訊將被返回。

返回值:本次操作實際插入的成員數量。

2、獲得集合中元素個數

命令原型:Z****CARD key

時間複雜度:O(1)

命令描述:獲取與該Key相關聯的Sorted Set中包含的成員數量。

返回值:返回Sorted Set中的成員數量,如果該Key不存在,返回0。

3、獲得指定分數範圍內的元素個數

命令原型:****ZCOUNT key min max

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted-Sets中成員的數量,M則表示min和max之間元素的數量。該命令用於獲取分數(score)在min和max之間的成員數量。針對min和max引數需要額外說明的是,-inf和+inf分別表示Sorted-Sets中分數的最高值和最低值。**預設情況下,min和max表示的範圍是閉區間範圍,即min <= score <= max內的成員將被返回。然而我們可以通過在min和max的前面新增"("字元來表示開區間,如(min max表示min < score <= max,而(min (max表示min < score < max。

返回值:分數指定範圍內成員的數量。

4、獲得元素的分數

命令原型:****ZSCORE key member

時間複雜度:O(1)

命令描述:獲取指定Key的指定成員的分數。

返回值:如果該成員存在,以字串的形式返回其分數,否則返回nil。

5、增加某個元素的分數

命令原型:****ZINCRBY key increment member

時間複雜度:O(log(N))

命令描述:時間複雜度中的N表示Sorted Set中成員的數量。該命令將為指定Key中的指定成員增加指定的分數。如果成員不存在,該命令將新增該成員並假設其初始分數為0,此後再將其分數加上increment。如果Key不存在,該命令將建立該Key及其關聯的Sorted Set,幷包含引數指定的成員,其分數為increment引數。如果與該Key關聯的不是Sorted Set型別,相關的錯誤資訊將被返回。

返回值:以字串形式表示的新分數。

6、獲得排名在某個範圍的元素列表

命令原型:****ZRANGE key start stop [WITHSCORES]

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示返回的成員數量。該命令返回順序在引數start和stop指定範圍內的成員,這裡start和stop引數都是0-based,即0表示第一個成員,-1表示最後一個成員。如果start大於該Sorted Set中的最大索引值,或start > stop,此時一個空集合將被返回。如果stop大於最大索引值,該命令將返回從start到集合的最後一個成員。如果命令中帶有可選引數WITHSCORES選項,該命令在返回的結果中將包含每個成員的分數值,如value1,score1,value2,score2...。  

返回值:返回索引在start和stop之間的成員列表。

7、獲得排名在某個範圍的元素列表(元素分數從大到小排序)

命令原型:****ZREVRANGE key start stop [WITHSCORES]

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示返回的成員數量。該命令的功能和ZRANGE基本相同,唯一的差別在於該命令是通過反向排序獲取指定位置的成員,即從高到低的順序。如果成員具有相同的分數,則按降序字典順序排序。

返回值:返回指定的成員列表。

8、獲得指定分數範圍的元素

命令原型:****ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示返回的成員數量。該命令將返回分數在min和max之間的所有成員,即滿足表示式min <= score <= max的成員,其中返回的成員是按照其分數從低到高的順序返回,如果成員具有相同的分數,則按成員的字典順序返回。可選引數LIMIT用於限制返回成員的數量範圍。可選引數offset表示從符合條件的第offset個成員開始返回,同時返回count個成員。可選引數WITHSCORES的含義參照ZRANGE中該選項的說明。最後需要說明的是引數中min和max的規則可參照命令ZCOUNT。

返回值:返回分數在指定範圍內的成員列表。

9、獲得指定分數範圍的元素(元素分數從大到小排序)

命令原型:****ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示返回的成員數量。該命令除了排序方式是基於從高到低的分數排序之外,其它功能和引數含義均與ZRANGEBYSCORE相同。需要注意的是該命令中的min和max引數的順序和ZRANGEBYSCORE命令是相反的。

返回值:返回分數在指定範圍內的成員列表。

10、獲得元素的排名

命令原型:****ZRANK key member

時間複雜度:O(log(N))

命令描述:時間複雜度中的N表示Sorted Set中成員的數量。Sorted Set中的成員都是按照分數從低到高的順序儲存,該命令將返回引數中指定成員的位置值,其中0表示第一個成員,它是Sorted Set中分數最低的成員。

返回值:如果該成員存在,則返回它的位置索引值。否則返回nil。

11、獲得元素的排名(元素分數從大到小排序)

命令原型:****ZREVRANK key member

時間複雜度:O(log(N))

命令描述:時間複雜度中的N表示Sorted Set中成員的數量。該命令的功能和ZRANK基本相同,唯一的差別在於該命令獲取的索引是從高到低排序後的位置,同樣0表示第一個元素,即分數最高的成員。

返回值:如果該成員存在,則返回它的位置索引值。否則返回nil。

12、刪除一個或多個元素

命令原型:****ZREM key member [member ...]

時間複雜度:O(M log(N))

命令描述:時間複雜度中N表示Sorted Set中成員的數量,M則表示被刪除的成員數量。該命令將移除引數中指定的成員,其中不存在的成員將被忽略。如果與該Key關聯的Value不是Sorted Set,相應的錯誤資訊將被返回。

返回值:實際被刪除的成員數量。

13、按照排名範圍刪除元素

命令原型:****ZREMRANGEBYRANK key start stop

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示被刪除的成員數量。刪除索引位置位於start和stop之間的成員,start和stop都是0-based,即0表示分數最低的成員,-1表示最後一個成員,即分數最高的成員。

返回值:被刪除的成員數量

14、按照分數範圍刪除元素

命令原型:*ZREMRANGEBYSCORE* key start stop

時間複雜度:O(log(N)+M)

命令描述:時間複雜度中的N表示Sorted Set中成員的數量,M則表示被刪除的成員數量。刪除分數在min和max之間的所有成員,即滿足表示式min <= score <= max的所有成員。對於min和max引數,可以採用開區間的方式表示,具體規則參照ZCOUNT。

返回值:被刪除的成員數量。

2.6.3、Zset 應用場景

  • set排序 儲存班級成績表 工資表排序!
  • 普通訊息,1.重要訊息 2.帶權重進行判斷
  • 排行榜應用實現,取Top N測試

2.7、三種特殊資料型別

2.7.1、Geospatial(地理位置)

  • 使用經緯度定位地理座標並用一個 有序集合 Zset 儲存 ,所以 zset 命令也可以使用
  • 有效的經度從-180度到180度。
  • 有效的緯度從-85.05112878度到85.05112878度。

2.7.2、Hyperloglog(基數統計)

  • HyperLogLog 是用來做基數統計的演算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且是很小的。 花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數。 因為 HyperLogLog 只會根據輸入元素來計算基數,而不會儲存輸入元素本身,所以 HyperLogLog 不能像集合那樣,返回輸入的各個元素。 其底層使用string資料型別
  • 什麼是基數:資料集中不重複的元素的個數。

2.7.3、BitMaps(點陣圖)

  • 使用位儲存,資訊狀態只有 0 和 1,Bitmap是一串連續的2進位制數字(0或1),每一位所在的位置為偏移(offset),在bitmap上可執行AND,OR,XOR,NOT以及其它位操作。

相關文章