Redis数据结构之set

一.set集合特性

集合类型也是保存多个字符串类型的元素的,但和list列表不一样,集合中的元素是无序的,而且元素不能够重复,不仅支持增删查改,还支持交集并集等操作

二.相关命令

1.sadd

sadd key members……

咱们把集合中的元素叫做member(和hash中的field要区分开)

一次可以添加多个元素

返回值是元素个数

时间复杂度O(1)

2.smembers

smembers key 获取集合中的元素,是无序的

时间复杂度O(N)

3.sismember

sismember key member 判断一个元素在不在集合中

时间复杂度O(1)

返回1表示在,返回0表示不在

4.scard

scard key 获取一个集合中的基数(cardinality),即set中的元素个数

时间复杂度O(1)

5.spop

spop key (count) 从中删除并返回一个或者多个元素。但注意,由于set内部的元素是无序的,所以不知道哪个元素是末尾,所以取出哪个元素实际上是未定义行为,即是随机的

时间复杂度:O(N),N就是count

如果构造一个set,按照1234的顺序插入元素,pop的结果会是啥,我们无法得知

6.smove

smove source destination member 把member从source上删除,再插入到destination中

如果要移动的元素再source中不存在,就会返回0

7.srem

srem key member[member……] 一次删除一个或多个member'

返回值是删除成功的个数

8.sinter

sinter key [key……]求交集,返回值是最终交集的数据

O(M*N)

9.sinterstore

sinterstore destination key[key……]将得到的交集放到destination中

10.sunion sunionstore

sunion key [key……]求并集

sunionstore同上

O(N)

11.sdiff sdiffstore

sdiff是求差集

O(N)

上述集合简单操作的时间复杂度的求法涉及到了集合内部的源码实现

三.内部编码

intset:整数集合,当集合中元素都是整数并且个数小于set-max-inset-entries时,就会用intset

hashtable:哈希表,除上述之外的都是用哈希表

四.使用场景

1.使用set来保存用户标签

例如:A用户对娱乐板块感兴趣,B对体育板块感兴趣,这些兴趣点就可以被抽象成标签。有了这些数据,就可以得到喜欢同一个标签的用户,也可以得到用户共同喜欢的标签,这些事u据对于增强用户体验等都有非常大的帮助

1.给用户添加标签

sadd user:1:tags tag1 tag2 tag3……

2.给标签添加用户

sadd tag:1:users user1 user2……

3.删除用户下的标签

srem user:2:tags tag3 tag5

4.删除标签下的用户

srem tag:3:users user1 user45

5.计算共同的兴趣

sinter user:1:tags user:4:tags

这其实就是给用户画像:分析清楚你这个人的特征,分析清楚后再投其所好~千人千面。

1.根据用户的历史行为,看出一个用户的性别、年龄、爱好……。上述数据,很多公司共享(俩个程序,两个账号,咋知道这是一个人?现在的程序登录入口,就俩,一个微信一个手机号)。通过上述过程,搜集到用户的特征,就会转换成标签(简短的字符串),此时就可以把标签保存到redis的set中

2.使用set计算用户间的共同好友

基于集合求交集

基于此还能做好友推荐

A和B是好友,A和C是好友,BCD是好友,所以系统会将D推荐给A

3.使用set统计UV

一个互联网产品,如何衡量用户量用户规模?主要指标就是两方面

PV、UV

PV是page view  UV是user view,用户每访问一次服务器就会产生一个pv,每个用户访问服务器都会产生一个uv,但是同一个用户访问多次,不会使得uv增加

uv按照用户去重,就是set做的

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

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

相关文章

华为HarmonyOS地图服务 9 - 如何在地图上绘制多边形?

场景介绍 本章节将向您介绍如何在地图上绘制多边形。 接口说明 添加多边形功能主要由MapPolygonOptions、addPolygon和MapPolygon提供,更多接口及使用方法请参见接口文档。 接口名 描述 MapPolygonOptions 用于描述MapPolygon属性。 addPolygon(options: mapC…

SOMEIP_ETS_122: SD_Interface_Version

测试目的: 验证DUT能够以正确的格式响应接口版本获取请求。 描述 本测试用例旨在确保DUT能够正确地返回其接口版本信息,这是SOME/IP协议中用于确定服务兼容性的关键信息。 测试拓扑: 具体步骤: TESTER:触发接口版…

高密原型验证系统解决方案(上篇)

0 引言 随着当今 SoC 设计规模的快速膨胀,仅仅靠几 颗当代最先进的 FPGA 已经无法满足原型验证的需求。简单的增加系统的容量,会遇到系统时钟复位同 步,设计分割以及高速接口和先进 Memory控制器 IP 验证等多重困难。此时,一个商用…

Contact Form 7最新5.9.8版错误修复方案

最近有多位用户反应Contact Form 7最新5.9.8版的管理页面有错误如下图所示 具体错误文件的路径为wp-content\plugins\contact-form-7\admin\includes\welcome-panel.php on line 153 找到welcome-panel.php这个文件编辑它,将如下图选中的部分删除 删除以后&#xf…

AUTOSAR入门篇

AUTOSAR简介 AUTomotive Open System ARchitecture 汽车开放系统结构 AUTOSAR背景 随着车载控制系统日益先进和复杂化,每辆汽车投入的软件开发工数(时间及人力)2010年将达到2002年的5-10倍。汽车电子系统设计复杂化造成的可靠性隐患导致汽车因安全隐患被“招回”的现象频繁…

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo 洪涝洪水滑坡灾害数据集 数据集描述 该数据集是一个专门用于检测和识别洪涝、洪水和滑坡等自然灾害的数据集,旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了两种常见的自然灾害…

Java—SPI 机制详解

参考文章 Java常用机制 - SPI机制详解 | Java 全栈知识体系包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读&a…

力扣之183.从不订购的客户

1. 183.从不订购的客户 1.1 题干 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Ord…

有关shell指令练习2

写一个shell脚本,将以下内容放到脚本中 在家目录下创建目录文件,dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中, 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …

MATLAB基于传统方法的车道线检测实现

MATLAB基于传统方法的车道线检测实现 本文实现的是基于传统方法的车道线检测,所谓传统方法就是没有涉及到深度学习算法,基于直观的手段和数学知识来实现,后期会实现基于深度学习的车道线检测方法。 实现步骤: Canny边缘检测手动…

html 几行的空间分成3个区域

1.代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>三个区域示例</title> …

SpringBoot+Vue考试系统免费分享

源码说明&#xff1a; 这是一个开源的SpringBoot与Vue开发的在线考试系统。经过站长测试&#xff0c;系统稳定可用&#xff0c;允许重复考试。 环境&#xff1a; 需要安装的环境包括Node.js v14.21.3、JDK8、Maven以及MySQL 5.7。 前端部署教程&#xff1a; 执行 npm inst…

掌控历史:如何通过Git版本管理工具提升你的开发效率

先一览全局: git目录 一.打开git二.git bash的基础命令三.配置git四.仓库搭建五.文件操作和状态六.忽略文件七.gitee的使用1.添加公钥2.创建仓库 八.vs中使用git九.git分支常用命令十.文件差异比较十一.文件回溯和推进十二.合并冲突和消除十三.合并/压缩提交十四.远程仓库推拉十…

新160个crackme - 062-syllogism-crackme1

运行分析 需要破解Name和Serial PE分析 C程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida找到成功弹窗字符串&#xff0c;双击进入函数 分析关键函数&#xff0c;还需要分析sub_401368函数 分析sub_401368函数&#xff0c;发现是将Name第一位替换为空格&#…

带你0到1之QT编程:十六、三种框架自带Dialog,助你在开发一臂之力

此为QT编程的第十六谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

信息安全工程师(12)网络攻击概述

前言 网络攻击&#xff08;Cyber Attacks&#xff0c;也称赛博攻击&#xff09;是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的任何类型的进攻动作。这些攻击旨在破坏、揭露、修改、使软件或服务失去功能&#xff0c;或在未经授权的情况下偷取或访问计算机数…

消息中间件---Kafka

一、什么是Kafka&#xff1f; Kafka是一个分布式流处理平台,类似于消息队列或企业消息传递系统&#xff1b; 流处理事什么呢&#xff1f; 流处理就是数据处理工作流&#xff0c;本质上是一种计算机编程范例。流处理是对接收到的新数据事件的连续处理。‌它涉及对从生产者到消…

spring boot(学习笔记第二十课) vue + spring boot前后端分离项目练习

spring boot(学习笔记第二十课) vue spring boot前后端分离项目练习 学习内容&#xff1a; 后端程序构建前端程序构建 1. 后端程序构建 前后端分离结构 前后端就是前端程序和后端程序独立搭建&#xff0c;通过Restful API进行交互&#xff0c;进行松耦合的设计。后端程序构建…

WebGL入门(一)绘制一个点

源码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><scr…

【开源免费】基于SpringBoot+Vue.JS教师工作量管理系统(JAVA毕业设计)

本文项目编号 T 043 &#xff0c;文末自助获取源码 \color{red}{T043&#xff0c;文末自助获取源码} T043&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…