【redis】redis四种统计模式

1、简介

  • Redis的四种统计模式包括聚合统计、排序统计、二值状态统计和基数统计。

2、聚合统计

2.1概述

  • 定义:聚合统计是指统计多个集合元素的聚合结果,包括交集统计、差集统计和并集统计。
  • 场景:在移动应用中,可以统计每天的新增用户数和第二天的留存用户数;在电商网站的商品评论中,可以统计评论列表中的最新评论;在签到打卡中,可以统计一个月内连续打卡的用户数;在网页访问记录中,可以统计独立访客(UV)量。
  • 实现方式:Redis的Set类型支持集合内的增删改查操作,并且支持多个集合间的交集、并集、差集操作。但在数据量较大的情况下,直接执行这些计算可能会导致Redis实例阻塞。为了避免阻塞,可以从主从集群中选择一个从库专门负责聚合计算,或者将数据读取到客户端,在客户端完成聚合统计。

2.2主要方法和数据结构

2.2.1数据结构

  1. Set(集合)
    • 应用场景:适用于聚合计算(并集、交集、差集)场景,如点赞、共同关注、抽奖活动等。
    • 底层实现:由哈希表或整数集合实现。如果集合中的元素都是整数且元素个数小于512个(默认值,可通过set-maxintset-entries配置),Redis会使用整数集合作为Set类型的底层数据结构;否则,使用哈希表。
    • 主要命令
      • SUNIONSTORE:计算多个集合的并集,并将结果存储在新的集合中。
      • SDIFFSTORE:计算一个集合与另一个集合的差集,并将结果存储在新的集合中。
      • SINTERSTORE:计算多个集合的交集,并将结果存储在新的集合中。
  2. Zset(有序集合)
    • 应用场景:适用于需要按照特定分数进行排序的场景,如排行榜、电话和姓名排序等。
    • 底层实现:由压缩列表或跳表实现。如果有序集合的元素个数小于128个,并且每个元素的值小于64字节时,Redis会使用压缩列表作为Zset类型的底层数据结构;否则,使用跳表。
    • 主要命令
      • ZADD:向有序集合中添加一个或多个元素,或者更新已存在元素的分数。
      • ZRANGEZREVRANGE:根据分数范围获取有序集合中的元素,前者按分数升序排列,后者按分数降序排列。
      • ZRANGEBYSCOREZREVRANGEBYSCORE:通过分数范围查询有序集合中的元素,并返回结果。

2.2.2主要方法

  • 交集统计:使用SINTERSTORE命令计算多个集合的共有元素。
  • 差集统计:使用SDIFFSTORE命令统计一个集合相对于另一个集合独有的元素。
  • 并集统计:使用SUNIONSTORE命令统计多个集合的所有元素。
  • 有序集合排序统计:利用Zset的分数属性,通过ZRANGEZREVRANGEZRANGEBYSCOREZREVRANGEBYSCORE等命令,根据分数进行排序并获取元素。

3、排序统计

3.1概述

  • 定义:排序统计涉及到数据的排名和顺序。
  • 场景:排行榜、按收藏或点赞数排序的场景等。
  • 实现方式:Redis的List和Sorted Set类型属于有序集合。List是按照元素进入List的顺序进行排序的,而Sorted Set可以根据元素的权重来排序。在需要分页显示或数据更新频繁的场景中,Sorted Set是一个更好的选择,因为它能根据元素的实际权重来排序和获取数据。

3.2主要方法和数据结构

3.21数据结构

  1. List(列表)
    • 列表是简单的字符串列表,按照插入顺序排序。可以从头部(左边)或尾部(右边)添加元素。
    • 底层基于链表实现,头尾操作效率高,中间操作效率低。
    • 可以使用LPUSH、RPUSH、LINDEX等命令进行排序和访问操作。
  2. Set(集合)
    • Set是String类型的无序集合,基于哈希表实现。
    • 本身就是一个键值对集合,键为元素值,值为null。
    • 集合中的元素不重复,可以使用SORT命令进行排序,但需要注意,对Set类型排序时会忽略元素的分数,只针对元素自身的值进行排序。
  3. Zset(有序集合)
    • Zset和Set一样也是String类型元素的集合,但每个元素都会关联一个double类型的分数(score)。
    • 通过分数来为集合中的成员进行从小到大的排序。
    • 成员是唯一的,但分数可以重复。
    • 底层数据结构采用SkipList和哈希表(HT/Dict)组合方式实现。
    • 可以使用ZADD、ZRANGE、ZREVRANGEBYSCORE等命令进行添加、排序和访问操作。

3.2.2主要方法

  1. List排序
    • 通过LPUSH、RPUSH等命令向列表中添加元素。
    • 使用LINDEX命令根据索引获取元素。
    • 使用LLEN命令获取列表长度。
    • 可以通过SORT命令对列表进行排序,但通常List本身并不直接支持高效的排序操作,因为它主要是基于链表实现的。
  2. Set排序
    • 使用SADD命令向集合中添加元素。
    • 使用SMEMBERS命令获取集合中所有元素。
    • 使用SORT命令对集合进行排序,但会忽略元素的分数,只根据元素值排序。
  3. Zset排序
    • 使用ZADD命令向有序集合中添加元素,并指定分数。
    • 使用ZRANGE、ZREVRANGE等命令根据分数范围获取元素。
    • 使用ZRANGEBYSCORE、ZREVRANGEBYSCORE等命令根据分数进行排序并获取元素。
    • 分数可以用于实现高效的排序功能,因为有序集合既可以根据分数进行排序,又可以保持插入顺序。

4、二值状态统计

4.1概述

  • 定义:二值状态统计是指集合元素的取值只有0和1两种状态,通常用于表示某个事件是否发生或某个条件是否成立。
  • 场景:例如每天的签到打卡信息,用户要么打卡了(1),要么没打卡(0)。
  • 实现方式:对于二值状态统计,Redis中的Bitmap是一个有效的工具。用户一天的打卡状态可以用1个bit位来表示(0或1),这样可以有效地节省内存空间。

4.2主要方法和数据结构

4.2.1数据结构:Bitmap

  • 基本概念:Bitmap可以看作是一个bit数组,其中每个bit位表示一个元素的二值状态(0或1)。在Redis中,String类型会保存为二进制的字节数组,Redis则利用这些字节数组的每个bit位来表示二值状态。
  • 内存效率:由于每个元素的状态只需要一个bit位来表示,因此Bitmap在存储大量二值状态时非常节省内存。例如,一亿个用户的二值状态只需要大约12MB的内存(100000000 / 8 / 1024 / 1024 = 12MB)。

4.2.2主要方法

  1. SETBIT:设置或清除指定key的value在offset处的bit值(只能是0或1)。
    • 语法:SETBIT key offset value
    • 示例:SETBIT uid:sign:3000:20200803 2 1(表示用户ID为3000在2020年8月3日的某个时刻签到了,用bit位的第3位(从0开始计数)来表示)
  2. GETBIT:获取指定key的value在offset处的bit位的值。
    • 语法:GETBIT key offset
    • 示例:GETBIT uid:sign:3000:20200803 2(获取用户ID为3000在2020年8月3日的签到状态)
  3. BITCOUNT:统计指定key的value中值为1的bit位的数量。
    • 语法:BITCOUNT key [start] [end]
    • 示例:BITCOUNT uid:sign:3000:202008(统计用户ID为3000在2020年8月的签到次数)
  4. BITOP:对多个Bitmap按位进行“与”、“或”和“异或”操作,并将结果保存到一个新的Bitmap中。
    • 语法:BITOP operation destkey key [key ...]
    • 示例:使用BITOP AND resmap bm1 bm2 bm3将bm1、bm2和bm3进行按位与操作,结果保存到resmap中

5、基数统计

5.1概述

  • 定义:基数统计是指统计一个集合中不重复的元素个数,例如统计UV(独立访客)。
  • 场景:在网页访问记录中,需要统计独立访客的数量。
  • 实现方式:Redis的Set类型默认支持去重,但在数据很多时,Set类型也会消耗很大的内存空间。此时,可以使用Redis提供的HyperLogLog。HyperLogLog是一种用于统计基数的数据集合类型,它的最大优势在于当集合元素数量非常多时,它计算基数所需的空间总是固定的,而且还很小。每个HyperLogLog只需要花费12KB内存,就可以计算接近2^64个元素的基数。但请注意,HyperLogLog的统计结果是有一定误差的,标准误算率是0.81%。

5.2主要方法和数据结构

5.2.1HyperLogLog数据结构

HyperLogLog是Redis提供的一种特殊数据结构,用于高效地估计数据集的基数(即不重复元素的数量)。它具有以下特点:

  1. 内存效率:HyperLogLog使用固定大小的内存来存储估计值,不受集合中元素数量的影响。这使得它适用于处理大规模数据集,内存占用是固定的。
  2. 误差率:HyperLogLog提供的是一种近似计数,而不是精确计数。其标准误差率约为0.81%,这对于许多应用场景来说已经足够准确。
  3. 合并操作:HyperLogLog支持多个集合的合并操作,可以方便地计算多个数据源的并集基数。

5.2.2主要方法

HyperLogLog在Redis中提供了以下几个主要命令:

  1. PFADD:将一个或多个元素添加到HyperLogLog中。
    • 语法:PFADD key element [element ...]
    • 示例:PFADD myloglog user1 user2 user3
  2. PFCOUNT:返回HyperLogLog的基数估计值,即估计的不同元素的数量。
    • 语法:PFCOUNT key [key ...]
    • 示例:PFCOUNT myloglog
  3. PFMERGE:将多个HyperLogLog合并为一个新的HyperLogLog。
    • 语法:PFMERGE destkey sourcekey [sourcekey ...]
    • 示例:PFMERGE mergedloglog myloglog1 myloglog2 myloglog3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读人工智能全传01图灵的电子大脑

1. 人工智能 1.1. 人类对人工智能的梦想,可以追溯到很久很久以前 1.1.1. 从古希腊开始,铁匠之神赫菲斯托斯(Hephaestus)拥有赋予金属物品生命的能力 1.1.2. 从16世纪的布拉格开始,传说中伟大的拉比在那里用黏土制作了一个傀儡魔像&#xf…

使用patch-package自动修改node_modules中的内容/打补丁

背景 在使用VuePress搭建个人博客的过程中,我需要使用到一个用来复制代码块的插件uepress-plugin-nuggets-style-copy。 问题:插件可以正常安装,但是启动会报错。通过查看错误信息,定位是插件中的copy.vue文件出现错误&#xff0c…

【实战场景】记一次UAT jvm故障排查经历

【实战场景】记一次UAT jvm故障排查经历 开篇词:干货篇:1.查看系统资源使用情况2.将十进制进程号转成十六进制3.使用jstack工具监视进程的垃圾回收情况4.输出指定线程的堆内存信息5.观察日志6.本地环境复现 总结篇:我是杰叔叔,一名…

仿论坛项目--初识Spring Boot

1. 技术准备 技术架构 • Spring Boot • Spring、Spring MVC、MyBatis • Redis、Kafka、Elasticsearch • Spring Security、Spring Actuator 开发环境 • 构建工具:Apache Maven • 集成开发工具:IntelliJ IDEA • 数据库:MySQL、Redi…

Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里

目录 一、开通阿里云容器镜像服务 二、Git配置 三、去DockerHub找镜像 四、编写images.txt文件 ​五、演示 六、其他注意事项 最近一段时间 Docker 镜像一直是 Pull 不下来的状态,想直连 DockerHub 是几乎不可能的。更糟糕的是,很多原本可靠的国内…

Vue+ElementUi实现录音播放上传及处理getUserMedia报错问题

1.Vue安装插件 npm install --registryhttps://registry.npmmirror.com 2.Vue页面使用 <template><div class"app-container"><!-- header --><el-header class"procedureHeader" style"height: 20px;"><el-divid…

密码学及其应用 —— 密码学的经典问题

1. 古典密码学问题 1.1 问题1&#xff1a;破解凯撒密码 1.1.1 问题 凯撒密码是最简单的单字母替换加密方案。这是一种通过将字母表中的字母固定向右移动几位来实现的加密方法。解密下面的文本&#xff0c;该文本通过对一个去除了空格的法语文本应用凯撒密码获得&#xff1a; …

layui-按钮

1.用法 使用 用button标签 type"button" class"layui-button" 效果&#xff1a; 2.主题设置 前面都要加上layui-bin 3.尺寸设置 可以叠加使用&#xff01; 4.圆角设置 加一个layui-bin-radius 5.按钮图标设置 里面加一个i标签 加class"layui-…

借教室(题解)

P1083 [NOIP2012 提高组] 借教室 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a;二分前缀和 我们将和质检员那题差不多&#xff0c;只需要将候选人二分即可 #include<bits/stdc.h> using namespace std; #define int long long int n,m; int r[100000…

【操作与配置】VSCode配置Python

Python环境配置 可以参见&#xff1a;【操作与配置】Python&#xff1a;CondaPycharm_pycharmconda-CSDN博客 官网下载Python&#xff1a;http://www.python.org/download/官网下载Conda&#xff1a;Miniconda — Anaconda documentation VSCode插件安装 插件安装后需重启V…

disql使用

进入bin目录&#xff1a;cd /opt/dmdbms/bin 启动disql&#xff1a;./disql&#xff0c;然后输入用户名、密码 sh文件直接使用disql&#xff1a; 临时添加路径到PATH环境变量&#xff1a;在当前会话中临时使用disql命令而无需每次都写完整路径&#xff0c;可以在执行脚本之前…

Eclipse + GDB + J-Link 的单片机程序调试实践

Eclipse GDB J-Link 的调试实践 本文介绍如何创建Eclipse的调试配置&#xff0c;如何控制调试过程&#xff0c;如何查看修改各种变量。 对 Eclipse 的要求 所用 Eclipse 应当安装了 Eclipse Embedded CDT 插件。从 https://www.eclipse.org/downloads/packages/ 下载 Ecli…

20240628模拟赛总结

cf好了 让我们开始 T1 Two Regular Polygons 判断能不能构造出题中要求的正多边形 关键是n%m0 Two Regular Polygons #include<bits/stdc.h> using namespace std; int t; int n,m; int main() {cin>>t;for(int i1;i<t;i){cin>>n>>m;if(n%m0)co…

MySQL 代理层:ProxySQL

文章目录 说明安装部署1.1 yum 安装1.2 启停管理1.3 查询版本1.4 Admin 管理接口 入门体验功能介绍3.1 多层次配置系统 读写分离将实例接入到代理服务定义主机组之间的复制关系配置路由规则事务读的配置延迟阈值和请求转发 ProxySQL 核心表mysql_usersmysql_serversmysql_repli…

【C++】相机标定源码笔记- 标定工具库测试

标定工具库测试 一、计算相机内参&#xff1a;对两个相机进行内参标定&#xff0c;并将标定结果保存到指定的文件中 采集图像&#xff1a;相机1-16张 相机2-17张 定义保存相机1/2内参的文件(.yml)路径。 定义相机1/2采集的图片文件夹路径。定义相机1/2存储文件名的向量获取文件…

作为图形渲染API,OpenGL和Direct3D的全方位对比。

当你在网页看到很多美轮美奂的图形效果&#xff0c;3D交互效果&#xff0c;你知道是如何实现的吗&#xff1f;当然是借助图形渲染API了&#xff0c;说起这个不就不得说两大阵营&#xff0c;OpenGL和Direct3D&#xff0c;贝格前端工场在本文对二者做个详细对比。 一、什么是图形…

26.5 Django模板层

1. 模版介绍 在Django中, 模板(Templates)主要用于动态地生成HTML页面. 当需要基于某些数据(如用户信息, 数据库查询结果等)来动态地渲染HTML页面时, 就会使用到模板.以下是模板在Django中使用的几个关键场景: * 1. 动态内容生成: 当需要根据数据库中的数据或其他动态数据来生…

推动能源绿色低碳发展,风机巡检进入国产超高清+AI时代

全球绿色低碳能源数字转型发展正在进入一个重要窗口期。风电作为一种清洁能源&#xff0c;在碳中和过程中扮演重要角色&#xff0c;但风电场运维却是一件十足的“苦差事”。 传统的风机叶片人工巡检方式主要依靠巡检人员利用高倍望远镜检查、高空绕行下降目测检查(蜘蛛人)、叶…

校园水质信息化监管系统——水质监管物联网系统

随着物联网技术的发展越来越成熟&#xff0c;它不断地与人们的日常生活和工作深入融合&#xff0c;推动着社会的进步。其中物联网系统集成在高校实践课程中可以应用到许多项目&#xff0c;如环境气象检测、花卉种植信息化监管、水质信息化监管、校园设施物联网信息化改造、停车…

Qt6 qcustomplot在图表上画一条直线

完整代码如下: 主要注意的是Qt中的QHBoxLayout等Qt类对象在被引用的情况下是可以使用局部变量的,典型的如setLayout这类型的函数接口,都可以使用局部变量,而不是new对象。 另外一点就是qcustomplot中的replot就相当于Qt中的update,由于qcustomplot是属于绘图类的接口库,…