面试题:Redis(五)

news2025/1/12 20:36:21

1. 面试题

面试问

记录对集合中的数据进行统计

 

在移动应用中,需要统计每天的新增用户数和第2天的留存用户数;

在电商网站的商品评论中,需要统计评论列表中的最新评论;

在签到打卡中,需要统计一个月内连续打卡的用户数;

在网页访问记录中,需要统计独立访客(Unique Visitor,UV)量。

痛点:

  类似今日头条、抖音、淘宝这样的额用户访问级别都是亿级的,请问如何处理?

 2. 亿级系统的四种常见统计

2.1 聚合统计

多个集合的交并差集就是聚合统计

2.2 排序统计

抖音短视频下的评论如何进行正序、反序,按页面进行排序?此时排序统计(ZSet)可解决该问题

 当涉及到排行榜、最新列表等等的展示可用ZSet这种有序集合进行排序统计

2.3 二值统计

集合的取值只有0和1两种取值,可用于签到、打卡等场景

常用bitmap进行解决该问题 

2.4. 基数统计

统计一个集合中不重复的元素

常用hypelroglog 

Redis十大常见数据类型跳转链接 

3. HyperLogLog

3.1 常见名词

UV:Unique Visitor 独立访客,一般理解为用户IP,需去重考虑

PV:Page View 页面浏览量,不用去重

DAU: Daily Active User 日活跃用户量,某产品登录或使用的用户数(需去重)

MAU:Monthly Active User 月活跃用户量

3.2 需求

很多计数类场景,比如 每日注册 IP 数、每日访问 IP 数、页面实时访问数 PV、访问用户数 UV等。

因为主要的目标高效、巨量地进行计数,所以对存储的数据的内容并不太关心。

 

也就是说它只能用于统计巨量数量,不太涉及具体的统计对象的内容和精准性。

 

统计单日一个页面的访问量(PV),单次访问就算一次。

统计单日一个页面的用户访问量(UV),即按照用户为维度计算,单个用户一天内多次访问也只算一次。

多个key的合并统计,某个门户网站的所有模块的PV聚合统计就是整个网站的总PV。

 3.3 原理

问题引入 

去重复统计不止一种,还有HashSet、BitMap,但当样本数据大到一定程度(亿级数据统计),内存消耗会急剧上升,此时上面的数据类型将不再适用

 

如果数据显较大亿级统计,使用bitmaps同样会有这个问题。

 

bitmap是通过用位bit数组来表示各元素是否出现,每个元素对应一位,所需的总内存为N个bit。

基数计数则将每一个元素对应到bit数组中的其中一位,比如bit数组010010101(按照从零开始下标,有的就是1、4、6、8)。

新进入的元素只需要将已经有的bit数组和新加入的元素进行按位或计算就行。这个方式能大大减少内存占用且位操作迅速。

 

But,假设一个样本案例就是一亿个基数位值数据,一个样本就是一亿

如果要统计1亿个数据的基数位值,大约需要内存100000000/8/1024/1024约等于12M,内存减少占用的效果显著。

这样得到统计一个对象样本的基数值需要12M。

 

如果统计10000个对象样本(1w个亿级),就需要117.1875G将近120G,可见使用bitmaps还是不适用大数据量下(亿级)的基数计数场景,

 

但是bitmaps方法是精确计算的。

解决方案

通过牺牲准确率来换取空间,对于不要求绝对准确率的场景下可以使用,因为概率算法不直接存储数据本身,

通过一定的概率统计方法预估基数值,同时保证误差在一定范围内,由于又不储存数据故此可以大大节约内存。

 

HyperLogLog就是一种概率算法的实现。

HyperLogLog只是进行不重复的基数统计,既不是集合也不存储数据,只是记录数量,不记录具体内容,hyperloglog提供的是不精确的去重计算方案,牺牲精确性来换取空间,但误差仅仅是0.81%左右

为什么是只需要花费12Kb? 

 

4. GEO 

4.1 面试题

面试题说明:

移动互联网时代LBS应用越来越多,交友软件中附近的小姐姐、外卖软件中附近的美食店铺、打车软件附近的车辆等等。

那这种附近各种形形色色的XXX地址位置选择是如何实现的?

 

会有什么问题呢?

1.查询性能问题,如果并发高,数据量大这种查询是要搞垮mysql数据库的

2.一般mysql查询的是一个平面矩形访问,而叫车服务要以我为中心N公里为半径的圆形覆盖。

3.精准度的问题,我们知道地球不是平面坐标系,而是一个圆球,这种矩形计算在长距离计算时会有很大误差,mysql不合适

4.2 需求

 

GEORADIUS 以给定的经纬度为中心,返回某一半径内的所有元素 

5. BitMap

5.1 面试题

 5.2 概述

说明:用String类型作为底层数据结构实现的一种统计二值状态的数据类型

位图本质是数组,它是基于String数据类型的按位的操作。该数组由多个二进制位组成,每个二进制位都对应一个偏移量(我们可以称之为一个索引或者位格)。Bitmap支持的最大位数是2^32位,它可以极大的节约存储空间,使用512M内存就可以存储多大42.9亿的字节信息(2^32 = 4294967296)

 

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

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

相关文章

Java实现八种排序

目录 分类 直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 挖坑法 hoare法 双指针法 优化 非递归实现 归并排序 非递归实现 计数排序 分类 这里的排序可以分为两大类, 基于比较的排序非基于比较的排序 其中有七种基于比较的排序&…

.NET 一款读取Excel文件敏感数据的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

【机器学习】智能聊天机器人——基于自然语言处理的智能对话系统

1. 什么是自动化客户服务与智能聊天机器人? 自动化客户服务是一种通过技术手段自动处理客户问题的服务方式,能够在无需人工干预的情况下为客户提供即时、准确的帮助。这种服务通常依托智能系统,通过预设的响应机制或学习历史数据&#xff0c…

数电(编码器、数据分配器、数据选择器)

目录 一、编码器: 1.二进制编码器: 三、优先编码器(Priority Encoder) 1.二-十进制优先编码器 二、数据分配器和数据选择器(功能正好相反) 1.数据分配器 2.数据选择器 一、编码器: 1.二进制编码器: …

【Linux系统编程】第三十二弹---动态库实战指南:从零构建与高效集成的奥秘

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、动态库 1.1、怎么做动态库 1.2、怎么使用动态库 2、外部库使用 1、动态库 1.1、怎么做动态库 方式一 1、将.c文件编…

创客项目秀|基于XIAO ESP32C3的Night Lamp With Chinese Traditional Pane项目

Fab Academy,源自麻省理工学院的先进教育项目,致力于培养具有全球视野的创新者和制造者。通过密集学习和实践,学生们掌握了从基础到高级的制造技术,学习了如何将创意转化为现实。今天小编给大家带来的是Fab academy学员Dion Tsang…

前端全栈混合之路Deno篇:Deno2.0与Bun对比,谁更胜一筹?或者说谁更适合怎样的项目

在前端全栈开发中,工具的不断演变让开发者们始终在寻找更高效、更现代化的解决方案。继Node.js之后,Deno和Bun 成为了两个比较火热的运行时。Deno2.0的近期的发布让它在性能和兼容性方面大幅提升-尤其是兼容了npm包(但我感觉应该不是全部兼容…

如何给低代码平台取名?命名策略与技巧全解析

低代码平台正日益成为企业数字化转型的重要工具。为了确保您的平台能够脱颖而出,吸引到更多的用户和开发者,选择一个恰到好处的名字至关重要。本文将探讨如何为您的低代码平台选择一个既独特又易于记忆的好名字,并详细介绍一系列行之有效的命…

第二百七十九节 JPA教程 - JPA查询IN一对多示例

JPA教程 - JPA查询IN一对多示例 以下JPQL显示如何在一对多映射中使用IN运算符。 executeAndPrintQuery("SELECT DISTINCT p FROM Employee e, IN(e.directs) p");例子 下面的代码来自Department.java。 package cn.w3cschool.common;import java.util.ArrayList; …

中药药材推荐系统

毕业设计还在发愁选题?又想实用又怕复杂?那这篇介绍你一定感兴趣! 今天为大家推荐一个基于Django框架开发的中药药材推荐系统,简洁易用,功能丰富,非常适合毕业设计。无论你是技术经验丰富的开发人员&#…

praat语音标注

一、软件下载 praat软件下载链接 下载后双击 二、软件界面

【机器学习】朴素贝叶斯算法|商品评论情感分析案例介绍及代码实现

文章目录 朴素贝叶斯算法朴素贝叶斯算法介绍概率数学基础复习朴素贝叶斯算法-利用概率值进行分类的一种机器学习算法贝叶斯公式朴素贝叶斯算法拉普拉斯平滑系数 朴素贝叶斯API案例分析流程数据集代码实现运行结果 朴素贝叶斯算法 朴素贝叶斯算法介绍 概率数学基础复习 条件概…

扇形旋转切换效果(等级切换转盘)

实现动态扇形旋转切换效果&#xff0c;切换进度支持渐变效果 效果展示 在线示例 https://code.juejin.cn/pen/7425559403589271588 源码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"v…

华宇携司法大模型亮相2024中国移动全球合作伙伴大会

2024中国移动全球合作伙伴大会于10月11日在广州琶洲保利世贸博览馆盛大开幕。本届大会以“智焕新生 共创AI时代”为主题&#xff0c;深入探讨数据、算力与人工智能如何深度融合&#xff0c;全力推进AI规模发展、规模应用&#xff0c;加快形成AI技术能力、经济效益上的规模效应&…

【NestJS入门到精通】装饰器

目录 方法装饰器通过prototype添加属性、方法 属性装饰器拓展 方法装饰器参数装饰器 方法装饰器 ClassDecorator 定义了一个类装饰器 a&#xff0c;并将其应用于类 A。装饰器 a 会在类 A 被定义时执行。 const a:ClassDecorator (target:any)>{console.log(target,targe…

Python Django 数据库优化与性能调优

Python Django 数据库优化与性能调优 Django 是一个非常流行的 Python Web 框架&#xff0c;它的 ORM&#xff08;对象关系映射&#xff09;允许开发者以简单且直观的方式操作数据库。然而&#xff0c;随着数据量的增长&#xff0c;数据库操作的效率可能会成为瓶颈&#xff0c…

【SQL Server】数据库在新建查询后闪退——解决方案:以管理员的身份运行

我的SQLServer2022之前都是可以用的&#xff0c;隔了好久没有使用&#xff0c;今天要用到去写一些SQL 语句 结果在点击新建查询后闪退了&#xff0c; 经过查询后&#xff0c;解决方案&#xff1a; 以管理员的身份运行后点击新建查询&#xff0c;发现正常了 总结&#xff1a;以…

PyQt 入门教程(2)搭建开发环境

文章目录 一、搭建开发环境1、安装PyQt6与pyqt6-tools2、配置外部工具QtDesigner与PYUIC 一、搭建开发环境 1、安装PyQt6与pyqt6-tools PyQt6&#xff1a; PyQt的开发库。pyqt6-tools&#xff1a; QtDesigner 设计器支撑库。 通过PyCharm安装开发库&#xff0c;命令如下&…

探索全流量回溯分析系统:IT运维的必备利器

目录 一、什么是全流量回溯分析系统&#xff1f; 二、全流量回溯分析系统的核心功能 三、IT运维中的实际应用案例 四、IT运维中使用全流量回溯分析系统的技巧 结语 AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的IT运维中&#xff0c;网络故…

【Python爬虫实战】正则:多字符匹配、开头与结尾定位、分组技术详解

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配多个字符 &#xff08;一&#xff09;匹配任意多个字符 &#xff0…