【Redis】常用命令彙總

1 配置、啓動、操作、關閉 Redis

可執行文件 作用
redis-server 啓動 Redis
redis-cli Redis 命令行客戶端
redis-benchmark Redis 基準測試工具
redis-check-aof Redis AOF 持久化文件檢測和修復工具
redis-check-dump Redis RDB 持久化文件檢測和修復工具
redis-sentinel 啓動 Redis Sentinel

1.1 啓動 Redis

有三種方法啓動 Redis:默認配置、運行配置、配置文件啓動。

(1)默認配置

redis-server

(2)運行配置

redis-server --configKey1 configValue1 --configKey2 configValue2

e.g.
redis-server --port 6379

(3)配置文件啓動

redis-server /opt/redis/redis.conf

1.2 Redis 命令行客戶端

redis-cli -h {host} -p {port}

  • 沒有 -h 參數默認連接 127.0.0.1
  • 沒有 -p 參數默認 6379 端口

1.3 停止 Redis 服務

redis-cli shutdown

  • Redis 關閉的過程:斷開與客戶端的連接、持久化文件生成,是一種相對優雅的關閉方式。
  • 除了可以通過 shutdown 命令關閉 Redis 服務以外,還可以通過 kill 進程號的方式關閉,但不要粗暴使用 kill -9 強制殺死 Redis 服務,不但不會做持久化操作,還會造成緩衝區等資源不能被優雅關閉,極端情況會造成 AOF 和複製丟失數據的情況。
  • shutdown 還有一個參數,代表是否在關閉 Redis 前,生成持久化文件:

redis-cli shutdown nosave|save


2 常用 API

2.1 全局命令

2.1.1 查看所有鍵

(1)全量遍歷鍵

該命令會將所有的鍵輸出。

keys *

  • * 代表匹配任意字符;
  • ? 代表匹配一個字符;
  • [ ] 代表匹配部分字符,例如[1,3]代表匹配 1,3,[1-10]代表匹配 1 到 10 的任意數字;
  • \x 用來轉義,例如要匹配星號、問號需要進行轉義。

(2)漸進式遍歷

keys 命令可能會帶來阻塞線程的問題,因此推薦使用 scan 命令進行遍歷。Redis 還提供了 hscan、sscan、zscan 漸進式地遍歷 hash、set、zset。

scan cursor [match pattern] [count number]

  • cursor 是必須參數,實際上 cursor 是一個遊標,第一次遍歷從 0 開始,每次 scan 遍歷萬都會返回當前遊標的值,知道遊標值爲 0,表示遍歷結束;
  • match pattern 是可選參數,它的作用是做模式的匹配,這點跟 keys 的模式很像;
  • count number 是可選參數,它的作用是標明每次要遍歷的鍵個數,默認值是 10,此參數可以適當增大。

2.1.2 鍵總數

該命令會返回當前數據庫中鍵的總數。

dbsize

2.1.3 檢查鍵是否存在

如果鍵存在,該命令返回 1,否則返回 0。

exists key

2.1.4 刪除鍵

del 是一個通用命令,無論值是什麼數據結構類型,del 命令都可以將其刪除,返回結果爲成功刪除鍵的個數,假設刪除一個不存在的鍵,就會返回 0。同時 del 命令可以支持刪除多個鍵。

del key [key …]

2.1.5 鍵過期

Redis 支持對鍵添加過期時間,當超過過期時間後,會自動刪除鍵。

expire key seconds
expireat key timestamp

e.g.
set hello world
expire hello 10

  • expire key seconds:鍵在 seconds 秒後過期;
  • expireat key timestamp:鍵在秒級時間戳 timestamp 後過期

ttl 和 pttl 命令會返回鍵的剩餘過期時間,但是 pttl 精度更高可以達到毫秒級別,有 3 種返回值:

  • 大於等於 0 的整數:鍵剩餘的過期時間
  • -1:鍵沒設置過期時間
  • -2:鍵不存在

ttl key

除此之外,Redis 2.6 版本後提供了毫秒級的過期方案:

pexpire key milliseconds
pexpireat key milliseconds-timestamp

  • pexpire key milliseconds:鍵在 milliseconds 毫秒後過期;
  • pexpireat key milliseconds-timestamp:鍵在毫秒級時間戳 timestamp 後過期。

但無論是使用過期時間還是時間戳,秒級還是毫秒級,在 Redis 內部最終使用的都是 pexpireat。

注意,對於字符串類型鍵,執行 set 命令會去掉過期時間。

2.1.6 鍵的數據結構類型

例如鍵 hello 是字符串類型,返回結果爲 string,鍵 mylist 是列表類型,返回結果爲 list。如果鍵不存在,則返回 none。

type key

2.1.7 鍵重命名

rename key newkey

2.1.8 隨機返回一個鍵

randomkey

2.1.9 遷移鍵

(1)move

move key db

(2)dump + restore

dump key
restore key ttl value

  1. 在源 Redis 上,dump 命令會將鍵值序列化,格式採用的是 RDB 格式;
  2. 在目標 Redis 上,restore 命令將上面序列化的值進行復原,其中 ttl 參數代表過期時間,如果 ttl=0 代表沒有過期時間。

(3)migrate

migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key …]]

migrate 命令是將 dump、restore、del 三個命令進行組合,從而簡化了操作流程。migrate 具有原子性。

  • host:目標 Redis 的 IP 地址;
  • port: 目標 Redis 的端口;
  • key|"":在 Redis 3.0.6 版本之前,migrate 只支持遷移一個鍵,所以此處是要遷移的鍵,之後的版本支持多個鍵,此處爲空字符串"";
  • destination-db:目標 Redis 的數據庫索引,例如要遷移到 0 號數據庫,這裏就寫 0;
  • timeout:遷移的超時時間(單位爲毫秒);
  • [copy]:如果添加此選項,遷移後並不刪除源鍵;
  • [replace]:如果添加此選項,migrate 不管目標 Redis 是否存在該鍵都會正常遷移進行數據覆蓋;
  • [keys key [key …]]:遷移多個鍵。

2.1.10 切換數據庫

由於 Redis 是單線程的,因此不建議使用,若需要多個數據庫,推薦在一臺機器上部署多個 Redis 實例。

select dbIndex

2.1.11 清除數據庫

flushdb/flushall

兩者的區別在於 flushdb 只清除當前數據庫,flushall 會清除所有數據庫。

2.2 數據接口和內部編碼

type 命令實際返回的就是當前鍵的數據結構類型,它們分別是:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但這些只是 Redis 對外的數據結構。

實際上每種數據結構都有自己底層的內部編碼實現,而且是多種實現,這樣 Redis 會在覈實的場景選擇合適的內部編碼。可以通過以下命令查看內部編碼:

object encoding key

2.3 單線程架構

Redis 使用了單線程架構I/O 多路複用模型來實現高性能的內存數據服務。

因爲 Redis 是單線程來處理命令的,所以一條命令從客戶端達到服務端不會立刻被執行,所有命令都會進入一個隊列中,然後逐個被執行。

爲什麼 Redis 使用單線程模型會達到每秒萬級別的處理能力呢?可以將其歸結爲 3 點:

  1. 純內存訪問,Redis 將所有數據放在內存中,內存的響應市場大約爲 100 納秒;
  2. 非阻塞 I/O,Redis使用 epoll 作爲 I/O 多路複用技術的實現,再加上 Redis 自身的事件處理模型將 epoll 中的鏈接、讀寫、關閉都轉換爲事件,不在網絡 I/O 上浪費過多的時間;
  3. 單線程避免了線程切換和競態產生的消耗。

2.4 字符串

字符串類型的值實際可以是字符串(簡單的字符串、複雜的字符串(例如 JSON、XML))、數字(整數、浮點數),甚至是二進制(圖片、音頻、視頻),但是值最大不能超過 512MB。

2.4.1 常用命令

(1)設置值

set key value [ex seconds] [px milliseconds] [nx|xx]

set 命令有幾個選項:

  • ex seconds:爲鍵設置秒級過期時間。
  • px milliseconds:爲鍵設置毫秒級過期時間。
  • nx:鍵必須不存在,纔可以設置成功,用於添加。
  • xx:鍵必須存在你,纔可以設置成功,用於更新。

除了 set 選項,Redis 還提供了 setex 和 setnx 兩個命令:

setex key seconds value
setnx key value

它們的作用跟 ex 和 nx 選項是一樣的。

(2)獲取值

如果要獲取的鍵不存在,該命令會返回 nil(空)

get key

(3)批量設置值

mset key value [key value …]

e.g. mset a 1 b 2 c 3

(4)批量獲取值

mget key [key …]

(5)計數

incr key

incr 命令用於對值做自增操作,返回結果分爲三種:

  • 值不是整數,返回錯誤;
  • 值是整數,返回自增後的結果;
  • 鍵不存在,按照值爲0自增,返回結果爲 1。

除了 incr 命令,Redis 提供了 decr(自減)、incrby(自增指定數字)、decrby(自減指定數字)、incrbyfloat(自增浮點數):

decr key
incrby key increment
decrby key decrement
incrbyfloat key increment

2.4.2 不常用命令

(1)追加值

append可以向字符串尾部追加值。

append key value

(2)字符串長度

返回字符串長度,英文字母佔 1 個字節,每個中文佔 3 個字節。

strlen key

(3)設置並返回原值

getset 和 set 一樣會設置值,但是不同的是,它同時會返回鍵原來的值,若原來不存在,返回 nil。

getset key

(4)設置指定位置的字符

setrange key offeset value

e.g.
set redis pest # 返回 OK
setrange redis 0 b # 返回 (integer) 4
get redis # 返回 “best”

(5)獲取部分字符串

getrange key start end

start 和 end 分別是開始和結束的偏移量(都是閉區間),偏移量從 0 開始計算。

命令 時間複雜度
set key value O(1)
get key O(1)
del key [key …] O(k),k 是鍵的個數
mset key value [key value …] O(k),k 是鍵的個數
mget key [key …] O(k),k 是鍵的個數
incr key O(1)
decr key O(1)
incrby key increment O(1)
decrby key decrement O(1)
incrbyfloat key increment O(1)
append key value O(1)
strlen key O(1)
setrange key offset value O(1)
getrange key start end O(n),n 是字符串長度,由於獲取字符串非常快,
所以如果字符串不是很長,可以視同爲 O(1)

2.4.3 內部編碼

字符串類型的內部編碼有 3 種:

  • int:8 個字節的長整型。
  • embstr:小於等於 39 個字節的字符串。
  • raw:大於 39 個字節的字符串。

2.4.4 典型應用

(1)緩存功能
使用 Redis 作爲緩存,MySQL 作爲存儲層,大部分請求的數據從 Redis 中獲取,如果沒有獲取到,則需要從 MySQL 中獲取,並將結果回寫到 Redis,添加過期時間(如 1 小時)。

hit
return
miss
write cache
return
Web 服務
Redis 緩存層
MySQL 存儲層
UserInfo getUserInfo(long id){
	userRedisKey = "user:info:" + id;
	value = redis.get(userRedisKey);
	UserInfo userInfo;
	if(value != null){// Redis中有緩存,直接讀取緩存
		userInfo = deserialize(value);
	} else {// Redis緩存爲空,從mysql中獲取並寫入Redis緩存
		userInfo = mysql.get(id);
		if(userInfo != null)
			redis.setex(userRedisKey,3600,serialize(userInfo));
	}
	return userInfo;
}

(2)計數
實現快速計數、查詢緩存的功能,同時數據可以異步落地到其他數據源。例如視頻播放數系統,用戶每播放一次數據,相應的視頻播放數就自增1。

long incrVideoCounter(long id){
	key = "video:playCount:" + id;
	return redis.incr(key);
}

(3)共享 Session
可以使用 Redis 將用戶的 Session 進行集中管理,在這種模式下只要保證 Redis 是高可用和擴展性的,每次用戶更新或者查詢登錄信息都直接從 Redis 中集中獲取。

用戶
Web 服務 1
Web 服務 2
Web 服務 3
Redis
所有 Session

(4)限速
利用過期時間,可以限制用戶每分鐘獲取驗證碼的頻率,例如一分鐘不能超過5次,僞代碼如下:

phoneNum = "188xxxxxxxx";
key = "shortMsg:limit" + phoneNum;
// SET key value EX 60 NX
isExists = redis.set(key,1,"EX 60","NX");
if(isExists != null || redis.incr(key) <=5){
	// 通過
} else {
	// 限速
}

2.5 哈希

在 Redis 中,哈希類型是指鍵值本身又是一個鍵值對結構,形如 value={{field1,value1},…,{fieldN,valueN}}。

2.5.1 命令

(1)設置值

hset key field value

如果設置成功會返回 1,反之會返回 0。此外 Redis 提供了 hsetnx 命令,它們的關係就像 set 和 setnx 命令一樣,只不過作用於由鍵變爲 field

(2)獲取值

hget key field

如果鍵或field不存在,會返回 nil。

(3)刪除 field

hdel key field [field …]

hdel 會刪除一個或多個 field,返回結果爲成功刪除 field 的個數。

(4)計算 field 個數

hlen key

(5)批量設置或獲取 field-value

hmget key field [field …]
hmset key field value [field value …]

(6)判斷 field 是否存在

hexists key field

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

(7)獲取所有 field

hkeys key

hkeys 命令應該叫 hfields 更爲恰當,它返回指定哈希鍵所有的 field。

(8)獲取所有 value

hvals key

(9)獲取所有的 field-value

hgetall key

(10)hincrby hincrbyfloat

hincrby key field
hincrbyfloat key field

hincrby 和 hincrbyfloat,就像 incrby 和 incrbyfloat 命令一樣,但是它們的作用域是 field。

(11)計算 value 的字符串長度(需要 Redis 3.2 以上)

hstrlen key field

命令 時間複雜度
hset key field value O(1)
hget key field O(1)
hdel key field [field …] O(k),k 是 field 的個數
hlen key O(1)
hgetall key O(n),n 是 field 總數
hmget key field [field …] O(k),k 是 field 的個數
hmset key field value [field value …] O(k),k 是 field 的個數
hexists key field O(1)
hkeys key O(n),n 是 field 總數
hvals key O(n),n 是 field 總數
hsetnx key field value O(1)
hincrby key field increment O(1)
hincrbyfloat key field increment O(1)
hstrlen key field O(1)

2.5.2 內部編碼

哈希類型的內部編碼有兩種:

  • ziplist(壓縮列表):當哈希類型元素個數小於 hash-max-ziplist-entries 配置(默認 512 個),同時所有值都小於 hash-max-ziplist-value 配置(默認 64 字節)時,Redis 會使用 ziplist 作爲哈希的內部實現,ziplist 使用更加緊湊的結構實現多個元素的連續存儲,所以在節省內存方面比 hashtable 更加優秀。
  • hashtable(哈希表):當哈希類型無法滿足 ziplist 的條件時,Redis 會使用 hashtable 作爲哈希的內部實現,因爲此時 ziplist 的讀寫效率會下降,而 hashtable 的讀寫時間複雜度爲 O(1)。

2.6 列表

列表(list)類型是用來存儲多個有序的字符串,列表是有序的,列表中的每個字符串成爲元素(element),一個列表最多可以存儲 232-1 個元素。在 Redis 中,可以對列表兩段插入(push)和彈出(pop),還可以獲取指定範圍的元素列表、獲取指定索引下標的元素等。列表是一種比較靈活的數據結構,它可以充當棧和隊列的角色,在實際開發上有很多應用場景。

2.6.1 命令

(1)添加操作

rpush 從右邊插入元素,返回 list 長度。

rpush key value [value …]

lpush 從左邊插入元素,返回 list 長度。

lpush key value [value …]

linsert 向某個元素前或者後插入元素,該命令會從列表中找到等於 pivot 的元素,在其前(before)或者後(after)插入一個新的元素 value,返回 list 長度。

linsert key before|after pivot value

(2)查找

獲取指定範圍內的元素列表,其中最右元素索引下標可以寫成 -1,且 start 和 end 均爲閉區間,這個和很多編程語言右開區間不太相同。

lrange key start end

獲取列表指定索引下標的元素。

lindex key index
e.g. lindex key -1

獲取列表長度。

llen key

(3)刪除

lpop 從列表左側彈出元素。

lpop key

rpop 從列表右側彈出元素。

rpop key

lrem 刪除指定元素,該命令會從列表中找到等於 value 的元素進行刪除,根據 count 的不同分爲三種:

  • count > 0,從左到右,刪除最多 count 個元素;
  • count < 0,從右到做,刪除最多 count 絕對值個元素;
  • count = 0,刪除所有。

lrem key count value

按照索引範圍修剪列表,其中 start 和 end 均是閉區間,只保留 start 到 end 的元素。

ltrim key start end

(4)修改

修改指定索引下標的元素:

lset key index newValue

(5)阻塞操作

阻塞式彈出如下:

blpop key [key …] timeout
brpop key [key …] timeout

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,它們除了彈出方向不同,使用方法基本相同。

  • key [key …]:多個列表的鍵。
  • timeout:阻塞時間(單位:秒)。
  1. 列表爲空,如果 timeout=3,那麼客戶端要等到3秒後返回,如果 timeout=0,那麼客戶端會一直阻塞等下去,如果在此期間添加了數據 element1,客戶端立即返回;
  2. 列表不爲空,客戶端會立即返回
  3. 如果多個客戶端對同一個鍵執行 brpop,那麼最先執行 brpop 命令的客戶端可以獲取到彈出的值,其他客戶端繼續阻塞。
命令 時間複雜度
rpush key value [value …] O(k),k 是元素個數
lpush key value [value …] O(k),k 是元素個數
linsert key before|after pivot value O(n),n 是 pivot 距離列表頭或尾的距離
lrange key start end O(s+n),s 是 start 偏移量,n 是 start 到 end 的範圍
lindex key index O(n),n 是索引的偏移量
llen key O(1)
lpop key O(1)
rpop key O(1)
lremkey count value O(n),n 是列表長度
ltrim key start end O(n),n 是索引的偏移量
lset key index value O(n),n 是索引的偏移量
blpop brpop O(1)

2.6.2 內部編碼

列表類型的內部編碼有兩種:

  • ziplist(壓縮列表):當列表的元素個數小於 list-max-ziplist-entries 配置(默認 512 個),同時列表中每個元素的值都小於 list-max-ziplist-value 配置時(默認 64 字節),Redis 會選用 ziplist 來作爲列表的內部實現來減少內存的使用。
  • linkedlist(鏈表):當列表類型無法滿足 ziplist 的條件時,Redis 會使用 linkedlist 作爲列表的內部實現。

2.6.3 使用場景

(1)消息隊列

Redis 的 lpush+brpop 命令組合即可實現阻塞隊列,生產者客戶端使用 lpush 從列表左側插入元素,多個消費者客戶端使用 brpop 命令阻塞式“搶”列表尾部的元素,多個客戶端保證了消費的複雜均衡和高可用性。

(2)文章列表

每個用戶有屬於自己的文章列表,現需要分頁展示文章列表。此時可以考慮使用列表,因爲列表不但是有序的,同時支持按照索引範圍獲取元素。

2.7 集合

集合(set)類型也是用來保存多個字符串元素,但和列表類型不一樣的是,集合中不允許有重複元素,並且集合中的元素是無序的,不能通過索引下標獲取元素。一個集合最多可以存儲 232-1 個元素。Redis 除了支持集合內的增刪改查,同時還支持多個集合取交集、並集、差集。

2.7.1 命令

(1)集合內操作

sadd 添加元素,返回結果爲添加成功的元素個數。

sadd key element [element …]

srem 刪除元素,返回結果爲成功刪除元素個數。

srem key element [element …]

scard 計算元素個數,時間複雜度爲 O(1),它不會遍歷集合所有元素,而是直接用 Redis 內部變量。

scard key

sismember 判斷元素是否在集合中,如果給定元素 element 在集合內返回 1,反之返回 0。

sismember key element

srandmember 隨機從集合返回指定個數元素,[count]是可選參數,如果不寫默認爲 1。

srandmember key [count]

spop 從集合隨機彈出元素

spop key

smembers 獲取所有元素

smembers key

smembers 和 lrange、hgetall 都屬於比較重的命令,如果元素過多存在阻塞的可能性,這時候可以使用 sscan 來完成。

(2)集合間操作

求多個集合的交集

sinter key [key …]

求多個集合的並集

sunion key [key …]

求多個集合的差集

sdiff key [key …]

將交集、並集、差集的結果保存

sinterstore destination key [key …]
sunionstore destination key [key …]
sdiffstore destination key [key …]

集合間的運算在元素較多的情況下比較耗時,所以 Redis 提供了上面三個命令,將集合間交集、並集、差集的結果保存在 destination key 中。

命令 時間複雜度
sadd key element [element …] O(k),k 是元素個數
srem key element [element …] O(k),k 是元素個數
scard key O(1)
sismember key element O(1)
srandmember key [count] O(count)
spop key O(1)
smembers key O(n),n是元素總數
sinter key [key …] 或者 sinterstore O(m*k),k 是多個集合中元素最少的個數,m 是鍵個數
sunion key [key …] 或者 suionstore O(k),k 是多個集合元素的個數和
sdiff key [key …] 或者 sdiffstore O(k),k 是多個集合元素的個數和

2.7.2 內部編碼

集合類型的內部編碼有兩種:

  • intset(整數集合):當集合中的元素都是整數且元素個數小於 set-max-intset-entries 配置(默認 512 個)時,Redis 會選用 intset 來作爲集合的內部實現,從而減少內存的使用。
  • hashtable(哈希表):當集合類型無法滿足 intset 的條件時,Redis 會使用 hashtable 作爲集合的內部實現。

2.7.3 使用場景

集合類型比較典型的使用場景是標籤(tag)。例如一個用戶可能對娛樂、體育比較感興趣,另一用戶可能對歷史、新聞比較感興趣,這些興趣點就是標籤。

2.8 有序集合

有序集合保留了集合不能有重複成員的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下標作爲排序一句不同的是,它給每一個元素設置一個分數(score)作爲排序的依據(默認從小到大)。

數據結構 是否允許重複元素 是否有序 有序實現方式 應用場景
列表 索引下標 時間軸、消息隊列等
集合 標籤、社交等
有序集合 分值 排行榜系統、社交等

2.8.1 命令

(1)集合內

zadd 添加新成員,返回結果代表成功添加成員的個數。

zadd key score member [score member …]

Redis 3.2 爲 zadd 命令添加了 nx、xx、ch、incr 四個選項:

  • nx:member 必須不存在,纔可以設置成功,用於添加;
  • xx:member 必須存在,纔可以設置成功,用於更新;
  • ch:返回此次操作後,有序集合元素和分數發生變化的個數;
  • incr:對 score 做增加,相當於後面介紹的 zincrby。

有序集合相比集合提供了排序字段,但是也產生了代價,zadd 的時間複雜度爲O(log(n)),sadd 的時間複雜度爲O(1)。

zcard 計算成員個數

zcard key

zscore 計算某個成員的分數,若成員不存在,返回 nil。

zscore key member

zrank、zrevrank 計算成員的排名,zrank 是從分數從低到高返回排名,zrevrank 反之。

zrank key member
zrevrank key member

zrem 刪除成員,返回結果爲成功刪除的個數

zrem key member [member …]

zincrby 增加成員的分數

zincrby key increment member

zrange、zrevrange 返回指定排名範圍的成員,zrange 是從低到高返回,zrevrange 反之。如果加上 withscores 選項,同時會返回成員的分數。

zrange key start end [withscores]
zrevrange key start end [withscores]

zrangebyscore、zrevrangebyscore 返回指定分數範圍的成員。其中 zrangebyscore 按照分數從低到高返回,zrevrangebyscore 反之。withscores 選項會同時返回每個成員的分數。[limit offset count]選項可以限制輸出的起始位置和個數。同時 min 和 max 還支持開區間(小括號)和閉區間(中括號),-inf 和 +inf 分別代表無限小和無限大。

zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
e.g. zrangebyscore user:ranking (200 +inf withscores

zcount 返回指定分數範圍成員個數

zcount key min max

zremrangebyrank 刪除指定排名內的升序元素,返回結果爲成功刪除的個數

zremrangebyrank key start end

zremrangebyscore 刪除指定分數範圍的成員,返回結果爲成功刪除的個數

zremrangebyscore key min max

2.8.2 集合間的操作

(1)交集

zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]

這個命令參數較多,下面分別進行說明:

  • destination:交集計算結果保存到這個鍵;
  • numkeys:需要做交集計算鍵的個數;
  • key [key …]:需要做交集計算的鍵;
  • weights weight [weight …]:每個鍵的權重,在做交集計算時,每個鍵的每個 member 會將自己分數乘以這個權重,每個鍵的權重默認是 1;
  • aggregate sum|min|max:計算成員交集後,分值可以按照 sum(和)、min(最小值)、max(最大值)做彙總,默認值是 sum。

(2)並集

zunionstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]

該命令的所有參數和 zinterstore 是一致的,只不過是做並集計算。

命令 時間複雜度
zadd key score member [score member …] O(k * log(n)),k 是添加成員的個數,n 是當前有序集合成員個數
zcard key O(1)
zscore key member O(1)
zrank key member
zrevrank key member
O(log(n)),n 是當前有序集合成員個數
zrem key member [member …] O(k * log(n)),k 是刪除成員的個數,n 是當前有序集合成員個數
zincrby key increment member O(log(n)),n 是當前有序集合成員個數
zrange key start end [withscores]
zrevrange key start end [withscores]
O(log(n) + k),k 是要獲取的成員個數,n 是當前有序集合成員個數
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
O(log(n) + k),k 是要獲取的成員個數,n 是當前有序集合成員個數
zcount key min max O(log(n)),n 是當前有序集合成員個數
zremrangebyrank key start end O(log(n) + k),k 是要刪除的成員個數,n 是當前有序集合成員個數
zremrangebyscore key min max O(log(n) + k),k 是要刪除的成員個數,n 是當前有序集合成員個數
zinterstore destination numkeys key [key …] O(n * k) + O(m * log(m)),n 是成員數最小的有序集合成員個數,k 是有序集合的個數,m 是結果集中成員個數
zunionstore destination numkeys key [key …] O(n) + O(m * log(m)),n 是所有有序集合成員個數和,m 是結果集中成員個數

2.8.3 內部編碼

有序集合類型的內部編碼有兩種;

  • ziplist(壓縮列表):當有序集合的元素個數小於 zset-max-ziplist-entries 配置(默認 128 個),同時每個元素的值都小於 zset-max-zuolist-value 配置(默認 64 字節)時,Redis 會用 ziplist 來作爲有序集合的內部實現,ziplist 可以有效減少內存的使用。
  • skiplist(跳躍表):當 ziplist 條件不滿足時,有序集合會使用 skiplist 作爲內部實現,因爲此時 ziplist 的讀寫效率會下降。

2.8.4 使用場景

有序集合比較典型的使用場景就是排行榜系統。例如視頻網站需要對用戶上傳的視頻做排行榜,榜單的維度可能是多個方面的:按照時間、按照播放數量、按照獲得的贊數。

發佈了5 篇原創文章 · 獲贊 3 · 訪問量 2872
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章