深入学习 Redis - 深挖经典数据类型之 set

news2024/11/26 8:30:24

目录

前言

一、Set 类型

1.1、操作命令

sadd / smembers(添加)

sismember(判断存在)

scard(获取元素个数)

spop(删除元素)

smove(移动) 

 srem(删除)

sinter / sinterstore(交集 / 存储)

sunion / sunionstore(并集 / 存储)

sdiff / sdiffstore(差集 / 存储)

1.2、set 的内部编码方式

1.3、使用场景

用户画像(set 保存用户 “标签”)

共同好友

统计 UV(去重)


前言


redis 中所有的 key 都是字符串,value 的类型是存在差异的,因此出现了操控不同 value 的命令,接下来,就一起来学习一下吧~

Ps1:接下来,我给出的指令都是按照 Redis 官方文档的语法格式来解析的,[ ] 相当于一个独立的单元,表示可选项(可有可无),其中 | 表示 “或者” 的意思,多个只能出现一个,[ ] 和 [ ] 之间是可以同时存在的.

Ps2:一个快速失去年终奖的小技巧 —— 清除 redis 上所有的数据 =》 FLUSHALL,这个操作可以把 redis 上所有的键值对全部带走.

Ps3:不同操作返回值差别挺大,很容易记混,不用可以去背,经常使用的操作,自然就记住了.

一、Set 类型


1.1、操作命令

redis 中的 set 就是一个集合,集合就是把一些关联的数据放在一起,我们把集合中的元素叫 member ,具有以下特殊的特性:

  1. 集合中的元素是无序的.
  2. 集合中的元素是唯一的,不能重复.
  3.  和 list 类似,集合中的每个元素都是 string 类型的,同时也可以使用 json 这样的格式让 string 存储 结构化 的数据.

Ps:这里提到的到无序,对应前面讲到的 list.

list: [1, 2, 3] 和 [2, 1, 3] 是两个不同的 list.

set: [1, 2, 3] 和 [2, 1, 3] 是两个相同的 set.

sadd / smembers(添加)

将一个或多个元素添加到 set 中,返回值是成功添加的元素个数. 注意,重复的元素会添加失败.

SADD key member [member ...]

获取一个 set 中所有的元素. 注意,返回的元素是无序的.

SMEMBERS key

sismember(判断存在)

判断一个元素是否在 set 中,返回 1 表示存在,0表示不存在.

SISMEMBER key member

scard(获取元素个数)

用来获取 set 中元素的个数.

SCARD key

 

spop(删除元素)

pop 一般表示 “从末尾” 删除一个元素,集合中的元素都是无序的,末尾是什么呢?在 redis 的 set 中,使用 spop 表示随机删除一个元素.

SPOP key [count]

通过 count 参数可以指定删除的个数,没写就是默认删除这一个.

smove(移动) 

将 member 从 source 上删除,再插入到 destination 中.

返回 1 表示移动成功.

返回 0 表示移动失败,但是 source 中删除成功,只是 destination 中不能出现重复元素(destination 中含有新插入的元素).

SMOVE source destination member

 

 srem(删除)

可以一次删除一个 或 多个 member ,返回值表示删除元素的个数.

SREM key member [member ...]

sinter / sinterstore(交集 / 存储)

交集就是在两个集合中都有的元素,通过 sinter 就可以获取多个元素的之间的交集,时间复杂度为 O(N*M),N 是最小的集合元素个数,M 是最大集合的元素个数.

SINTER key [key ...]

//此处 key 对应一个集合,返回值就是最终交集的数据.

sinterstore 用来将算好的交集,放到 destination 这个 key 对应的集合中

SINTERSTORE destination key [key ...]

 

sunion / sunionstore(并集 / 存储)

并集就是两个集合的数据全集,sunion 就是返回并集的结果数据,时间复杂度为 O(N),N 表示总的元素个数.

SUNION key [key ...]

sunionstore 直接把并集的结果存储到 destination 对应的集合中,返回值事并集的元素个数.

SUNIONSTORE destination key [key ...]

 

sdiff / sdiffstore(差集 / 存储)

差集,A 和 B 做差集,就是找出哪些元素在 A 中存在,同时 B 中不存在(B 和 A 做差集则相反).

SDIFF key [key ...]

 

 

sdiffstore 就是将差集的结果放在 destination 中,时间复杂度为 O(N).

SDIFFSTORE destination key [key ...]

1.2、set 的内部编码方式

 set 内部有两种编码方式:

  1. intset:整数集合,当所有元素均为整数,并且元素个数不是很多的时候,为了节省空间,做出的特定优化.
  2. hashtable:最基本的哈希表(不是 java 标准库中的 HashTable),redis 内部对哈希表的实现方式和 java 中的哈希表可能不太一样,但是整体思想都是一样的;时间上复杂度O(1),但是空间上会有一定的浪费(hash 是一个数组,数组上有些位置有元素,有些位置没有元素).

 

1.3、使用场景

用户画像(set 保存用户 “标签”)

通过你对这个服务器访问的数据,分析出你这个人的一些特征,之后再 “投其所好”~

抖音这款软件在这方面做的就尤为突出,他会根据用户经常观看收藏点赞那种类型的视频,就能看出你这个人的 性别、年龄、居住地、爱好... 通过这个过程,就会将这些特征,就会转换成标签保存到 redis 的 set 中,之后就会给你推送与这些标签相关的视频内容.

共同好友

基于 set 的 “集合求交集” 就可得到两个用户之间的 “用户关系”

在 QQ 上,我这边加了很多好友,你这边也加了很多好友,这样系统就可以做到好友推荐:

A 的好友中有 B 和 C.

D 的好友中也有 B 和 C.

系统就会把 A 推荐给 D.

统计 UV(去重)

利用 set 的去重机制,衡量用户规模.

一个互联网产品衡量用户规模,主要就是两个指标:

PV:page view,用户每次访问服务器都会产生一个 pv.

UV:user view ,每个用户访问服务器,都会产生一个 uv,但是同一个用户多次访问,不会使 uv 增加,这就需要基于 set 实现去重.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

剑指27 二叉树的镜像 28.对称的二叉树 26.树的子结构

方法1&#xff1a;队列迭代 方法2&#xff1a;递归 队列迭代&#xff1a; class Solution { public:TreeNode* mirrorTree(TreeNode* root) {queue<TreeNode*> q;if(rootNULL) return root;q.push(root);while(!q.empty()){TreeNode *curq.front();if(!cur) continue;//…

Golang并发控制

开发 go 程序的时候&#xff0c;时常需要使用 goroutine 并发处理任务&#xff0c;有时候这些 goroutine 是相互独立的&#xff0c;需要保证并发的数据安全性&#xff0c;也有的时候&#xff0c;goroutine 之间要进行同步与通信&#xff0c;主 goroutine 需要控制它所属的子gor…

MySQL_2.3【高级查询】超详细讲解

1. distinct关键字 distinct # 在MySQL中&#xff0c;DISTINCT关键字用于消除重复记录&#xff0c;并返回唯一的记录集。 # DISTINCT关键字可以用在SELECT语句的开头&#xff0c;并在查询结果中显示唯一的行。 # 语法如下&#xff1a; select distinct 列1, ... , 列n from t…

vcomp100.dll丢失怎样修复?总结三个简单的修复方法

最近我遇到了一个问题&#xff0c;我的电脑上出现了vcomp100.dll文件丢失的错误。这个错误导致我无法运行一些使用了Microsoft Visual C编写的程序。当我第一次遇到这个问题时&#xff0c;我感到非常困惑和沮丧&#xff0c;因为我不知道如何解决这个问题。 然后&#xff0c;我开…

服务器操作手册——Slurm常用命令

文章目录 引言正文Slurm集群、节点、分区介绍Salloc申请节点并进入查看已经申请的节点终止作业查看集群情况退出节点具体运行问题无法联网问题安装的包找不到 引言 实验室的服务器的操作指令&#xff0c;之前同学写的不够详细&#xff0c;或者说有点乱&#xff0c;这里做一个简…

C++(类与对象)详解 - 1

C&#xff08;类与对象&#xff09;详解 - 1 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化7.类的对象大小的计算7.1 如何计算类对象的大小7.2 类对象的存储方式7.3 结构体内存对齐规则 8.类成员函…

项目4渗透全过程

网络拓扑图 任务从拓扑图中可以其中一台web服务器可以进行与kali的直接通信。该web服务器是双重网段。也就是拿到该服务器就可以在进行下一步内网操作了。 2008配置&#xff1a; 护卫神主机系统密码&#xff1a;!#Qwe123. sqlserver2008密码&#xff1a;!#a123… 一、信息收…

遥感目标检测(3)-DAL(Dynamic Anchor Learning for Object Detection)

目录 一、概述 二、背景 三、建议 1、旋转RetinaNet 2、动态锚框分布 3、匹配敏感损失 四、实验 一、概述 由于选择正样本锚框进行回归&#xff0c;不一定能够定位真实的GT&#xff0c;而部分负样本回归甚至可以回归到真实的GT&#xff0c;说明相当多的负样本锚框有着准…

FreeRTOS 初识

从这节开始学习FreeRTOS操作系统。 FreeRTOS 介绍 Q: 什么是 FreeRTOS &#xff1f; A: Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比…

【Java 并发编程】读写锁 ReentrantReadWriteLock StampLock 详解

读写锁 ReentrantReadWriteLock & StampLock 详解 1. 读写锁1.1 并发场景1.2 什么是读写锁1.3 思考如何自己实现一把锁&#xff1f; 2. ReentrantReadWriteLock2.1 ReentrantReadWriteLock 概述及其基本结构2.2 ReentrantReadWriteLock 的特点2.2.1 读写锁的互斥关系2.2.2 …

springboot实现qq邮箱发送邮件或者验证码

首先我先去qq邮箱或者网易邮箱开通POP3/IMAP/SMTP/Exchange/CardDAV 服务 它在左上角的设置——账户——往下滑就可以找到——然后点击开通 开通后就会得到一串授权码。如下图 接下来直接编写代码 首先我没导入依赖 <!-- 这个是邮箱验证--> <dependency> <group…

IDEA+java+spring+hibernate+jquery+mysql后台管理系统

IDEA javaspringhibernatejquerymysql后台管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.修改密码3.我的内容4.我的操作日志5. 我的登陆日志6. 我的登陆授权7. 内容管理8.标签管理9. 搜索词管理10.分类管理11.分类类型12.标签分类13.用户管理14.部门管理15.角色…

elasticsearch在统计存储用量方面的应用

存储介绍 对象存储在现在的项目中应用非常广泛&#xff0c;主要用来存储图片、视频、音频、文件等静态资源&#xff0c;所有云服务厂商基本上都有对象存储&#xff0c;对象存储收费一般 按每月每GB收费&#xff0c;如七牛的0.098 元/GB/月&#xff0c;阿里的0.12元/GB/月。比如…

k8s网络之(一)如何调试容器网络 nsenter

① 背景 ② 三种解决策略 最常见&#xff1a; 镜像为了保持精简化,没有安装网络命令,缺少必要的基础网络软件 ③ pod_id和container_id关系 细节&#xff1a; 一个pod内可以有多个容器,意味者可以有多个容器id说明&#xff1a; docker ps 默认容器id只有前12位案例&#x…

如何理解自动化

目录 1.如何定义自动化 2.自动化给人类带来的福利 3.如何学习自动化 4.自动化潜在的危害 1.如何定义自动化 自动化是指利用计算机、机械、电子技术和控制系统等现代科学技术手段&#xff0c;对各种工业、商业、农业和日常生活中的操作和过程进行自动控制和执行的过程。它旨在…

《博客继续更新说明》

目录 1.博客停更原因2.考研和比赛3.工作和博客题外话 1.博客停更原因 自2022.6.20起&#xff0c;本人CSDN博客断更了&#xff0c;故很多粉丝的私信没有看到&#xff0c;非常抱歉哈&#xff0c;简单叙说下这一年经历&#xff0c;当时大三后期原本想法是直接找嵌入式实习的&#…

怎样用IDEA社区版以及企业版创建spring boot项目?

Spring 的诞生是为了简化 Java 程序的开发的&#xff0c;而 Spring Boot 的诞生是为了简化 Spring 程序开发的 。 Spring Boot 翻译一下就是 Spring 脚手架&#xff0c;什么是脚手架呢&#xff1f;如下图所示&#xff1a; 盖房子的这个架子就是脚手架&#xff0c;脚手架…

脑电信号处理与特征提取——三. 脑电实验设计的原理与实例(古若雷)

三、脑电实验设计的原理与实例 被试间设计的实验结果也有可能是人员不同造成的&#xff0c;所以建议被试内设计。

【力扣每日一题】2023.7.22 柠檬水找零

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这是一道模拟题&#xff0c;我们贩卖五美元&#xff08;忒贵了&#xff09;一杯的柠檬水&#xff0c;然后只收取5,10,20面值的钞票…

API自动化测试总结

目录 Jmeter是怎么做API自动化测试的&#xff1f; Jmeter中动态参数的处理&#xff1f; 怎么判断前端问题还是后端问题&#xff1f; 详细描述下使用postman是怎么做API的测试的&#xff1f; 资料获取方法 Jmeter是怎么做API自动化测试的&#xff1f; 1、首先在JMeter里面…