首頁 後端開發 C#.Net教程 Redis教學(六):Sorted-Sets資料類型

Redis教學(六):Sorted-Sets資料類型

Dec 28, 2016 pm 02:48 PM
redis

一、概述:

    Sorted-Sets和Sets類型極為相似,它們都是字串的集合,都不允許重複的成員出現在一個Set中。它們之間的主要差異是Sorted-Sets中的每一個成員都會有一個分數(score)與之關聯,Redis正是透過分數來為集合中的成員進行從小到大的排序。然而需要額外指出的是,儘管Sorted-Sets中的成員必須是唯一的,但是分數(score)卻是可以重複的。
    在Sorted-Set中新增、刪除或更新一個成員都是非常快速的操作,其時間複雜度為集合中成員數量的對數。由於Sorted-Sets中的成員在集合中的位置是有序的,因此,即便是存取位於集合中部的成員也仍然是非常有效率的。事實上,Redis所具有的這一特徵在許多其它類型的資料庫中是很難實現的,換句話說,在該點上要想達到和Redis同樣的高效,在其它資料庫中進行建模是非常困難的。

二、相關指令列表:

T

O(1)O(log(N)+M) 
指令原型 時間複雜度 指令描述 回傳值
ZADD key score member [score] [member]表示Sorted-Sets中成員的數量。將參數中指定的所有成員及其分數到指定key的Sorted-Set中,在該指令中我們可以指定多組score/member作為參數。如果在新增時參數中的某一成員已經存在,則該指令將更新此成員的分數為新值,同時再將該成員基於新值重新排序。如果鍵不存在,則命令將為該鍵建立一個新的Sorted-Sets Value,並將score/member對插入其中。如果該鍵已經存在,但是與其關聯的Value不是Sorted-Sets類型,相關的錯誤訊息將會被傳回。 本次操作實際插入的成員數量。 ZCARD key 
取得與此Key相關聯的Sorted-Sets中所包含的成員數量。 回傳Sorted-Sets中的成員數量,如果該Key不存在,回傳0。 ZCOUNTkey min max
時間複雜度中的N表示Sorted-Sets中成員的數量,M則表示min和max之間元素的數量。此指令用於取得分數(score)在min和max之間的成員數。針對min和max參數需要額外說明的是,-inf和+inf分別表示Sorted-Sets中分數的最高值和最低值。預設情況下,min和max表示的範圍是閉區間範圍,即min 分數指定範圍內成員的數量。分數。包含參數指定的成員,其分數為increment參數。 [WITHSCORES] O(log(N)+M) 時間複雜度中的N表示Sorted-Set中成員的數量,M則表示傳回的成員數量。內的成員,這裡start和stop參數都是0-based,即0表示第一個成員,-1表示最後一個成員。一個空集合將會傳回。的分數值,如value1,score1,value2,score2...。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]  O(log(N)+M) 時間複雜度中的Norted-Set中成員返回的成員,M數量。該命令將傳回分數在min和max之間的所有成員,即滿足表達式min 傳回分數在指定範圍內的成員清單。
ZRANK key member O(log(N))   時間複雜度中的N表示Sorted-Set中成員的數量。 Sorted-Set中的成員都是按照分數從低到高的順序存儲,該指令將傳回參數中指定成員的位置值,其中0表示第一個成員,它是Sorted-Set中分數最低的成員。 如果該成員存在,則傳回它的位置索引值。否則返回nil。
ZREM key member [member ...] O(M log(N)) 時間複雜度中N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。此指令將移除參數中指定的成員,其中不存在的成員將被忽略。如果與該Key關聯的Value不是Sorted-Set,相應的錯誤訊息將被傳回。 實際被刪除的成員數量。
ZREVRANGE key startstop[WITHSCORES] O(log(N)+M) 時間複雜度中的N表示Sorted-Set中成員的數量,M則表示回傳的成員數量。此指令的功能和ZRANGE基本上相同,唯一的差異在於該指令是透過反向排序來取得指定位置的成員,也就是從高到低的順序。如果成員具有相同的分數,則按降序字典順序排序。 傳回指定的成員清單。
ZREVRANKkey member  O(log(N)) 時間複雜度中的N表示Sorted-Set中成員的數量。此指令的功能和ZRANK基本上相同,唯一的差異在於該指令所取得的索引是從高到低排序後的位置,同樣0表示第一個元素,即分數最高的成員。 如果該成員存在,則傳回它的位置索引值。否則返回nil。
ZSCOREkey member O(1) 取得指定Key的指定成員的分數 如果該成員存在,以字串的形式傳回其分數,否則傳回nil。
ZREVRANGEBYSCOREkey max min [WITHSCORES] [LIMIT offset count] O(log(N)+M)  時間複雜度中的NO(log(N)+M)  時間複雜度中的Norted-Set中成員返回的成員數量,M. 。該指令除了排序方式是基於從高到低的分數排序之外,其它功能和參數意義均與ZRANGEBYSCORE相同。 🎜🎜傳回分數在指定範圍內的成員清單。 
ZREMRANGEBYRANKkey start stop  O(log(N)+M) 時間複雜度中的N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。刪除索引位置位於start和stop之間的成員,start和stop都是0-based,即0表示分數最低的成員,-1表示最後一個成員,即分數最高的成員。   被刪除的成員數量。
ZREMRANGEBYSCOREkey min max  O(log(N)+M) 時間複雜度中的N表示Sorted-Set中成員的數量,M則表示被刪除的成員數量。刪除分數在min和max之間的所有成員,即滿足表達式min 被刪除的成員數量。

三、指令範例:

   1. ZADD/ZCARD/ZCOUNT/ZREM/ZINCRBY/ZSCORE/ZRANGE/ZRANK:

 #在Shell的命令行下启动Redis客户端工具。
    /> redis-cli
    #添加一个分数为1的成员。
    redis 127.0.0.1:6379> zadd myzset 1 "one"
    (integer) 1
    #添加两个分数分别是2和3的两个成员。
    redis 127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
    (integer) 2
    #0表示第一个成员,-1表示最后一个成员。WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员。
    redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    #获取成员one在Sorted-Set中的位置索引值。0表示第一个位置。
    redis 127.0.0.1:6379> zrank myzset one
    (integer) 0
    #成员four并不存在,因此返回nil。
    redis 127.0.0.1:6379> zrank myzset four
    (nil)
    #获取myzset键中成员的数量。    
    redis 127.0.0.1:6379> zcard myzset
    (integer) 3
    #返回与myzset关联的Sorted-Set中,分数满足表达式1 <= score <= 2的成员的数量。
    redis 127.0.0.1:6379> zcount myzset 1 2
    (integer) 2
    #删除成员one和two,返回实际删除成员的数量。
    redis 127.0.0.1:6379> zrem myzset one two
    (integer) 2
    #查看是否删除成功。
    redis 127.0.0.1:6379> zcard myzset
    (integer) 1
    #获取成员three的分数。返回值是字符串形式。
    redis 127.0.0.1:6379> zscore myzset three
    "3"
    #由于成员two已经被删除,所以该命令返回nil。
    redis 127.0.0.1:6379> zscore myzset two
    (nil)
    #将成员one的分数增加2,并返回该成员更新后的分数。
    redis 127.0.0.1:6379> zincrby myzset 2 one
    "3"
    #将成员one的分数增加-1,并返回该成员更新后的分数。
    redis 127.0.0.1:6379> zincrby myzset -1 one
    "2"
    #查看在更新了成员的分数后是否正确。
    redis 127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
    1) "one"
    2) "2"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
登入後複製

   3. ZREVRANGE/ZREVRANGEBYSCORE/ZREVRANK :

 redis 127.0.0.1:6379> del myzset
    (integer) 1
    redis 127.0.0.1:6379> zadd myzset 1 one 2 two 3 three 4 four
    (integer) 4
    #获取分数满足表达式1 <= score <= 2的成员。
    redis 127.0.0.1:6379> zrangebyscore myzset 1 2
    1) "one"
    2) "two"
    #获取分数满足表达式1 < score <= 2的成员。
    redis 127.0.0.1:6379> zrangebyscore myzset (1 2
    1) "two"
    #-inf表示第一个成员,+inf表示最后一个成员,limit后面的参数用于限制返回成员的自己,
    #2表示从位置索引(0-based)等于2的成员开始,去后面3个成员。
    redis 127.0.0.1:6379> zrangebyscore myzset -inf +inf limit 2 3
    1) "three"
    2) "four"
    #删除分数满足表达式1 <= score <= 2的成员,并返回实际删除的数量。
    redis 127.0.0.1:6379> zremrangebyscore myzset 1 2
    (integer) 2
    #看出一下上面的删除是否成功。
    redis 127.0.0.1:6379> zrange myzset 0 -1
    1) "three"
    2) "four"
    #删除位置索引满足表达式0 <= rank <= 1的成员。
    redis 127.0.0.1:6379> zremrangebyrank myzset 0 1
    (integer) 2
    #查看上一条命令是否删除成功。
    redis 127.0.0.1:6379> zcard myzset
    (integer) 0
登入後複製

四、應用範圍:


    1). 可用於一個大型線上遊戲的積分排行榜。每當玩家的分數改變時,可以執行ZADD指令更新玩家的分數,此後再透過ZRANGE指令取得積分TOP TEN的使用者資訊。當然我們也可以利用ZRANK指令透過username來取得玩家的排行資訊。最後我們將組合使用ZRANGE和ZRANK指令快速的獲取和某個玩家積分相近的其他用戶的資訊。

    2). Sorted-Sets類型也可用於建立索引資料。


 以上就是Redis教學(六):Sorted-Sets資料類型的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

redis集群模式怎麼搭建 redis集群模式怎麼搭建 Apr 10, 2025 pm 10:15 PM

Redis集群模式通過分片將Redis實例部署到多個服務器,提高可擴展性和可用性。搭建步驟如下:創建奇數個Redis實例,端口不同;創建3個sentinel實例,監控Redis實例並進行故障轉移;配置sentinel配置文件,添加監控Redis實例信息和故障轉移設置;配置Redis實例配置文件,啟用集群模式並指定集群信息文件路徑;創建nodes.conf文件,包含各Redis實例的信息;啟動集群,執行create命令創建集群並指定副本數量;登錄集群執行CLUSTER INFO命令驗證集群狀態;使

redis數據怎麼清空 redis數據怎麼清空 Apr 10, 2025 pm 10:06 PM

如何清空 Redis 數據:使用 FLUSHALL 命令清除所有鍵值。使用 FLUSHDB 命令清除當前選定數據庫的鍵值。使用 SELECT 切換數據庫,再使用 FLUSHDB 清除多個數據庫。使用 DEL 命令刪除特定鍵。使用 redis-cli 工具清空數據。

redis怎麼讀取隊列 redis怎麼讀取隊列 Apr 10, 2025 pm 10:12 PM

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。

redis指令怎麼用 redis指令怎麼用 Apr 10, 2025 pm 08:45 PM

使用 Redis 指令需要以下步驟:打開 Redis 客戶端。輸入指令(動詞 鍵 值)。提供所需參數(因指令而異)。按 Enter 執行指令。 Redis 返迴響應,指示操作結果(通常為 OK 或 -ERR)。

centos redis如何配置Lua腳本執行時間 centos redis如何配置Lua腳本執行時間 Apr 14, 2025 pm 02:12 PM

在CentOS系統上,您可以通過修改Redis配置文件或使用Redis命令來限制Lua腳本的執行時間,從而防止惡意腳本佔用過多資源。方法一:修改Redis配置文件定位Redis配置文件:Redis配置文件通常位於/etc/redis/redis.conf。編輯配置文件:使用文本編輯器(例如vi或nano)打開配置文件:sudovi/etc/redis/redis.conf設置Lua腳本執行時間限制:在配置文件中添加或修改以下行,設置Lua腳本的最大執行時間(單位:毫秒)

redis怎麼使用鎖 redis怎麼使用鎖 Apr 10, 2025 pm 08:39 PM

使用Redis進行鎖操作需要通過SETNX命令獲取鎖,然後使用EXPIRE命令設置過期時間。具體步驟為:(1) 使用SETNX命令嘗試設置一個鍵值對;(2) 使用EXPIRE命令為鎖設置過期時間;(3) 當不再需要鎖時,使用DEL命令刪除該鎖。

redis命令行怎麼用 redis命令行怎麼用 Apr 10, 2025 pm 10:18 PM

使用 Redis 命令行工具 (redis-cli) 可通過以下步驟管理和操作 Redis:連接到服務器,指定地址和端口。使用命令名稱和參數向服務器發送命令。使用 HELP 命令查看特定命令的幫助信息。使用 QUIT 命令退出命令行工具。

redis過期策略怎麼設置 redis過期策略怎麼設置 Apr 10, 2025 pm 10:03 PM

Redis數據過期策略有兩種:定期刪除:定期掃描刪除過期鍵,可通過 expired-time-cap-remove-count、expired-time-cap-remove-delay 參數設置。惰性刪除:僅在讀取或寫入鍵時檢查刪除過期鍵,可通過 lazyfree-lazy-eviction、lazyfree-lazy-expire、lazyfree-lazy-user-del 參數設置。

See all articles