redis 系列14 有序集合對象

来源:https://www.cnblogs.com/MrHSR/archive/2018/11/20/9983339.html
-Advertisement-
Play Games

一. 有序集合概述 Redis 有序集合對象和集合對象一樣也是string類型元素的集合,且不允許重覆的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)卻可以重覆。 在前面第9章中講到Re ...


一. 有序集合概述

  Redis 有序集合對象和集合對象一樣也是string類型元素的集合,且不允許重覆的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。有序集合的成員是唯一的,但分數(score)卻可以重覆。

  在前面第9章中講到Redis 數據對象對應不同底層的數據結構,對於有序集合對象 編碼可以是ziplist 或者skiplist二種。skiplist編碼的底層數據結構可以參考"redis 系列7 數據結構之跳躍表"。ziplist編碼的壓縮列表結構以後再講。

  1.1  ziplist編碼

    ziplist編碼的有序集合對象使用壓縮列表作為底層實現,每個集合元素使用兩個緊挨在一起的壓縮列表節點來保存,第一個節點保存元素的成員(member),而第二個元素則保存元素的分值(score)。壓縮列表的集合元素按分值從小到大進行排序,分值較小的元素被放置在靠近表頭的方向,分值較大的元素則被放置在靠近表尾的方向。

    下例中,使用zadd命令,創建一個有序集合對象作為price鍵的值。並且該對象使用的編碼是ziplist。

    127.0.0.1:6379> zadd price 8.5 apple 5.0 banana
    (integer) 2
    127.0.0.1:6379> object encoding price
    "ziplist"

  1.2   skiplist編碼

    skiplist編碼的有序集合對象使用字典和跳躍表作為底層實現,如果一個有序集合包含的元素數量比較多,又或者有序集合中元素的成員是比較長的字元串時,Redis就會使用跳躍表來作為有序集合鍵的底層實現。

    下例中,還是使用zadd命令,創建一個有序集合對象作為store鍵的值。並且該對象使用的編碼是skiplist。

    127.0.0.1:6379> zadd store 1.0 
   "long_long_long_long_long_long_long_long_long_long_long_long..." -- 省去了字元,大於64位元組
   127.0.0.1:6379> object encoding store
   "skiplist"

  1.3 編碼的轉換

    當有序集合可以同時滿足以下兩個條件時,對象使用ziplist編碼:

      (1) 有序集合保存的元素數量小於128個。

      (2) 有序集合的所有元素成員的長度都小於64位元組。

    127.0.0.1:6379> config get zset-max-ziplist-value
    1) "zset-max-ziplist-value"
    2) "64"
    127.0.0.1:6379> config get zset-max-ziplist-entries
    1) "zset-max-ziplist-entries"
    2) "128"

  

二. 有序集合對象命令實現

-- Zadd 命令用於將一個或多個成員元素及其分數值加入到有序集當中。返回被成功添加的新成員的數量,不包括那些被更新的、已經存在的成員。
        127.0.0.1:6379> zadd price 8.5 apple 5.0 banana
        (integer) 2

-- Zcard 命令用於計算集合中元素的數量。
        127.0.0.1:6379> zcard price
        (integer) 2

--  Zcount 命令用於計算有序集合中指定分數區間的成員數量
        127.0.0.1:6379> zrange price 0 -1 withscores
        1) "banana"
        2) "5"
        3) "pear"
        4) "6"
        5) "apple"
        6) "8.5"
           127.0.0.1:6379> zcount price 5.0 7.0   -- 取scores值範圍
        (integer) 2
    
-- Zincrby 命令對有序集合中指定成員的分數加上增量 increment, 可以通過傳遞一個負數值 increment ,讓分數減去相應的值。
        127.0.0.1:6379> zrange price 0 -1 withscores
        1) "pear"
        2) "6"
        127.0.0.1:6379> zincrby price 2.5  pear  -- 添加2.5元
        "8.5"

-- Zinterstore 命令計算給定的一個或多個有序集的交集,其中給定 key 的數量必須以 numkeys 參數指定,並將該交集(結果集)儲存到 destination 。結果集中分數值是成員分數值之和。
        127.0.0.1:6379> ZADD mid_test 70 "Li Lei"       --第一個key  mid_test
        (integer) 1
        127.0.0.1:6379> ZADD mid_test 70 "Han Meimei"
        (integer) 1   
        127.0.0.1:6379> ZADD fin_test 88 "Li Lei"        -- 第二個key  fin_test
        (integer) 1
        127.0.0.1:6379> ZADD fin_test 75 "Han Meimei"
        (integer) 1
        127.0.0.1:6379> zinterstore sum_point 2 mid_test fin_test  -- sum_point是destination,2是二個key
        (integer) 2
        127.0.0.1:6379> zrange sum_point 0 -1 withscores  --分數值之和
        1) "Han Meimei"
        2) "145"
        3) "Li Lei"
        4) "158"

--Zlexcount 命令在計算有序集合中指定字典區間內成員數量.
        127.0.0.1:6379> zadd myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g
        (integer) 7
        127.0.0.1:6379> zlexcount myzset  [c  [g   --獲取c 到g 的區間數量
        (integer) 5

-- Zrange 返回有序集中,指定區間內的成員,其中成員的位置按分數值遞增(從小到大)來排序。
        127.0.0.1:6379> zrange price 0 -1 withscores
        1) "banana"
        2) "5"
        3) "pear"
        4) "6"
        5) "apple"
        6) "8.5"

-- Zrangebylex 通過字典區間返回有序集合的成員。
    127.0.0.1:6379> zadd myzset 1 a 2 b 3 c 4 d 5 e 6 f 7 g
    (integer) 7
    127.0.0.1:6379> zrangebylex myzset [c [g
    1) "c"
    2) "d"
    3) "e"
    4) "f"
    5) "g"

-- Zrangebyscore 返回有序集合中指定分數區間的成員列表。有序集成員按分數值遞增(從小到大)次序排列。更多用法見官方文檔
    127.0.0.1:6379> ZADD salary 2500 jack 
    (integer) 1
    127.0.0.1:6379> ZADD salary 5000 tom
    (integer) 1
    127.0.0.1:6379>  ZADD salary 12000 peter
    (integer) 1
    127.0.0.1:6379> zrangebyscore salary 2000 6000 withscores  --返回工資範圍
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"
    127.0.0.1:6379> ZRANGEBYSCORE salary -inf 5000 WITHSCORES --返回工資小於5000範圍
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"

--Zrank 返回有序集中指定成員的排名。其中有序集成員按分數值遞增(從小到大)順序排列。下麵是jack 分值排名0位,  peter分值排名2位。
    127.0.0.1:6379> zrank salary jack
    (integer) 0   -- 2500
    127.0.0.1:6379> zrank salary peter
    (integer) 2  -- 12000

 

-- Zrem 命令用於移除有序集中的一個或多個成員,不存在的成員將被忽略。
    127.0.0.1:6379> ZRANGE salary 0 -1 WITHSCORES 
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"
    5) "peter"
    6) "12000"
    127.0.0.1:6379> zrem salary jack  --移除jack成員成功
    (integer) 1

--Zremrangebylex 命令用於移除有序集合中給定的字典區間的所有成員。
    127.0.0.1:6379> zrange myzset 0 -1
    1) "a"
    2) "b"
    3) "c"
    4) "d"
    5) "e"
    6) "f"
    7) "g"
    127.0.0.1:6379> zremrangebylex myzset [a [c  --移除了a到c的成員數據
    (integer) 3
  
 --Zremrangebyrank 命令用於移除有序集中,指定排名(rank)區間內的所有成員.
    127.0.0.1:6379> zrange salary 0 -1
    1) "tom"
    2) "peter"
    127.0.0.1:6379> zremrangebyrank salary 0 0  --移除了分值排名為0的成員
    (integer) 1   --稱除了tom 成員分值排0,  peter分值排1
    127.0.0.1:6379> zrange salary 0 -1
    1) "peter"   

-- Zremrangebyscore 命令用於移除有序集中,指定分數(score)區間內的所有成員。
    127.0.0.1:6379> zrange salary 0 -1
    1) "peter"
    127.0.0.1:6379> zremrangebyscore salary 10000 13000  --移除分值的範圍,peter分值為12000
    (integer) 1    

--Zrevrange 命令返回有序集中,指定區間內的成員,分數值 (從大到小)來排列. 與zrange命令一樣,分值排列相反。
    127.0.0.1:6379> zrevrange salary 0 -1 withscores
    1) "peter"
    2) "12000"
    3) "tom"
    4) "5000"
    5) "jack"
    6) "2500"

-- Zrevrangebyscore 返回有序集中指定分數區間內的所有的成員。有序集成員按分數值 (從大到小)的次序排列。
    127.0.0.1:6379> zrevrangebyscore salary 6000 2000  withscores  --返回分值範圍
    1) "tom"
    2) "5000"
    3) "jack"
    4) "2500"

-- Zrevrank 命令返回有序集中成員的排名。其中有序集成員按分數值(從大到小)排序
    127.0.0.1:6379> zrevrank salary tom
    (integer) 1  --tom工資排名第二
    127.0.0.1:6379> zrevrank salary peter
    (integer) 0  --peter工資排名第一

-- Zscore 命令返回有序集中,成員的分數值。
    127.0.0.1:6379> zscore salary peter
    "12000"

--Zunionstore 命令計算給定的一個或多個有序集的並集,其中給定 key 的數量必須以 numkeys 參數指定,並將該並集(結果集)儲存到 destination 。
    127.0.0.1:6379> zrange salary 0 -1 withscores  --第一個key
    1) "jack"
    2) "2500"
    3) "tom"
    4) "5000"
    5) "peter"
    6) "12000"
    127.0.0.1:6379> zrange salary2 0 -1 withscores  --第二個key
    1) "tom"
    2) "500"
    3) "jack"
    4) "1000"
    127.0.0.1:6379> zunionstore salaries 2 salary salary2  --合併到salaries的key中
    (integer) 3
    127.0.0.1:6379> zrange salaries 0 -1 withscores
    1) "jack"
    2) "3500"
    3) "tom"
    4) "5500"
    5) "peter"
    6) "12000"

 

    


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 迫於Windows 系統最近的各種故障,今天脫坑換了openSUSE Linux ,在上網途中播放視頻時偶爾會出現電流音,雖然影響不大,但是還是進行了一些排查。 通過觀察電流音出現時的系統負載的波段,發現電流音可能由於CPU變頻導致的,於是進行下一步排查,最後懷疑是 Intel 節能技術(Enhan ...
  • 在內核中代碼調用過程難以跟蹤,上下文關係複雜,確實讓人頭痛 調用dump_stack()就會列印當前cpu的堆棧的調用函數了。 如此,一目瞭然的就能看到當前上下文環境,調用關係了 假設: 遇到uvc_probe_video這麼一個函數,不知道它最終是被誰調用到的,根據linux設備模型,初步推測,p ...
  • 基於 ssh 的 sftp 服務相比 ftp 有更好的安全性(非明文帳號密碼傳輸)和方便的許可權管理(限制用戶的活動目錄)。 1、開通 sftp 帳號,使用戶只能 sftp 操作文件, 而不能 ssh 到伺服器 2、限定用戶的活動目錄,使用戶只能在指定的目錄下活動,使用 sftp 的 ChrootDi ...
  • 一、知識準備 1、在linux中,一切皆為文件,所有不同種類的類型都被抽象成文件(比如:塊設備,socket套接字,pipe隊列) 2、操作這些不同的類型就像操作文件一樣,比如增刪改查等 二、環境準備 | 組件 | 版本 | | | | | OS | CentOS Linux release 7.5 ...
  • 在處理excel數據時需要將一組具有相同標簽值的數據給按標簽抽取出來,同樣的標簽值對應著同一個類別,這項操作讓我對pandas的聚合功能有了更深刻的認識。 所謂聚合groupby,實際上是指將向量或者向量對應的高維度數據映射為標量值的過程,這裡強調求出標量值其實是為了好顯示groupby對象,本身只 ...
  • sqlmap 基本應用: sqlmap詳細命令: -is-dba 當前用戶許可權(是否為root許可權) -dbs 所有資料庫 -current-db 網站當前資料庫 -users 所有資料庫用戶 -current-user 當前資料庫用戶 -random-agent 構造隨機user-agent -p ...
  • MySQL怎麼優化SQL呢? 一、考慮表有沒有加索引。 二、加上索引考慮索引是否失效 失效的原因: 1.數據類型不匹配 2.索引列加上函數 3.索引列參與邏輯運算 4.組合索引配置最左首碼 如abc 只要a出現就走索引 否則失效 5.or 關鍵字 必須前後都要加上索引否則索引失效 6.like 前面 ...
  • [TOC] Memcached介紹 Memcached是什麼? Free & open source, high performance, distributed memory object caching system(自由&開放源碼,高性能,分散式的記憶體對象緩存系統)。由LiveJournal旗 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...