redis的学习(三)

news2025/3/1 9:57:52

6. set集合

        集合:把一些有关联的数据放在一起。

        1、集合中的元素是无序的,即数据存放顺序不重要,变化一下顺序,集合依旧是之前的集合。

        2、集合中的元素是不能重复的(唯一性)与list类似的是集合中的每一个元素也都是string类型的,可以使用json格式的字符串存储结构化数据。

6.1 set指令

SADD : 将⼀个或者多个元素添加到set中,重复的元素⽆法添加到set中。 

SADD key member [member ...]

时间复杂度:O(1)

返回值:本次添加成功的元素个数。

SMEMBERS 获取⼀个set中的所有元素,元素间的顺序是⽆序的。

SMEMBERS key 

时间复杂度:O(N)

返回值:所有元素的列表。

SISMEMBER :判断⼀个元素在不在set中。

SISMEMBER key member 

时间复杂度:O(1)

返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。

 spop:随机删除一个或多个元素。

SPOP key [count]

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

返回值:取出的元素。

 SMOVE 将⼀个元素从源set取出并放⼊⽬标set中。

SMOVE source destination member

时间复杂度:O(1)

返回值:1表⽰移动成功,0表⽰失败。

 srem:将指定的元素从set中删除。

SREM key member [member ...]

时间复杂度:O(N),N是要删除的元素个数.

返回值:本次操作删除的元素个数。

6.2 集合间的操作

 交集(inter)、并集(union)、差集(diff)的概念如图所⽰。

 SINTER:给定set的交集中的元素。

SINTER key [key ...] 

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数.

返回值:交集的元素。

 SINTERSTORE 获取给定set的交集中的元素并保存到⽬标set中。

SINTERSTORE destination key [key ...]

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数.

返回值:交集的元素个数。

SUNION 获取给定set的并集中的元素。 

SUNION key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素。 

SUNIONSTORE 获取给定set的并集中的元素并保存到⽬标set中。

SUNIONSTORE destination key [key ...] 

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素个数。

 SDIFF 获取给定set的差集中的元素。

SDIFF key [key ...]

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素。

 SDIFFSTORE 获取给定set的差集中的元素并保存到⽬标set中。

SDIFFSTORE destination key [key ...] 

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:差集的元素个数。

6.3 内部编码

        java中的set本质上是一个接口,其实现方式可以是treeset或hashset。

         intset(整数集合):为了节省空间做的特定优化。当元素为整数,且元素的个数不是很多的时候。

        hashtable(哈希表):当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合 的内部实现。

6.4 set的应用场景

1、使用set来保存用户的标签

2、方便计算交集

3、使用set统计uv:

1、pv page view 用户每一次访问浏览器,都会产生一个pv。

2、uv user view 用户每一次访问浏览器,都会产生一个uv。但是同一个用户多次访问同一个页面只会增加一次uv。

7.zset 有序集合

        zset排序的规则:给zset中的member引入一个属性分数(score,浮点类型),每一个member都会安排一个分数,进行排序的时候,就是按照次数的分数的大小进行升序或降序排的。zset中的member要求是唯一的,但是其score不是唯一的。

7.1 列表、集合、有序集合三者的异同点

7.2 操作指令

 ZADD:添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型,+inf/-inf作为正负 极限也是合法的。可以根据member来查找score,也可以通过score查找member。

ZADD的相关选项:

        • XX:仅仅⽤于更新已经存在的元素,不会添加新元素。元素指的是member。

        • NX:仅⽤于添加新元素,不会更新已经存在的元素。

        • CH:默认情况下,ZADD返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次修改的元素的个数。

        • INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和 分数。

        lt:less than 现在更新分数,给定的值要比之前的值分数小,就进行更新,负责不更新。

        gt:greater than:只有分数数值大于之前的数值的时候才会进行更新。

        ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

        时间复杂度:O(log(N)),n是有序集合中已经存在的元素个数。由于zset是有序结构,在新增元素的时候要进行找位置。

        返回值:本次添加成功的元素个数。

        如果两个member的score是一样的话,就按照元素自身的字典序来排列。zset内部实际是按照升序排列的。 

zrange:查看有序集合中的元素详情了,redis内部存储数据的时候,是按照二进制的方式来存储的,即redis服务器不负责“字符编码”,要把二进制字节转回到汉字,就需要在客户端进行指令“redis-cli --raw”

查询带分数的值:zrange key 0 -1 withscores

ZRANGE :返回指定区间⾥的元素,分数按照升序。带上WITHSCORES可以把分数也返回。

ZRANGE key start stop [WITHSCORES] 处的[start, stop] 为下标构成的区间.从0开始,⽀持负数.  时间复杂度:O(log(N)+M),表示两个区间之间的元素的个数。

返回值:区间内的元素列表

ZCARD:获取⼀个zset的基数(cardinality),即zset中的元素个数。

ZCARD key

时间复杂度:O(1)

返回值:zset内的元素个数

 ZCOUNT 返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的,可以通过(排除。

ZCOUNT key min max

 时间复杂度:O(log(N)),zset内部会记录每一个元素当前的排行,直接查询max和min元素,就知道了这两个元素的次序,然后做减法获取返回值。

返回值:满⾜条件的元素列表个数。

排除min值的语法:ZCOUNT key (min max,加一个括号。

排除max的语法:ZCOUNT key min (max,也加一个括号。

min和max可以写成浮点数,inf.表示无穷大,- inf.表示无穷大。

ZREVRANGE :返回指定区间⾥的元素,分数按照降序。带上WITHSCORES可以把分数也返回。 

ZREVRANGE key start stop [WITHSCORES]

 时间复杂度:O(log(N)+M)

返回值:区间内的元素列表。

语法中的-1,表示len-1.

ZRANGEBYSCORE:返回分数在min和max之间的元素,默认情况下,min和max都是包含的,可以通过(排除。

ZRANGEBYSCORE key min max [WITHSCORES] 

时间复杂度:O(log(N)+M) 

返回值:区间内的元素列表。

ZPOPMAX 删除并返回分数最⾼的count个元素。

ZPOPMAX key [count]

时间复杂度:O(log(N)*M)

返回值:分数和元素列表。

BZPOPMAX :ZPOPMAX的阻塞版本。每一个key都是一个有序集合。阻塞也是在有序集合为空的时候触发的阻塞,阻塞到有其他客户端插入元素。

 BZPOPMAX key [key ...] timeout

时间复杂度:O(log(N))

返回值:元素列表。 

        当然如果有序集合中已经有了元素,就直接返回元素,不用进行阻塞了。如果当前bzpopmax同时监听了多个key,假设有m个key,此时的时间复杂度依旧是O(log(N))。

 ZPOPMIN :删除并返回分数最低的count个元素。

ZPOPMIN key [count] 

时间复杂度:O(log(N)*M)

返回值:分数和元素列表。

        虽然redis的有序函数记录了开头的元素,但是删除的时候使用的是通用的删除函数,故此导致了重新查找的过程。

 BZPOPMIN :ZPOPMIN的阻塞版本。

BZPOPMIN key [key ...] timeout

 时间复杂度:O(log(N))

返回值:元素列表。

 ZRANK :返回指定元素的排名(下标),升序的方式。

ZRANK key member

时间复杂度:O(log(N))

返回值:排名。

ZREVRANK :返回指定元素的排名,降序的方式。

ZREVRANK key member

 时间复杂度:O(log(N))

返回值:排名。

ZSCORE 返回指定元素的分数。

ZSCORE key member

 时间复杂度:O(1)

返回值:分数 

        此处相当于redis对于这样的查询操作做了特殊的优化,通过扩大空间的消耗面对与时间复杂度优化到了o(1)。

ZREM 删除指定的元素。

ZREM key member [member ...]

时间复杂度:O(M*log(N)),m是参数的个数

返回值:本次操作删除的元素个数。

ZREMRANGEBYRANK 按照排序,升序删除指定范围的元素,左闭右闭。

ZREMRANGEBYRANK key start stop

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数。 

ZREMRANGEBYSCORE 按照分数删除指定范围的元素,左闭右闭。 

ZREMRANGEBYSCORE key min max 

时间复杂度:O(log(N)+M)

返回值:本次操作删除的元素个数。

 ZINCRBY 为指定的元素的关联分数添加指定的分数值。

ZINCRBY key increment member 

时间复杂度:O(log(N))

返回值:增加后元素的分数。

 zinterstore:交集,结果保存到另一个key中。

zunionstore:并集,结果保存到另一个key中。

        所谓权重就是每一个部分占整体的分量的比例。

        aggregate:统计,合计。

        在zset中,member才是元素本体,score只是辅助排序的工具人,因此在进行比较“相同”的时候,只要member相同即可,score不一样无所谓。但是求交集的时候相同元素不同score的最终score应该怎样计算。

        计算规则按照aggregate的sum,max,min这三种方式进行计算。默认是sum的方式。

        时间复杂度:o(n*k)+o(m*log(n)),n是输入若干个有序集合,里面元素最小的个数。k是吧k个有序集合求交集,m是最终结果的有序集合元素个数。近似来算可以看成

o(m*log(m))。

 ZUNIONSTORE: 求并集

 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE <sum | max | min> ]

时间复杂度:O(N)+O(M*log(M)) N是输⼊的有序集合总的元素个数;M是最终结果的有序集合的元素 个数. 返回值:⽬标集合中的元素个数

7.3 内部编码

         1、当元素个数较少且每个元素较⼩时,内部编码为ziplist:

        2、当元素个数较多或者单个元素体积较大,内部编码skiplist:

7.4 zset的应用场景

1、排行榜系统

        1m字节是百万级别,1g是十亿字节级别。

8. streams 

        事件:每次socket上都有可读可写的数据,都会通过事件回调机制来通知相关的应用程序代码。有些操作不知道啥时候出现,所以只能等事情出现之后再采取动作。

        streams类似于一个阻塞队列。属于是list的blpop/brpop的升级版本。

9. geospatial

        地理空间。用来存储坐标,存储一些点之后,根据用户给定的一个坐标和半径扫描,去查找redis中存储的符合条件的位置坐标。一般应用于地图中查找位置和定点范围内地点查询。

10. hyperloglog

        应用场景只有一个,估算集合中的元素的个数。

        使用set记录浏览器的uv,可以知道每一个uv的相关详细信息。但是需要消耗很大的空间资源。hyperloglog最多使用12kb的空间实现对于上亿次uv的数量统计,但是仅仅是统计数量,并不能知道每一个uv的访问信息。

        但是该指令存在0.81%的估算误差。

11. bitmaps

        位图:使用bit位来表示整数。本质上还是一个集合,属于是set类型针对整数的特化版本。bitmap相对于hyplerloglog,能够存储元素。

        下面将10存储到位图中:

12. bitfields

        位域,本质上是让我们进行精确进行位操作的一种方法。bitfields可以理解成一串二进制序列(字节数组),同时可以把这个字节数组的某几个位赋予特定的含义,进行一系列的相关操作。该效果相对于string和hash也是节省了大部分空间。

ps:谢谢观看!

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

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

相关文章

点赞系统设计(微服务)

点赞业务是一个常见的社交功能&#xff0c;它允许用户对其他用户的内容&#xff08;如帖子、评论、图片等&#xff09;表示喜欢或支持。在设计点赞业务时&#xff0c;需要考虑以下几个方面&#xff1a; 一、业务需求 点赞业务需要满足以下特性&#xff1a; 通用&#xff1a;…

C#进阶-在Ubuntu上部署ASP.NET Core Web API应用

随着云计算和容器化技术的普及&#xff0c;Linux 服务器已成为部署 Web 应用程序的主流平台之一。ASP.NET Core 作为一个跨平台、高性能的框架&#xff0c;非常适合在 Linux 环境中运行。本篇博客将详细介绍如何在 Linux 服务器上部署 ASP.NET Core Web API 应用&#xff0c;包…

设计模式-结构型-桥接模式

1. 什么是桥接模式&#xff1f; 桥接模式&#xff08;Bridge Pattern&#xff09; 是一种结构型设计模式&#xff0c;它旨在将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。通过这种方式&#xff0c;系统可以在抽象和实现两方面进行扩展&#xff0c;而无需相互影响…

python学习笔记—16—数据容器之元组

1. 元组——tuple(元组是一个只读的list) (1) 元组的定义注意&#xff1a;定义单个元素的元组&#xff0c;在元素后面要加上 , (2) 元组也支持嵌套 (3) 下标索引取出元素 (4) 元组的相关操作 1. index——查看元组中某个元素在元组中的位置从左到右第一次出现的位置 t1 (&qu…

基础算法--查找

一、线性枚举 1、线性枚举定义 线性枚举指的就是遍历某个一维数组&#xff08;顺序表&#xff09;的所有元素&#xff0c;找到满足条件的那个元素并且返回&#xff0c;返回值可以是下标&#xff0c;也可以是元素本身。 由于是遍历的&#xff0c;穷举了所有情况&#xff0c;所…

G1垃圾回收器的FullGC

如何确定GarbageFirst回收器发生的是FullGC ? 必须出现FullGC字样才算是FUllGC&#xff0c;例如下图&#xff1a;因为内存分配失败&#xff08;Allocation Failure&#xff09;导致 如果不出现FullGC的字样说明它不是FUllGC&#xff0c;并不像Serial GC、ParallelGC的在老年代…

Golang的代码压缩技术应用案例分析与研究实践

Golang的代码压缩技术应用案例分析与研究实践 一、介绍 是一种具有强大性能和便捷开发特性的编程语言&#xff0c;除了其优秀的语法和标准库外&#xff0c;它还拥有很多高级特性&#xff0c;其中之一就是代码压缩技术。本文将从常见的Golang代码压缩技术应用案例出发&#xff0…

【Uniapp-Vue3】image媒体组件属性

如果我们想要在页面上展示图片就需要使用到image标签。 这部分最重要的是图片的裁剪&#xff0c;图片的裁剪和缩放属性&#xff1a; mode 图片裁剪、缩放的模式 默认值是scaleToFill 我将用两张图片对属性进行演示&#xff0c;一张是pic1.jpg&#xff08;宽更长&#xf…

【网络协议】交换机概念与配置(第一部分)

概述 本文将探讨交换机的概念以及交换机的基础配置&#xff0c;并以此引入对 VLAN 的讨论。 文章目录 概述CSMA/CD以太网通信单播&#xff08;Unicast&#xff09;多播&#xff08;Multicast&#xff09;广播&#xff08;Broadcast&#xff09; MAC 地址以太网中的双工设置半双…

oracle位运算、左移右移、标签算法等

文章目录 位运算基础与或非同或同或应用场景 异或异或应用场景 什么是真值表 oracle基础函数创建bitor(按位或)函数bitnot(按位非)函数bitxor(按位异或)函数左移函数BITSHIFT()函数(实测不可用&#xff0c;废弃掉该方案)右移函数(略&#xff0c;有此场景吗?) 实际应用资质字典…

(五)ROS通信编程——参数服务器

前言 参数服务器在ROS中主要用于实现不同节点之间的数据共享&#xff08;P2P&#xff09;。参数服务器相当于是独立于所有节点的一个公共容器&#xff0c;可以将数据存储在该容器中&#xff0c;被不同的节点调用&#xff0c;当然不同的节点也可以往其中存储数据&#xff0c;关…

《零基础Go语言算法实战》【题目 1-18】切片的反转

《零基础Go语言算法实战》 【题目 1-18】切片的反转 请编写一个名为 reverse 的函数&#xff0c;采用整数切片并在不使用临时切片的情况下将切片反转。 【解答】 可以通过 for 循环交换切片中每个元素的值&#xff0c;使其从左向右滑动。最终&#xff0c;所有元素都将 被反转。…

Elasticsearch:搜索相关性

这里写目录标题 一、相关性的概述二、自定义评分策略1、TF-IDF算法2、BM25算法 三、自定义评分策略1、Index Boost&#xff1a;在索引层面修改相关性2、boosting&#xff1a;修改文档相关性3、negative_boost&#xff1a;降低相关性4、function_score&#xff1a;自定义评分5、…

【C++经典例题】求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a; 期待您的关注 题目描述&#xff1a; 原题链接&#xff1a; 求123...n_牛客题霸_牛客网 (nowcoder.com) 解题思路&#xff1a; …

淺談Cocos2djs逆向

前言 簡單聊一下cocos2djs手遊的逆向&#xff0c;有任何相關想法歡迎和我討論^^ 一些概念 列出一些個人認為比較有用的概念&#xff1a; Cocos遊戲的兩大開發工具分別是CocosCreator和CocosStudio&#xff0c;區別是前者是cocos2djs專用的開發工具&#xff0c;後者則是coco…

概率论与数理统计总复习

复习课本&#xff1a;中科大使用的教辅《概率论和数理统计》缪柏其、张伟平版本 目录 0.部分积分公式 1.容斥原理 2.条件概率 3.全概率公式 4.贝叶斯公式 5.独立性 6.伯努利分布&#xff08;两点分布&#xff09; 7.二项分布 8.帕斯卡分布&#xff08;负二项分布&am…

el-table自定义按钮控制扩展expand

需求&#xff1a;自定义按钮实现表格扩展内容的展开和收起&#xff0c;实现如下&#xff1a; 将type“expand”的表格列的宽度设置为width"1"&#xff0c;让该操作列不展示出来&#xff0c;然后通过ref动态调用组件的内部方法toggleRowExpansion(row, row.expanded)控…

大语言模型训练的数据集从哪里来?

继续上篇文章的内容说说大语言模型预训练的数据集从哪里来以及为什么互联网上的数据已经被耗尽这个说法并不专业&#xff0c;再谈谈大语言模型预训练数据集的优化思路。 1. GPT2使用的数据集是WebText&#xff0c;该数据集大概40GB&#xff0c;由OpenAI创建&#xff0c;主要内…

【C++习题】22.随机链表的复制

文章目录 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09;代码&#xff1a; 题目&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 链接&#x1f517;&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&…

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中&#xff0c;我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中&#xff0c;在 Excel 文件中添加图像&#xff08;JPEG、PNG&#xff09;,我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg &#xff0c;我们将尝试…