[Redis] 使用布隆过滤器和分布式锁实现用户注册

布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否可能存在于一个集合中。它通过使用多个哈希函数和一个位数组来表示一个集合,当一个元素被加入到集合时,通过哈希函数计算出多个哈希值,并将对应的位数组位置置为1。当需要检查一个元素是否存在于集合时,同样通过哈希函数计算出多个哈希值,如果所有对应的位数组位置都为1,则认为元素可能存在于集合中,如果有任何一个位置为0,则可以确定元素肯定不存在于集合中。

1. 定义布隆过滤器

布隆过滤器具有高效的插入和查询性能,且占用内存较小,但是存在一定的误判率,即可能会将不存在于集合中的元素误判为存在于集合中。

所以我们需要配置布隆过滤器的存储元素数量和误判率

2.构造器注入布隆过滤器

在业务层里面注入布隆过滤器对象

3.判断用户名是否存在

当我们注册用户名时,可能之前被别人注册过了,这时我们需要先判断一下,在布隆过滤器中,是否已存在相同的用户名

调用布隆过滤器中的 contains() 方法判断

4.注册用户

在业务层中,定义一个注册方法,把前端请求的注册请求体传进去

第一步,就是获取到请求体中的 username 字段,然后调用判断用户名是否存在的方法,如果存在,就抛出异常

第二步,如果用户名不存在,也就是之前没有被注册过,那用户就可以继续注册了

然后就可以把请求体插入到数据库中

如果数据库中插入失败,就抛出异常

如果插入成功,就需要把注册的用户名给添加到布隆过滤器中,这样我们之后再判断数据库中是否存在已注册的用户名时,就不用访问数据库了,而是先在布隆过滤器中查找,这样减轻了对数据库的压力

5.分布式锁

如果用户名没注册,那么在布隆过滤器中就不存在该用户名,也就意味着可以触发注册流程插入数据库。但是如果产生恶意请求,在短时间内海量用户请求注册同一个用户名,这些请求都会落到数据库,造成数据库访问压力。这里通过分布式锁,锁定用户名进行串行执行,防止恶意请求利用未注册用户名将请求打到数据库。

5.1注入redissonClient

RedissonClient是一个Java的Redis客户端,它提供了许多方便的功能和工具来与Redis数据库进行交互。通过RedissonClient,开发人员可以方便地操作Redis数据库,进行数据的存储、查询、更新和删除等操作。RedissonClient支持多种数据结构和功能,如分布式锁、分布式集合、分布式队列等

5.2获取锁

定义一个常量名作为锁名

然后将常量名和注册的用户名绑定,从而获取到分布式锁

所以当海量用户注册同一个用户名时,只有一个用户可以获取到分布式锁,则把该用户注册的信息插入到数据库中,插入成功后,再把用户名添加到布隆过滤器里面。而其他没有获取到锁的用户,则抛出异常

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

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

相关文章

windows10鼠标右键添加idea打开文件

在Windows系统中,你可以通过修改注册表来为鼠标右键菜单添加新的打开方式,比如IDEA。以下是具体的操作步骤: 打开注册表编辑器:按下WinR键,输入regedit并回车,即可打开注册表编辑器。定位到指定路径&#…

怎么清理服务器的C盘?

有时候我们经常会遇到C盘被占满的情况,C盘被占满的原因有很多,下面我们就来分析下有可能导致C盘占满的原因: 第一种情况:中毒 打开服务器任务管理器选择进程,并且勾选显示所有用户的进程,我们可以点击映像…

docker安装部署FastGPT

一:FastGPT介绍 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景! 官网地址:https://fastgpt.in/zh …

【力扣】143. 重排链表

143. 重排链表 题目描述 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …不能只是单纯的改变节点内部的值,而是需要…

python列表相关命令

在我们的一生中,没有人会为你等待,没有机遇会为你停留,成功也需要速度。 Python中的列表(List)是一种非常灵活且常用的数据结构,它可以容纳任意数量的元素,并且支持混合类型。下面让我来介绍一下…

Fastgpt知识库接入oneapi和自定义大模型

本期教程教大家训练自己的知识库回答chatgpt回答不了的问题 FastGPT 是一个知识库问答系统,可以通过调用大模型和知识库回答特定的问题 可以做成专属 AI 客服集成到现有的APP或者网站内当作智能客服支持网络爬虫学习互联网上的很多知识可以通过flow可视化进行工作流程编排 本期…

【spark】win10 pyspark3.5.1 安装超级简单

下载地址:https://spark.apache.org/downloads.html 下载完成: 复制文件到自己的路径下,路径最好不要有中文、空格; 解压tgz文件: 修改环境变量: 创建SPARK_HOME: D:\software_download\spar…

Facebook之道:探索社交媒体领域的未来

随着科技的不断发展,社交媒体已经成为我们日常生活中不可或缺的一部分。而在这个领域中,Facebook一直是引领者和领头羊。然而,随着时间的推移,社交媒体领域正在发生着翻天覆地的变化,而Facebook又将何去何从&#xff1…

【Python】在Windows Server上部署Flask后端服务器

想要在Windows Server上部署flask应用,当然不能只下一个anaconda配完环境之后直接启动py文件,这样的话后台会有一段警告: * Serving Flask app app* Debug mode: off WARNING: This is a development server. Do not use it in a production …

攻略:ChatGPT3.5~4.0(中文版)国内无限制免费版(附网址)【2024年5月最新更新】

一、什么是ChatGPT? 1、ChatGPT的全名是Chat Generative Pre-trained Transformer,其中"chat"表示聊天。"GPT"则是由三部分组成:生成式(generative)意味着具有创造力;预训练&#xff0…

跟我学做零售数据分析报表-商品滞销分析

商品滞销的情况很常见,因此商品滞销分析也是基本属于零售数据分析标配内容之一。那么,商品滞销分析报表该怎么做?要做计算哪些指标,怎么分析滞销趋势?别急,奥威BI零售数据分析方案预设了一张BI商品滞销分析…

FreeRTOS(随便写写,项目用到)

FreeRTOS是什么(并发) RTOS(Real Time Operating System,中文就是实时操作系统) FreeRTOS是一个迷你的实时操作系统内核。 作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号…

CI/CD与容器编排的结合

确实,对于需要多个步骤或阶段的工作流,Kubernetes原生并没有内建的工作流引擎,但可以通过以下几种方式来实现复杂的工作流程: Kubernetes Jobs:对于需要运行到完成的一次性任务,可以使用Kubernetes的Job资源…

HTTPS反向代理的功能和應用全解

HTTPS反向代理是一種特殊類型的伺服器,是在反向代理的基礎上增加了HTTPS的支持,位於客戶端和Web伺服器之間,充當兩者之間的仲介。在這種配置中,所有客戶端請求首先到達反向代理伺服器,然後由該伺服器將請求轉發到適當的Web伺服器。…

citylava:城市场景中VLMs的有效微调

citylava:城市场景中VLMs的有效微调 摘要IntroductionRelated WorkVision-Language ModelsVLMs in Driving Methodology CityLLaVA: Efficient Fine-Tuning for VLMs in City Scenario 摘要 在城市广阔且动态的场景中,交通安全描述与分析在从保险检查到事故预防的各…

蓝牙 | 软件:Git管理高通的ChipCode项目

哈喽大家好,最近发现大家在高通chipcode网站上下载不了代码,小编一直使用git的方式获取新版本代码,没有遇到什么阻碍。于是小编到新主机上尝试下载代码的压缩包和git代码,都遇到了问题。由于压缩包是高通自己处理卡住了&#xff0…

您可以使用WordPress创建的19种网站类型

当人们决定为什么他们应该使用WordPress时,我们经常会被问到“WordPress可以做[空白]吗?答案大多是肯定的。在本文中,我们将向您展示您可以使用WordPress创建的19种不同类型的网站,而无需学习任何编程技巧。 目录 隐藏 1 开始使用…

JavaScript字符串的常用方法

这篇汇总一下,JavaScript中关于字符串常用几个方法:增、删、改和查。 增 字符串的增加操作,实际上就是拼接,也不是直接添加功能,而是创建字符串的一个副本,然后再进行操作。 常见的拼接方法就是&#xf…

CSS---Emmet(二)

一、Emmet语法 Emmet语法是一种用于快速编写HTML和CSS的缩写技术。它允许开发者通过简洁的表达式快速生成复杂的代码结构,极大地提高了编码效率。使用Emmet,你只需要写出一些简短的缩写符号和操作符,然后通过快捷键(通常是Tab键&…

巡检机器人有哪些功能和作用?

在科技如此发达的时代,巡检机器人犹如一位不知疲倦的守护者,悄然走进了我们的生活。它们具备着令人惊叹的功能和作用,成为了保障安全、提高效率的重要力量。那么,巡检机器人功能和作用?下面我们来说说旗晟机器人的几款…