Redis 高级数据结构业务实践

news2024/11/27 11:43:27

0、前言

本文所有代码可见 => 【gitee code demo】
本文会涉及 hyperloglog 、GEO、bitmap、布隆过滤器的介绍和业务实践

1、HyperLogLog

1.1、功能

基数统计(去重)

1.2、redis api

命令作用案例
PFADD key element [element ...]添加元素到keyPFADD websiteVisitors 192.168.1.1
PFADD websiteVisitors 192.168.1.2
如果HyperLogLog的内部估计值发生变化,返回1;否则返回0。
PFCOUNT key [key ...]统计key中的元素数量估算值PFCOUNT websiteVisitors
返回key中的元素数量估算值
PFMERGE newkey key1 key2 [keyn ...]合并key到新keyPFMERGE totalVisitors morningVisitors eveningVisitors
把两个不同时段的访客IP统计合并为一个总的统计,无返回值

1.3、与其他去重数据结构的对比

1.3.1、数据量小 hashset

可以精确地计数,存储数量的同时存储了数据本身,数据量大时会消耗大量内存

1.3.2、数据量中 bitmap

精确计数,相比于 hashset空间占用少,数据量大的情况下空间效率和速度不如 hyperloglog

1.3.3、数据量大 hyperloglog

速度快,占用内存小,但有标准偏差(redis默认 0.81)

1.4、实践:统计用户访问量(IP)

1.4.1、模拟用户访问

在这里插入图片描述

1.4.2、获取实时用户访问量

在这里插入图片描述

2、GEO

2.1、功能

快速存储、处理和查询地理空间数据

在Redis Geo中,每个地理位置都会被编码成一个Geohash值,并以此作为sorted set中的分值

2.2、redis api

命令作用案例
GEOADD key longitude latitude member [longitude latitude member ...]将给定的地理空间位置(经度、纬度和名称)添加到指定的key中GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"
GEODIST key member1 member2 [unit]计算两个地点之间的距离,默认单位为米GEODIST city 天安门 长城 km
GEOPOS key member [member ...]返回经纬度GEOPOS city 天安门 故宫
GEOHASH key member [member ...]返回geohashGEOHASH city 天安门 故宫 长城
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC/DESC] [STORE key] [STOREDIST key]查找给定范围内的地点
WITHDIST:
将位置元素与中心之间的距离也一并返回WITHCOORD:
将位置元素的经度和维度也一并返回
COUNT 限定返回的记录数
GEORADIUS city 116.418017 39.914402 10 km withdist withcoord count 10 desc
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASCDESC] [STORE key] [STOREDIST key]同上GEORADIUS city 天安门 10 km withdist withcoord count 10 desc

2.3、实践:附近酒店推送

通过 java api 操作 Redis GEO

代码 demo

3、bitmap

3.1、功能

由0和1状态表现的二进制bit数组,用于状态统计,如 打卡、签到

3.2、redis api

命令作用案例
SETBIT key offset value设置Bitmap中指定位置的位值SETBIT mybitmap 5 1
GETBIT key offset获取Bitmap中指定位置的位值GETBIT mybitmap 5
BITCOUNT key [start end]计算Bitmap中设置为1的位的数量BITCOUNT mybitmap
BITPOS key bit [start] [end]找到Bitmap中第一个设置为0或1的位的位置BITPOS mybitmap 1
BITOP operation destkey key [key ...]对一个或多个Bitmap进行AND、OR、XOR和NOT操作BITOP AND destkey bitmap1 bitmap2

3.3、案例:签到功能

4、布隆过滤器 :bloom filter

4.1、原理

一个大型位数组和几个不同的均匀分布hash函数。用来判断某个数据是否存在

在这里插入图片描述

4.2、布隆过滤器误判率&为什么不建议删除key

因为布隆过滤器的每一个 bit 并不是独占的,很有可能多个元素共享了某一位

查询时,key-1的bit位可能被别的key置为1了

删除时,将key对应bit位置为0,可能导致其他映射到该位置的key也被删除

总结:布隆过滤器可以添加元素,但是不能删除元素。因为删掉元素会导致误判率增加

4.3、案例:手写布隆过滤器防止缓存穿透

过滤器只过滤读操作

过滤器业务流程

在这里插入图片描述

过滤器业务代码

拦截了不存在的用户请求,防止了用户查询相关的缓存穿透

在这里插入图片描述

布隆过滤器实现

在这里插入图片描述

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

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

相关文章

力压GPT-4o!新王Claude 3.5 Sonnet来了,直接免费可用

如今,大模型领域更卷了! 前脚 OpenAI 发布 GPT4o,硬控全场,后脚就被最大的竞争对手 Anthropic 超越了。 刚刚,Anthropic 发布了全新大模型 Claude 3.5 Sonnet,号称是迄今为止最智能的模型。 据介绍&#x…

解决json日期格式问题

解决json日期格式问题 1.json默认输出时间格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//创建时间一个对象,java.util.DateDate date new Date();//将我们的对象解…

鸿蒙UI开发快速入门 —— part12: 渲染控制

如果你对鸿蒙开发感兴趣,加入Harmony自习室吧~👇🏻👇🏻👇🏻👇🏻 扫描下面的二维码关注公众号。 1、前言 在声明式描述语句中开发者除了使用系统组件外,还可…

1panel 搭建多个网站

1panel 部署多个网站,另外的域名,或无域端口搭建方法。 当我们已经部署好一个网站后,想再部署一个网站在我们的服务器上时, 步骤:(另外的域名,部署在同一个服务器方法) 运行环境里…

virtualbox安装win10

等到安装完成 设备下选择安装增强功能

构造函数的小白理解

一、实例 using System; using System.Collections; using System.Collections.Generic; using UnityEngine;//定义一个名为Question的类,用于存储问题及相关信息 [Serializable] public class Question {public string questionText;//存储题目文本字段public str…

中小企业数字化转型如何选择适合自己的MES系统?

随着信息技术的飞速发展,数字化转型已成为中小企业提升竞争力、实现可持续发展的关键途径。在数字化转型过程中,制造执行系统(MES)作为连接企业资源计划(ERP)与车间现场管理的桥梁,扮演着至关重…

Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxxxxx先往容器注入环境变量,然后进一步通过envsubst指令将环境变量写入到conf文件中,实现动态配置文件内容。 背景 前后端分离的架构下,经常会用到nginx反向代理来…

并发编程基础概念

相关概念 并行 并行是指同一个时刻,多个任务同时进行。只有在多核CPU下才会发生。 并发 并发是指单个CPU在不同任务之间来换切换工作,但是同一时刻只有一个任务在工作。由于CPU的切换速度很快,给人的感受是多个任务在一起运行。 串行 串行…

程序员敲代码的习惯你占几样撒?

IT行业的科技公司们一直苦苦追寻传说中以一当十的超级程序员,最新的研究表明确实存在这样一小撮效率奇高的“程序金刚”,但是一位普通程序猿如何能够蜕变成代码金刚呢? 国内外的各大专家总结了导致程序猿效率低下,代码为什么像坨s…

制造业包括哪些?需要堡垒机吗?

制造业-国民经济的主体,是立国之本、兴国之器、强国之基,一个关系着大家吃穿住行的行业,一个与大家息息相关的行业。但大家对于制造业还有很多不了解,有小伙伴在问,制造业包括哪些?需要堡垒机吗&#xff1f…

在创意设计领域“刷屏”的人工智能生成内容(AIGC)是什么?

在创意设计领域“刷屏”的人工智能生成内容(AIGC)是什么?这是一个值得深入探讨的话题,它关乎技术的革新、创意的边界以及未来设计行业的走向。随着人工智能技术的飞速发展,AIGC(Artificial Intelligence Ge…

小米大模型提效新框架:训练最高提速34%,推理最高提速52%!Kaldi之父合作出品

大模型推理速度提升50%以上,还能保证少样本学习性能! 小米大模型团队提出SUBLLM(Subsampling-Upsampling-Bypass Large Language Model),国际AI语音大牛、开源语音识别工具Kaldi之父Daniel Povey也参与指导。 与Llam…

【学习笔记】爱立信SPO 1400 CRAFT软件基础知识4——图形用户界面之通知列表和状态栏

一、前期准备 提示:下面所有学习内容都是基于以下条件完成的 条件1.已经正确安装并正常运行SPO 1400 CRAFT软件(以下简称LCT) 条件2.确认已正确使用爱立信SPO 1400 CRAFT软件通过网络登录设备(以下简称NE) 具体登录…

大数据学习之分布式数据采集系统Flume学习

分布式数据采集系统Flume学习 一、Flume架构 1.1 Hadoop业务开发流程 1.2 Flume概述 flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。 支持在日志系统中定制各类数据发送方,用于收集数据; 同时,Flume提供对数据进行简单处理&…

怎么在线电脑上做图片二维码?在线3步图片转活码的制作方法

图片怎么才能做成二维码展示呢?图片生成二维码的方式能够在手机上查看图片,有利于图片的快速分享,通过这种方法能够减少对内存的占用,也提高了用户获取图片的便利性。通过生成图片活码能够不断提供最新的图片给用户展示&#xff0…

某山词霸翻译js逆向分析

一、基础知识 1、post的几种发包的方式 2、query string和form data的区别 Query String Parameters: GET请求时,参数会以url string 的形式进行传递,即?后的字符串则为其请求参数,并以&作为分隔符。(有时候pos…

RocketMQ快速入门:linux安装rocketmq并配置开机自启(十一)

目录 0. 引言1. 下载安装包1.1 高版本直接下载安装包1.2 下载源码包进行编译 2. namesrv和broker安装2.1 安装2.2 放开服务器端口2.3 测试 3. 配置开机自启3.1 配置namesrv开机自启3.2 配置broker开机自启 0. 引言 之前我们针对本机电脑安装rocketmq进行了讲解,同时…

营销翻车,杜国楹出面道歉,小罐茶的“大师作”故事仓皇结尾

“小罐茶,大师作”,这句slogan曾一度在央视平台长时间、高密度播放,成为家喻户晓的广告词,也打响了小罐茶品牌的名号。但同时,市场上关于“大师作”真实性的质疑也从未停息。 就在6月25日小罐茶十二周年发布会上&#…

页分裂和页合并——Java全栈知识(33)

上篇文章我们讲到了 MySQL 的数据页,我们说到了 InnoDB 的索引是以 B树的形式构建的,而且 B树的节点都是一个数据页。 但是 B树在使用过程中难免会有节点分裂和节点合并的过程。 因为我们是以数据页为基本单位构造的 B树,那么 B树的节点分裂和…