【Redis】set 類型

set

  • 一. set 類型介紹
  • 二. set 命令
    • sadd、smembers、sismember
    • scard、spop、srandmember
    • smove、srem
    • 集合間操作
      • 交集:sinter、sinterstore
      • 并集:sunion、sunionstore
      • 差集:sdiff、sdiffstore
  • 三. set 命令小結
  • 四. set 內部編碼方式
  • 五. set 使用場景
    • 用戶標簽
    • 共同好友
    • 統計 UV

一. set 類型介紹

  • 集合就是把一些有關聯的數據放到一起,保存多個字符串類型的元素的 (可以使用 JSON 這樣的格式,讓 string 存儲結構化數據),但和列表類型不同的是:
    • 元素之間是無序的。
      • 此處說的無序和之前 list 說的有序是對應的。
      • 有序:順序很重要,變換一下順序,就是不同的列表。
      • 無序:順序不重要,變換一下順序,還是那個集合。
      • list:[1, 2, 3] 和 [2, 1, 3] 是不同的 list
      • set:[1, 2, 3] 和 [2, 1, 3] 是相同的 set
    • 元素不允許重復。
    • 一個集合中最多可以存儲 2^32 - 1 個元素。
  • Redis 除了支持集合內的增刪查改操作,同時還支持多個集合取交集、并集、差集,合理地使用好集合類型,能在實際開發中解決很多問題。

集合類型:

在這里插入圖片描述

二. set 命令

在 set 中的元素叫做 member,就像在 hash 中的元素叫做 field、value 類似。

sadd、smembers、sismember

  • sadd:添加?/多個元素到 set 中。注意:重復的元素無法添加到集合中。
  • 語法:sadd key member [member ...]
  • 時間復雜度:添加一個元素是 O(1),添加 N 個元素是 O(N)
  • 返回值:本次添加成功的元素個數。

在這里插入圖片描述

  • smembers:獲取一個 set 中的所有元素。注意:元素間的順序是無序的。
  • 語法:smembers key
  • 時間復雜度:O(N),N 是集合中元素的個數。
  • 返回值:所有元素的列表。

在這里插入圖片描述

  • sismember:判斷一個元素在不在 set 中。
  • 語法:sismember key member
  • 時間復雜度:O(1)
  • 返回值:元素在 set 中,返回 1;元素不在 set 中或者 key 不存在,返回 0

在這里插入圖片描述

scard、spop、srandmember

  • scard:獲取一個 set 的基數 (cardinality),即 set 中的元素個數。
  • 語法:scard key
  • 時間復雜度:O(1)
  • 返回值:set 內的元素個數。

在這里插入圖片描述

  • spop:從 set 中刪除并返回一個或者多個元素。注意:由于 set 內的元素是無序的,所以取出哪個元素實際是未定義行為,即可以看作隨機的。
  • 語法:spop key [count]
  • 時間復雜度:O(N),N 是 count 的個數。
  • 返回值:取出的元素。

在這里插入圖片描述

  • srandmember:從 set 中返回一個或者多個隨機的元素。
  • 語法:srandmember key [count]
  • 時間復雜度:O(N),N 是 count 的個數。
  • 返回值:取出的元素。

在這里插入圖片描述

在 Redis 源碼中,針對 spop 實現的時候,就采取了 “生成隨機數” srandmember 的方式。

smove、srem

  • smove:將一個元素從源 set 取出并放入目標 set 中。
  • 語法:smove source destination member
  • 時間復雜度:O(1)
  • 返回值:移動成功時,返回 1;移動失敗時,返回 0

在這里插入圖片描述

如果我給 key1 里再添加一個 1,再次把這個 1 移動給 key2,此時 smove 不會視為出錯,也會按照 刪除-插入 進行執行。

在這里插入圖片描述

  • srem:將指定的元素從 set 中刪除
  • 語法:srem key member [member ...]
  • 時間復雜度:O(N),N 是要刪除的元素個數。
  • 返回值:刪除成功的元素個數。

在這里插入圖片描述

不同操作的返回值,含義差別還是挺大的,需要用的時候,多翻文檔即可。

集合間操作

  • 交集 (inter):最終結果同時出現在兩個集合中。
  • 并集 (union):把多個集合中的數據都集中放在一起,如果元素有重復,也最終只保留一份。
  • 差集 (diff):A 和 B 做差集,就是找出 A 中存在,但是 B 中不存在的元素。

在這里插入圖片描述

交集:sinter、sinterstore

  • sinter:獲取給定 set 的交集中的元素。
  • 語法:sinter key [key ...]
  • 時間復雜度:O(N * M),N 是最小的集合元素個數,M 是最大的集合元素個數。
  • 返回值:交集的元素。

在這里插入圖片描述

  • sinterstore:獲取給定 set 的交集中的元素并保存到目標 set 中。
  • 語法:sinterstore destination key [key ...]
  • 時間復雜度:O(N * M),N 是最小的集合元素個數,M 是最大的集合元素個數。
  • 返回值:交集的元素個數。

在這里插入圖片描述

并集:sunion、sunionstore

  • sunion:獲取給定 set 的并集中的元素。
  • 語法:sunion key [key ...]
  • 時間復雜度:O(N),N 是給定的所有集合的總的元素個數。
  • 返回值:并集的元素。

在這里插入圖片描述

  • sunionstore:獲取給定 set 的并集中的元素并保存到目標 set 中。
  • 語法:sunionstore destination key [key ...]
  • 時間復雜度:O(N),N 是給定的所有集合的總的元素個數。
  • 返回值:并集的元素個數。

在這里插入圖片描述

差集:sdiff、sdiffstore

  • sdiff:獲取給定 set 的差集中的元素。
  • 語法:sdiff key [key ...]
  • 時間復雜度:O(N),N 是給定的所有集合的總的元素個數。
  • 返回值:差集的元素。

在這里插入圖片描述

  • sdiffstore:獲取給定 set 的差集中的元素并保存到目標 set 中。
  • 語法:sdiffstore destination key [key ...]
  • 時間復雜度:O(N),N 是給定的所有集合的總的元素個數。
  • 返回值:差集的元素個數。

在這里插入圖片描述

三. set 命令小結

命令執行效果時間復雜度
sadd key member [member …]向集合中添加元素O(K),K 是元素的個數
smembers key求集合中的元素O(K),K 是元素的個數
sismember key member判斷元素是否在集合中O(1)
scard key獲取集合中元素的個數O(1)
spop key [count]隨機刪除 count 個元素O(N),N 是 count
srandmember key [count]隨機刪除 count 個元素O(N),N 是 count
smove source destination member移動源集合中的一個元素到目標集合O(1)
srem key member [member …]刪除集合中的元素O(K),K 是元素的個數
sinter key [key …]獲取集合的交集O(N * M),N 是最小的集合元素個數,M 是最大的集合元素個數
sinterstore destination key [key …]存儲集合的交集到目標集合中O(N * M),N 是最小的集合元素個數,M 是最大的集合元素個數
sunion key [key …]獲取集合的并集O(N),N 是所有集合的元素個數
sunionstore destination key [key …]存儲集合的并集到目標集合中O(N),N 是所有集合的元素個數
sdiff key [key …]獲取集合的差集O(N),N 是所有集合的元素個數
sdiffstore destination key [key …]存儲集合的差集到目標集合中O(N),N 是所有集合的元素個數

四. set 內部編碼方式

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

  • intset (整數集合):當集合中的元素都是整數并且元素的個數小于 set-max-intset-entries 配置 (默認 512 個) 時,Redis 會選用 intset 來作為集合的內部實現,從而減少內存的使用。
    • Redis 是內存數據庫,當元素均為整數,并且元素的個數不是很多的時候,為了節省空間,做出的特點優化。
  • hashtable (哈希表):當集合類型無法滿足 intset 的條件時,Redis 會使用 hashtable 作為集合的內部實現。

使用 object encoding key 可以查看集合內部的編碼方式,如下:

在這里插入圖片描述

五. set 使用場景

用戶標簽

集合類型比較典型的使用場景是標簽 (tag),使用 set 來保存用戶的 “標簽”

  • 例如 A 用戶對娛樂、體育板塊比較感興趣,B 用戶對歷史、新聞比較感興趣,這些興趣點可以被抽象為標簽。例如一個電子商務網站會對不同標簽的用戶做不同的產品推薦。
  • 有了這些數據就可以得到喜歡同一個標簽的人,以及用戶的共同喜好的標簽,這些數據對于增強用戶體驗和用戶黏度都非常有幫助。分析出你這個人的一些特征,分析清楚之后,再投其所好。
  • 上述用戶數據,很多公司都在共享。
    • 兩個程序,兩個賬號,如何知道這兩個賬號是一個人?
    • 現在的程序登入,主要就是兩個入口,手機號、微信。
  • 通過上述過程,搜集到的用戶特征,就會轉換成 “標簽” (簡短的字符串),此時就可以把標簽保存到 Redis 的 set 中。
    • 用戶畫像,這種事情其實是挺復雜的事情,一般一個大廠都會有專門的團隊做這樣工作。
    • 上述玩法,抖音玩的是最好的,其它互聯網大廠一看這么搞真好,于是紛紛效仿。
    • 但是存在 “信息繭房” 問題:你看到的內容始終就是一個小圈子,看不到其它圈子中的事物。
    • 當你很認真的看了一個視頻之后,人家的服務器就判定你,非常愛看這種類型的視頻,接下來就給你瘋狂推送。

下面的演示通過集合類型來實現標簽的若干功能。

  • 給用戶添加標簽
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag2 tag3 tag5
...
sadd user:k:tags tag1 tag2 tag4
  • 給標簽添加用戶
sadd tag1:users user:1 user:3
sadd tag2:users user:1 user:2 user:3
...
sadd tagk:users user:1 user:4 user:9 user:28
  • 刪除用戶下的標簽
srem user:1:tags tag1 tag5
...
  • 刪除標簽下的用戶
srem tag1:users user:1
srem tag5:users user:1
...
  • 計算用戶的共同興趣標簽
sinter user:1:tags user:2:tags

共同好友

使用 set 來計算用戶之間的公共好友,基于 “集合求交集”

  • 例如:QQ,我這邊加了很多好友,你那邊也加了很多好友。
  • 基于上述還可以做一些好友推薦:A 和 B 是好友,A 和 C 是好友,B 和 C 和 D 都是好友,此時系統就會把 D 推薦給 A

統計 UV

一個互聯網產品,如何衡量用戶量,用戶規模?主要的指標,是兩方面:

  • PV (page view):用戶每次訪問該服務器,都會產生一個 PV
  • UV (user view):每個用戶訪問該服務器,都會產生一個 UV,但是同一個用戶多次訪問,不會增加 UV 的個數。
    • UV 需要按照用戶進行去重,上述的去重功能,就可以使用 set 來實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83862.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

02-Redis常見命令

02-Redis常見命令 Redis數據結構介紹 Redis是一個key-value的數據庫,key一般是String類型,不過value的類型多種多樣: 貼心小建議:命令不要死記,學會查詢就好啦 Redis為了方便學習,將操作不同數據類型的命…

Rk3568驅動開發_GPIO點亮LED_12

需求: 用配置寄存器方式控制點燈非常原始,現在采用更方便的Linux提供的pctrl和gpio子系統編寫字符驅動 1.設備樹配置: 現將開發板中呼吸燈關閉掉防止占用到我需要使用的引腳 /* Narnat 2025-5-29 RK3568 GPIO 無需設置pinctrl*/gpioled{co…

阿里云ACP云計算備考筆記 (3)——云存儲RDS

目錄 第一章 云存儲概覽 1、云存儲通用知識 ① 發展歷史 ② 云存儲的優勢 2、云存儲分類 3、文件存儲業務場景 第二章 塊存儲 1、塊存儲分類 2、云盤的優勢 3、創建云盤 4、管理數據盤 ① 格式化數據盤 ② 掛載數據盤 ③ 通過 API 掛載云盤 5、管理系統盤 ① 更…

亞矩陣云手機實測體驗:穩定流暢背后的技術邏輯?

最近在測試一款云手機服務時,發現亞矩陣的表現出乎意料地穩定。作為一個經常需要多設備協作的開發者,我對云手機的性能、延遲和穩定性要求比較高。經過一段時間的體驗,分享一下真實感受,避免大家踩坑。 ??1. 云手機能解決什么問…

STM32H562----------ADC外設詳解

1、ADC 簡介 STM32H5xx 系列有 2 個 ADC,都可以獨立工作,其中 ADC1 和 ADC2 還可以組成雙模式(提高采樣率)。每個 ADC 最多可以有 20 個復用通道。這些 ADC 外設與 AHB 總線相連。 STM32H5xx 的 ADC 模塊主要有如下幾個特性: 1、可配置 12 位、10 位、8 位、6 位分辨率,…

【Android】雙指旋轉手勢

一,概述 本文參考android.view.ScaleGestureDetector,對雙指旋轉手勢做了一層封裝,采用了向量計算法簡單實現,筆者在此分享下。 二,實例 如下,使用RotateGestureDetector即可委托,實現旋轉手…

B站的視頻怎么下載下來——Best Video下載器

B站(嗶哩嗶哩)作為國內最受歡迎的視頻平臺之一,聚集了無數優質內容:動漫番劇、游戲實況、學習課程、紀錄片、Vlog、鬼畜剪輯……總有那么些視頻讓人想反復觀看、離線觀看,甚至剪輯創作。 但你是否遇到過這樣的煩惱&am…

基于SFC的windows系統損壞修復程序

前言 在平時使用Windows操作系統時會遇到很多因為系統文件損壞而出現的錯誤 例如:系統應用無法打開 系統窗口(例如開始菜單)無法使用 電腦藍屏或者卡死 是如果想要修復很多人只能想到重裝系統。但其實Windows有一個內置的系統文件檢查器可以修復此類錯誤。 原理 SFC命令…

智紳科技 —— 智慧養老 + 數字健康,構筑銀發時代安全防護網

在老齡化率突破 21.3% 的當下,智紳科技以 "科技適老" 為核心理念,構建 "監測 - 預警 - 干預 - 照護" 的智慧養老閉環。 其自主研發的七彩喜智慧康養平臺,通過物聯網、AI 和邊緣計算技術,實現對老年人健康與安…

用函數實現模塊化程序設計(適合考研、專升本)

函數 定義:本質上是一段可以被連續調用、功能相對獨立的程序段 c語言是通過“函數”實現模塊化的。根據分類標準不同函數分為以下幾類。 用戶角度:庫函數、自定義函數 函數形式:有參函數、無參函數 作用域:外部函數、內部函數 …

OpenCV 滑動條調整圖像亮度

一、知識點 1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange 0, void * userdata 0); (1)、創建一個滑動條并將其附在指定窗口上。 (2)、參數說明: trackbarname: 創建的…

vcs仿真產生fsdb波形的兩種方式

目錄 方法一: 使用verilog自帶的系統函數 方法二: 使用UCLI command 2.1 需要了解什么是vcs的ucli,怎么使用ucli? 2.2 使用ucli dump波形的方法 使用vcs仿真產生fsdb波形有兩種方式,本文參考《vcs user guide 20…

【前端】每日一道面試題6:解釋Promise.any和Promise.allSettled的使用場景及區別。

Promise.any() 和 Promise.allSettled() 是 JavaScript 中用于處理異步操作的兩種不同策略的 Promise 組合器,它們的核心區別在于邏輯目標與結果處理方式: 1. Promise.any() 使用場景: 需要獲取 首個成功結果(類似競速成功優先&…

數據鏈路層__

文章目錄 數據鏈路層基本概念(1)鏈路管理:面向連接的服務(2)幀同步:成幀1、字符計數法2、字符填充法(帶填充的首尾界符法)3、帶填充的首位標志法4、物理層編碼違例法 (3&…

coze智能體后端接入問題:

是否一定要按照coze官方API文檔格式調用? 不一定:以下面代碼為例(給了注釋) app.route(/compare_models, methods[POST]) def compare_models():print("收到 compare_models 請求!") #begin-這一部分代碼作用:從前端接…

如何輕松、安全地管理密碼(新手指南)

很多人會為所有賬戶使用相同、易記的密碼,而且常常多年不換。雖然這樣方便記憶,但安全性非常低。 您可能聽說過一些大型網站的信息泄露事件,同樣的風險也可能存在于您的WordPress網站中。如果有不法分子獲取了訪問權限,您的網站和…

寶塔think PHP8 安裝使用FFmpeg 視頻上傳

寶塔think PHP8 安裝使用FFmpeg 一、 安裝think PHP8二、安裝 FFmpeg1,登錄到寶塔面板。2,進入“軟件商店”。3,搜索“FFmpeg”。4,選擇版本點擊安裝。5,檢查 FFmpeg 是否安裝成功6, 在 ThinkPHP 8 中使用 …

Android 輕松實現 增強版靈活的 滑動式表格視圖

表格視圖組件,支持: 1. 無標題模式:只有數據行也可以正常滑動 2. 兩種滑動模式:固定第一列 或 全部滑動 3. 全面的樣式自定義能力 4. 智能列寬計算 1. 無標題模式支持 設置無標題:調用 setHeaderData(null) 或 …

【Python進階】元類編程

目錄 🌟 前言🏗? 技術背景與價值🩹 當前技術痛點🛠? 解決方案概述👥 目標讀者說明 🧠 一、技術原理剖析📊 核心概念圖解💡 核心作用講解🔧 關鍵技術模塊說明?? 技術選…

DeepSeek模型性能優化:從推理加速到資源調度的全棧實踐

引言 在生產環境中部署DeepSeek模型時,性能優化直接關系到服務質量和運營成本。本文將深入探討從芯片級優化到分布式調度的全棧性能提升方案,涵蓋計算圖優化、內存管理、批處理策略等關鍵技術,并分享在千萬級QPS場景下的實戰經驗,幫助工程團隊突破性能瓶頸,實現成本與效能…