Redis 高级数据结构业务实践

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.mzph.cn/news/864629.shtml

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

相关文章

【Linux】systemctl系统和服务管理命令

systemctl 是 systemd 系统和服务管理器的主命令行工具,用于启动、停止、重启、启用、禁用和检查服务状态,以及管理系统状态。systemd 是现代 Linux 发行版中广泛使用的初始化系统(init system),取代了旧的 SysV 和 Upstart 系统。以下是一些常见的 systemctl 命令和用途的…

力扣 用队列实现栈(Java)

核心思想:因为队列都是一端进入另一端出(先进先出,后进后出),因此一个队列肯定是不能实现栈的功能的,这里就创建两个队列来模拟栈的先进后出,后进先出。 比如说如果是push操作我们肯定是要弹出栈…

中英双语介绍美国最早的13个殖民地( Thirteen Original Colonies)

中文版 美国最早的十三个殖民地简介 美国最早的十三个殖民地是英格兰在北美洲建立的殖民地,它们后来成为了美国最初的十三个州。这些殖民地是美国历史的重要组成部分,它们在美国革命期间起到了关键作用。以下是对这十三个殖民地的详细介绍,…

STM32自己从零开始实操08:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感:通低频阻高频的。仿真中高频信号通过电感,因为电感会阻止电流发生变化,故说阻止高频信号 电容:隔直通交。…

65、基于卷积神经网络的调制分类(matlab)

1、基于卷积神经网络的调制分类的原理及流程 基于卷积神经网络(CNN)的调制分类是一种常见的信号处理任务,用于识别或分类不同调制方式的信号。下面是基于CNN的调制分类的原理和流程: 原理: CNN是一种深度学习模型&a…

通过nginx上传大文件失败

调用nginx的接口上传文件的时候加载到最后就异常了. 发现是在nginx限制了body大小 解决方法 在这个server设置client_max_body_size大小 #设置NGINX能处理的最大请求主体大小client_max_body_size 2028M; ##

TG群发机器人:高效自动化消息分发指南

在这个信息爆炸的时代,TG作为一个流行的即时通讯平台,其机器人功能为自动化消息分发提供了强大的支持。本文将引导您从零开始搭建一个TG群发机器人,实现高效的消息管理和分发。 引言 TG群发机器人能够自动向多个用户或群组发送消息&#xf…

SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]

SpringBoot自定义starter SpringBoot与AOP SpringBoot与AOP 使用AOP实现用户接口访问日志功能 添加AOP场景启动器 <!--添加AOP场景启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</…

都2024了,现在搞本HCIE真的还来得及?

信息技术的迅猛发展&#xff0c;网络的飞速进步&#xff0c;网络工程师这一职业的需求也在不断增加。 作为华为认证体系中的顶级认证&#xff0c;HCIE一直以来都是网络工程师追求的目标之一。 都2024了&#xff0c;厂商认证都火了十几年来&#xff0c;很多人犹犹豫豫&#xff0…

Redis Stream 作为消息队列的详尽笔记

概述 Redis Stream 是 Redis 5.0 版本引入的数据结构&#xff0c;用于消息传递。 基础概念 结构&#xff1a;消息链表&#xff0c;每个消息有唯一 ID 和内容。命名&#xff1a;每个 Stream 有唯一名称&#xff0c;对应 Redis Key。消费组&#xff08;ConsumerGroup&#xff…

Mybatis1(JDBC编程和ORM模型 MyBatis简介 实现增删改查 MyBatis生命周期)

目录 一、JDBC编程和ORM模型 1. JDBC回顾 2. JDBC的弊端 3. ORM模型 Mybatis和hibernate 区别: 4. mybatis 解决了jdbc 的问题 二、MyBatis简介 1. MyBatis快速开始 1.1 导入jar包 1.2 引入 mybatis-config.xml 配置文件 1.3 引入 Mapper 映射文件 1.3 测试 …

Ubuntu Server 和 Ubuntu Desktop 组合使用

1.常见的组合使用方式 Ubuntu Server 和 Ubuntu Desktop 确实可以组合使用&#xff0c;但具体要看你的需求和使用场景。以下是一些常见的组合使用方式&#xff1a; 单一设备上安装&#xff1a;你可以在一台设备上同时安装 Ubuntu Server 和 Ubuntu Desktop。这样&#xff0c;你…

【ARM系列】1of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

OOCL东方海外不定位置旋转验证码识别代码

样例图如下 这款验证码的识别最大难度在于&#xff0c;旋转的位置不固定&#xff0c;需要识别旋转图片的位置。 第二大难点就是旋转角度的识别。所以我们采集了大量样例图片进行训练&#xff0c;如下图所示 最终训练得到的模型需要两张图片输入&#xff0c;才能完成旋转角度识…

阿里 Mobile-Agent-v2:基于大模型的安卓鸿蒙自动化工具

与之前介绍的 DigiRL类似, Mobile-Agent-v2是一个支持安卓和鸿蒙系统的自动化工具&#xff0c;它使用视觉模型理解手机屏幕&#xff0c;并利用 ADB 来实现操作手机&#xff0c;你可以在本地运行&#xff0c;或者通过手机截图在线体验 Mobile-Agent-v2 从演示来看&#xff0c;可…

短信接口平台的核心功能有哪些?如何使用?

短信接口平台怎么有效集成&#xff1f;选择短信接口平台的技巧&#xff1f; 短信接口平台作为一种重要的通信工具&#xff0c;广泛应用于各种企业和组织。通过短信接口平台&#xff0c;企业能够高效、便捷地与客户进行互动和沟通。AoKSend将详细介绍短信接口平台的核心功能。 …

C++中的C++中的虚析构函数的作用和重要性

在C中&#xff0c;虚析构函数&#xff08;virtual destructor&#xff09;的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前&#xff0c;我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承&#xff1a;允许我们定义一个基类&#xff08;也称为父类或超…

SQL使用注意事项

作为开发人员日常最为熟悉的工具sql。但是在实际使用中&#xff0c;有一些坑需要尽量避免&#xff0c;本文是对一些常用注意事项的总结 查询需要的。不要全部都查询。禁止使用存储过程&#xff0c;禁止使用外键。使用sql进行计算&#xff0c;要小心。&#xff08;数据量大的情况…

Android --- 新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死,鼠标和键盘都操作不了

新电脑安装Android Studio 使用 Android 内置模拟器电脑直接卡死&#xff0c;鼠标和键盘都操作不了 大概原因就是,初始化默认Google的安卓模拟器占用的RAM内存是2048&#xff0c;如果电脑的性能和内存一般的话就可能卡死&#xff0c;解决方案是手动修改安卓模拟器的config文件&…

Python酷库之旅-第三方库openpyxl(20)

目录 一、 openpyxl库的由来 1、背景 2、起源 3、发展 4、特点 4-1、支持.xlsx格式 4-2、读写Excel文件 4-3、操作单元格 4-4、创建和修改工作表 4-5、样式设置 4-6、图表和公式 4-7、支持数字和日期格式 二、openpyxl库的优缺点 1、优点 1-1、支持现代Excel格式…