redis 系列13 集合對象

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

一. 集合對象概述 這裡的集合是string類型的無序集合,在集合對象中集合成員是唯一的,這就意味著集合中不能出現重覆的數據。集合是通過哈希表實現的,集合中最大的成員數為 232-1 (4294967295, 每個集合可存儲40多億個成員)。集合對象的編碼可以是intset或者hashtable。 ...


一. 集合對象概述

  這裡的集合是string類型的無序集合,在集合對象中集合成員是唯一的,這就意味著集合中不能出現重覆的數據。集合是通過哈希表實現的,集合中最大的成員數為 232-1 (4294967295, 每個集合可存儲40多億個成員)。集合對象的編碼可以是intset或者hashtable。

  1.1 intset編碼

    intset編碼的集合對象使用整數集合作為底層實現,集合對象包含的所有元素都被保存在整數集合裡面。例如下麵使用整數集合:

     127.0.0.1:6379> sadd numbers 1 3 5
    (integer) 3
    127.0.0.1:6379> object encoding numbers
    "intset"

  1.2 hashtable編碼

     另一個編碼是hashtable,集合對象使用字典作為底層實現,字典的每個鍵都是一個字元串對象,每個字元串對象包含了一個集合元素,而字典的值則全部被設置為null。

    127.0.0.1:6379> sadd furits "apple" "banana"
    (integer) 2
    127.0.0.1:6379> object encoding furits
    "hashtable"

  兩個底層結構如下圖所示,作為字典結構,鍵都是一個字元串對象,值都為NULL。

  1.3  編碼轉換

    當集合對象可以同時滿足以下兩個條件時,對象使用intset編碼:(1) 集合對象保存的所有元素都是整數值;(2) 集合對象保存的元素數量不超過512個。當不能滿足這兩個條件的集合對象使用的是hashtable編碼。對於第二個條件的上限值可以通過配置文件中的set-max-intset-entries選項來修改。

   127.0.0.1:6379> config get set-max-intset-entries
	1) "set-max-intset-entries"
	2) "512"

  

 二. 集合命令實現

-- Sadd 命令將一個或多個成員元素加入到集合中,已經存在於集合的成員元素將被忽略。
    127.0.0.1:6379> sadd myset "hello" "foo"
    (integer) 2

-- Scard 命令返回集合中元素的數量
    127.0.0.1:6379> scard myset
    (integer) 2

--  Sdiff 命令返回給定集合之間的差集, 返回包含差集成員的列表。下麵是返回myset1對比myset2,返回myset1的差集。
    127.0.0.1:6379> sadd myset1 "hello" "foo" "bar"
    (integer) 3
    127.0.0.1:6379> sadd myset2 "hello" "world"
    (integer) 2
    127.0.0.1:6379> sdiff myset1 myset2
    1) "foo"
    2) "bar"

-- Sdiffstore 命令將差集存儲在指定的集合中,如果指定的集合(destination) key已存在,則會被覆蓋, 下麵集合key為 destset不存在,創建該新集合併且新集合值為二個集合的差集。
。
    127.0.0.1:6379> sdiffstore destset myset1 myset2
    (integer) 2
    127.0.0.1:6379> smembers destset
    1) "foo"
    2) "bar"

-- Sinter 命令返回給定所有給定集合的交集,與Sdiff相反。下麵返回myset1和myset2二個集合共同有的值。
    127.0.0.1:6379> sinter myset1 myset2
    1) "hello"

-- Sinterstore命令將給定集合之間的交集存儲在指定的集合中。如果指定的集合已經存在,則將其覆蓋, 與Sdiffstore 相反。下麵集合key為 destset2不存在,創建該新集合併且新集合值為二個集合的交集。

    127.0.0.1:6379> sinterstore destest2 myset1 myset2
    (integer) 1
    127.0.0.1:6379> smembers destest2
    1) "hello"

--  Sismember 命令判斷成員元素是否是集合的成員。如果成員元素是集合的成員,返回 1127.0.0.1:6379> sismember myset1 "hello"
    (integer) 1

-- Smembers 命令返回集合中的所有的成員。 不存在的集合 key 被視為空集合。
    127.0.0.1:6379> smembers myset1
    1) "hello"
    2) "bar"
    3) "foo"

-- Smove 命令將指定成員 member 元素從 source 集合移動到 destination 集合,SMOVE 是原子性操作。
    127.0.0.1:6379> smembers myset1
    1) "hello"
    2) "bar"
    3) "foo"
    127.0.0.1:6379> smembers myset2
    1) "hello"
    2) "world"
    127.0.0.1:6379> smove myset1 myset2 "bar"  --將myset1的元素移到myset2中
    (integer) 1
    127.0.0.1:6379> smembers myset1  -- myset1中少了"bar"元素
    1) "hello"
    2) "foo"
    127.0.0.1:6379> smembers myset2  --myset2 中多了"bar" 元素
    1) "hello"
    2) "world"
    3) "bar"

--Spop 命令用於隨機移除指定count元素數量,並返回集合中的移出的元素。
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "one"
    3) "hello"
    4) "two"
    127.0.0.1:6379> spop myset1  3  --隨機移除3個
    1) "hello"
    2) "two"
    3) "three"
    127.0.0.1:6379> smembers myset1  --只剩下一個元素
    1) "one"

--Srem 命令用於移除集合中的一個或多個成員元素,不存在的成員元素會被忽略。
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "one"
    3) "two"
    127.0.0.1:6379> srem myset1 "one"  --移除指定元素
    (integer) 1
    127.0.0.1:6379> smembers myset1  --只剩下二個元素
    1) "three"
    2) "two"

--Sunion 命令返回給定集合的並集,相當於sql中的join合併去重。
    127.0.0.1:6379> smembers myset2
    1) "one"
    2) "two"
    127.0.0.1:6379> smembers myset1
    1) "three"
    2) "two"
    127.0.0.1:6379> sunion myset2 myset1  --返回合併後的元素
    1) "three"
    2) "one"
    3) "two"
    
-- Sunionstore 命令將給定集合的並集,存儲在指定的集合 destination 中。
    127.0.0.1:6379> sunionstore myset  myset2 myset1
    (integer) 3
    127.0.0.1:6379> smembers myset  --並集後,存儲到了myset集合中
    1) "three"
    2) "one"
    3) "two

-- Sscan 命令用於迭代集合鍵中的元素
    127.0.0.1:6379> smembers myset
    1) "three"
    2) "one"
    3) "two"
    127.0.0.1:6379> sscan myset 0  match t*
    1) "0"
    2) 1) "three"
       2) "two"

 

  


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

-Advertisement-
Play Games
更多相關文章
  • 在Oracle資料庫中,如何查找,定位一張表最後一次的DML操作的時間呢? 方式有三種,不過都有一些局限性,下麵簡單的解析、總結一下。 1:使用ORA_ROWSCN偽列獲取表最後的DML時間 ORA_ROWSCN偽列是Oracle 10g開始引入的,可以查詢表中記錄最後變更的SCN。然後通過SCN_... ...
  • 因為學大數據前期的基礎課程就是java和linux.既然你有java基礎就省去了學習者部分課程的基礎,而且上手會容易很多! 再說說還需要學習哪些大數據技術,可以按我寫的順序學下去。 我還是要推薦下我自己創建的大數據資料分享群142973723,這是大數據學習交流的地方,不管你是小白還是大牛,小編都歡 ...
  • 資料庫反範式設計是一個老生常談的話題,最近兩年我用的也確實非常多,我個人覺得合理的反範式設計才是更合理的設計,嚴格的範式設計在某種程度上會加大開發的複雜度,並且帶來性能上的耗損 對於反範式的優劣勢,歡迎大家留言討論 一、關係資料庫三大範式回顧 第一範式:原子性,每一列都是不可分割的 第二範式:每個表 ...
  • memcached常用語法及java使用方式 Author:SimpleWu Memcached 存儲命令 Memcached set 命令用於將 value(數據值) 存儲在指定的 key(鍵) 中。 如果set的key已經存在,該命令可以更新該key所對應的原來的數據,也就是實現更新的作用。 M ...
  • 創建位置表,並且插入測試數據 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 80011 Source Host : localhost:3306 Source Database : t ...
  • DDL Data Definition(重點) (n. 定義;[物] 清晰度;解說)用於定義數據的結構,創建,修改,刪除資料庫對象 一、表的增刪改查 1、創建表:CREATE TABLE temp AS (SELECT * FROM emp WHERE 1==2) 創建表結構。 CREATE TAB ...
  • 一、SQL的多表查詢: 1、左連接和右連接(不重要一方加(+)) SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno ; (+)在等號左邊是右連接,反之左連接。 2、交叉 ...
  • memcached(1)簡介及環境安裝 author:SimpleWu 簡介 Memcached是一個自由開源的, 高性能 , 分散式 記憶體對象緩存系統。 Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric為首開發的一款軟體。現在已 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...