10.Redis之set类型
谈到一个术语,这个术语很可能有多种含义~~
1.Set
1) 集合.
2)设置 (和 get 相对应)
集合就是把一些有关联的数据放到一起~~
1.集合中的元素是无序的!
【此处说的无序和 前面list这里的有序 是对应的,
有序: 顺序很重要. 变换一下顺序, 就是不同的 list 了
无序: 顺序不重要.变化一下顺序,集合还是那个集合,
list: [1,2, 3]和 [2,1,3]两个不同的 list
set: [1,2,3] 和 [2,1,3]是同一个集合】
2.集合中的元素是不能重复的(唯一的)
和 list 类似, 集合中的每个元素也都是 string 类型
(可以使用 json 这样的格式让 string 也能存储 结构化 数据)
2.set的普通命令
2.1 SADD
将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
SADD key member [member ...]
返回值:本次添加成功的元素个数。不能重复的特性!!!![]()
redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SADD myset "World"(integer) 0redis> SMEMBERS myset1) "Hello"2) "World"
2.2 SMEMBERS
获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
SMEMBERS key
命令有效版本:1.0.0 之后时间复杂度:O(N)返回值:所有元素的列表。
redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SMEMBERS myset1) "Hello"2) "World"
2.3 SISMEMBER
判断⼀个元素在不在 set 中。
SISMEMBER key member
命令有效版本:1.0.0 之后时间复杂度:O(1)返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。
redis> SADD myset "one"(integer) 1redis> SISMEMBER myset "one"(integer) 1redis> SISMEMBER myset "two"(integer) 0
2.4 SCARD
获取⼀个 set 的基数(cardinality),即 set 中的元素个数。
SCARD key
命令有效版本:1.0.0 之后时间复杂度:O(1)返回值:set 内的元素个数。
redis> SADD myset "Hello"(integer) 1redis> SADD myset "World"(integer) 1redis> SCARD myset(integer) 2
2.5 SPOP
从 set 中删除并返回⼀个或者多个元素。注意,由于 set 内的元素是⽆序【逻辑是无序的】的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。(随机进行删除)![]()
SPOP key [count]
命令有效版本:1.0.0 之后时间复杂度:O(N), n 是 count返回值:取出的元素。
redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myset "three"(integer) 1redis> SPOP myset"one"redis> SMEMBERS myset1) "three"2) "two"redis> SADD myset "four"(integer) 1redis> SADD myset "five"(integer) 1redis> SPOP myset 31) "three"2) "four"3) "two"redis> SMEMBERS myset1) "five"
2.6 SMOVE
SMOVE source destination member
命令有效版本:1.0.0 之后时间复杂度:O(1)返回值:1 表⽰移动成功,0 表⽰失败。
redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myotherset "three"(integer) 1redis> SMOVE myset myotherset "two"(integer) 1redis> SMEMBERS myset1) "one"redis> SMEMBERS myotherset1) "three"2) "two"![]()
2.7 SREM
将指定的元素从 set 中删除。
SREM key member [member ...]
命令有效版本:1.0.0 之后时间复杂度:O(N), N 是要删除的元素个数.返回值:本次操作删除的元素个数。
redis> SADD myset "one"(integer) 1redis> SADD myset "two"(integer) 1redis> SADD myset "three"(integer) 1redis> SREM myset "one"(integer) 1redis> SREM myset "four"(integer) 0redis> SMEMBERS myset1) "three"2) "two"
3.集合间操作
3.1 SINTER(交集)
SINTER key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.返回值:交集的元素。
redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SINTER key1 key21) "c"
3.2 SINTERSTORE(交集并保存起来)
获取给定 set 的交集中的元素并保存到⽬标 set 中。
SINTERSTORE destination key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.返回值:交集的元素个数。
redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SINTERSTORE key key1 key2(integer) 1redis> SMEMBERS key1) "c"
3.3 SUNION
获取给定 set 的并集中的元素。
SUNION key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N), N 给定的所有集合的总的元素个数.返回值:并集的元素。
redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SUNION key1 key21) "a"2) "c"3) "e"4) "b"5) "d"
3.4 SUNIONSTORE
获取给定 set 的并集中的元素并保存到⽬标 set 中。
SUNIONSTORE destination key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N), N 给定的所有集合的总的元素个数.返回值:并集的元素个数。
redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SUNIONSTORE key key1 key2(integer) 5redis> SMEMBERS key1) "a"2) "c"3) "e"4) "b"5) "d"
3.5 SDIFF
获取给定 set 的差集中的元素。
SDIFF key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N), N 给定的所有集合的总的元素个数.返回值:差集的元素。
1 redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SDIFF key1 key21) "a"2) "b"
3.6 SDIFFSTORE
获取给定 set 的差集中的元素并保存到⽬标 set 中。
SDIFFSTORE destination key [key ...]
命令有效版本:1.0.0 之后时间复杂度:O(N), N 给定的所有集合的总的元素个数.返回值:差集的元素个数。
redis> SADD key1 "a"(integer) 1redis> SADD key1 "b"(integer) 1redis> SADD key1 "c"(integer) 1redis> SADD key2 "c"(integer) 1redis> SADD key2 "d"(integer) 1redis> SADD key2 "e"(integer) 1redis> SDIFFSTORE key key1 key2(integer) 2redis> SMEMBERS key1) "a"2) "b"
4.命令小节
| 命令 | 时间复杂度 |
| 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(n),n 是 count |
| spop key [count] | O(n), n 是 count |
| smembers key | O(k),k 是元素个数 |
| sinter key [key ...] sitnerstore | O(m * k),k 是⼏个集合中元素最⼩的个数,m 是键个数 |
| sunion key [key ...] sunionstore | O(k),k 是多个集合的元素个数总和 |
| sdiff key [key ...] sdiffstore | O(k),k 是多个集合的元素个数总和 |
5.set内部编码
- intset(整数集合)为了节省空间,做出的特定优化~
- 当元素均为整数,并且元素个数不是很多的时候
- hashtable(哈希表)
- C++ 中的 std:.set 背后的数据结构是 红黑树Java 中的 Set 本身是一个接口.这个接口后面的实现,可以是 Treeset, 也可以是 HashSet

6.set的应用场景
6.1 添加标签
1)给⽤⼾添加标签
2)给标签添加⽤⼾
3)删除⽤⼾下的标签
4)删除标签下的⽤⼾
5)计算⽤⼾的共同兴趣标签
6.2. 使用 Set 来计算用户之间的共同好友
~~基于"集合求交集”
QQ,
我这边加了很多好友.你这边也加了很多好友~~
基于上述还可以做一些好友推荐~~
A 和 B 是好友,
A 和 C 是好友.
B 和C和 D 都是好友.
系统就会把 D 推荐给 A
6.3.使用 Set 统计 UV
去重~~
一个互联网产品,如何衡量用户量,用户规模??主要的指标,是两方面:
1.PV page view
用户每次访问该服务器,每次访问都会产生一个 pv
2.UV user view
每个用户,访问服务器,都会产生一个 uv.但是同一个用户多次访问, 不会使 uv 增加~~uv 需要按照用户进行去重~~
上述的去重过程,就可以使用 set 来实现.
相关文章:
10.Redis之set类型
谈到一个术语,这个术语很可能有多种含义~~ 1.Set 1) 集合. 2)设置 (和 get 相对应) 集合就是把一些有关联的数据放到一起~~ 1.集合中的元素是无序的! 【此处说的无序和 前面list这里的有序 是对应的, 有序: 顺序很重要. 变换一下顺序, 就是不同的 list 了 无序: 顺序不…...
SpringBoot + mongodb 删除集合中的数据
MongoTemplate是Spring Data MongoDB提供的一个工具类,用于与MongoDB进行交互。它提供了许多方法来执行数据库操作,包括删除数据。 本文将介绍如何使用Java MongoTemplate删除集合内的数据,并提供相应的代码示例。 1. 引入MongoTemplate 首…...
【日常记录】【JS】前端预览图片的两种方式,Base64预览和blob预览
文章目录 1、前言1、FileReader3、window.URL.createObjectURL4、参考链接 1、前言 一般来说,都是 后端返回给前端图片的url,前端直接把这个值插入到 img 的src 里面即可还有一种情况是前端需要预览一下图片,比如:上传头像按钮&a…...
每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符
杭电2156.分数矩阵 原题链接:Problem - 2156 题目描述 Problem Description:我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。请求出这个矩阵的总和。 Input…...
爬虫学习--18.反爬斗争 selenium(3)
操作多窗口与页面切换 有时候窗口中有很多子tab页面。这时候肯定是需要进行切换的。selenium提供了一个叫做switch_to.window来进行切换,具体切换到哪个页面,可以从driver.window_handles中找到。 from selenium import webdriver from selenium.webdri…...
如何评价GPT-4o?
GPT-4o是OpenAI为聊天机器人ChatGPT发布的一款新语言模型,其名称中的“o”代表Omni,即全能的意思,凸显了其多功能的特性。这款模型在多个方面都有着显著的优势和进步。 首先,GPT-4o具有极强的多模态能力,它能够接受文本…...
算能BM1684+FPGA+AI+Camera推理边缘计算盒
搭载算丰智算芯片BM1684,是面向AI推理的边缘计算盒。高效适配市场上所有AI算法,实现视频结构化、人脸识别、行为分析、状态监测等应用,为智慧城市、智慧交通、智慧能源、智慧金融、智慧电信、智慧工业等领域进行AI赋能。 产品规格 处理器芯片…...
不同厂商SOC芯片在视频记录仪领域的应用
不同SoC公司芯片在不同产品上的应用信息: 大唐半导体 芯片型号: LC1860C (主控) LC1160 (PMU)产品应用: 红米2A (399元)大疆晓Spark技术规格: 28nm工艺,4个ARM Cortex-A7处理器,1.5GHz主频,2核MaliT628 GPU,1300万像…...
【Python入门学习笔记】Python3超详细的入门学习笔记,非常详细(适合小白入门学习)
Python3基础 想要获取pdf或markdown格式的笔记文件点击以下链接获取 Python入门学习笔记点击我获取 1,Python3 基础语法 1-1 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指…...
通用代码生成器应用场景三,遗留项目反向工程
通用代码生成器应用场景三,遗留项目反向工程 如果您有一个遗留项目,要重新开发,或者源代码遗失,或者需要重新开发,但是希望复用原来的数据,并加快开发。 如果您的项目是通用代码生成器生成的,…...
轻量级动态可监控线程池 - DynamicTp
一、背景介绍 使用线程池ThreadPoolExecutor的过程中你是否有以下痛点呢? 代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适凭经验设置参数值,上线后发现需要调整,改代码重新发布服务,…...
对于vsc中的vue命令 vue.json
打开vsc 然后在左下角有一个设置 2.点击用户代码片段 3.输入 vue.json回车 将此代码粘贴 (我的不一定都适合) { "vue2 template": { "prefix": "v2", "body": [ "<template>", " <…...
Spring Boot 官方不再支持 Spring Boot 的 2.x 版本!新idea如何创建java8项目
idea现在只能创建最少jdk17 使用 IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时,没有 Java 8 的选项了,只剩下了 > 17 的版本 是因为 Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了,之后全力维护 3.x;而 …...
分享一个 ASP.NET Web Api 上传和读取 Excel的方案
前言 许多业务场景下需要处理和分析大量的数据,而 Excel 是业务人员常用的数据表格工具,因此,将 Excel 表格中内容上传并读取到网站,是一个很常见的功能,目前有许多成熟的开源或者商业的第三方库,比如 NPO…...
【算法实战】每日一题:将某个序列中内的每个元素都设为相同的值的最短次数(差分数组解法,附概念理解以及实战操作)
题目 将某个序列中内的每个元素都设为相同的值的最短次数 1.差分数组(后面的减去前面的值存储的位置可以理解为中间) 差分数组用于处理序列中的区间更新和查询问题。它存储序列中相邻元素之间的差值,而不是直接存储每个元素的值 怎么对某…...
EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?
在excel里,这个果然是有个设置的地方,修改后就好了。 点击文件选项卡,选项,在高级里,将图示选项的勾选给取消,然后再创建数据透视表或透视图,日期就不会自动组合了: 这个选项只对新…...
【设计模式深度剖析】【1】【行为型】【模板方法模式】| 以烹饪过程为例加深理解
👈️上一篇:结构型设计模式对比 文章目录 模板方法模式定义英文原话直译如何理解呢? 2个角色类图代码示例 应用优点缺点使用场景 示例解析:以烹饪过程为例类图代码示例 模板方法模式 模板方法模式(Template Method Pattern&…...
JAVA:异步任务处理类CompletableFuture让性能提升一倍
一、前言 CompletableFuture 是 Java 8 引入的一个功能强大的类,用于异步编程。它表示一个可能尚未完成的计算的结果,你可以对其添加回调函数来在计算完成时执行某些操作。在 Spring Boot 应用中,CompletableFuture 可以用于提高应用的响应性…...
10Linux 进程管理学习笔记
Linux 进程管理 目录 文章目录 Linux 进程管理一.进程1.显示当前进程状态(ps)进程树(pstree)1.1实时显示进程信息(top)顶部概览信息:CPU 状态:内存状态:进程信息表头:进程列表:1.2(htop) 2.终止进程(kill)2.1通过名称…...
一些关于深度聚类以及部分对比学习的论文阅读笔记
目录 资料SwAV问题方法方法的创新点为什么有效有什么可以借鉴的地方聚类Multi-crop 代码 PCL代码 Feature Alignment and Uniformity for Test Time Adaptation代码 SimSiam 资料 深度聚类算法研究综述(很赞,从聚类方法和深度学习方法两个方面进行了总结࿰…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
