首页 > 其他分享 >注册用户如何防止缓存穿透?

注册用户如何防止缓存穿透?

时间:2024-06-14 09:01:09浏览次数:10  
标签:Set 用户 穿透 缓存 注册 注销 用户名

注册用户如何防止缓存穿透?

先说明用户注册为什么会发送缓存穿透:用户注册时,需要验证用户名是否已存在,先查缓存,没有再查数据库,还没有才验证通过。高并发的情况下就可能有大量用户同时注册,或有恶意请求(因为注册是不设限的),造成缓存穿透。

常见的解决方案有哪些?

所以,在用户注册场景下,需要注意防止缓存穿透,常见的处理方式有下述这些:

  1. 对不存在的 Key 进行缓存,值设为 Null,并设置短暂过期时间,如 60 秒。(用户注册时验证了用户名a和b,最后用的b,那60内a也不允许别的用户使用,造成用户体验不好,而且内存有限,高并发会让内存压力大)
  2. 使用布隆过滤器,将所有已注册的用户名存入布隆过滤器,判断时先判断该用户名是否在布隆过滤器中,不在的一定不存在,避免直接查询数据库。(布隆的特性,只能添加,无法删除,注销的用户名也不能用)
  3. 使用确定的数据结构如 Redis 的 Set 集合来存储已注册用户名,判断时检查是否在集合内。(占用内存较多且复杂度较高)
  4. 针对高并发注册场景,可以先查询缓存,如果不命中则使用分布式锁来保证只有一个线程访问数据库,避免重复查询。(用户注册高峰期,只有一个线程访问数据库,这可能会导致大量用户的注册请求缓慢或超时。)

所以,从真实业务场景来看,上面这些解决方案都存在弊端,不能适用于真实场景。

最终方案:

在布隆过滤器后加一层缓存(Set),用于缓存已经注销的用户名,当布隆过滤器查询有时,再查Set里有没有,有说明这是一个被注销的用户名,可以继续使用。(也有缺点,增加了查询性能消耗和内存消耗)

而且这种方案还有一种情况也让人头疼:

用户频繁申请账号再注销(每次用新用户名),可能导致用户注销可复用的 Username Redis Set 结构变得庞大,增加了存储查询的负担。

遇到问题解决问题:

  1. 异常行为限制:每次用户注销时,记录用户的证件号,并限制证件号仅可用于注销五次。超过这个限制的次数,将禁止该证件号再次用于注册账号。

  2. 缓存分片处理:对 Username Redis Set 结构进行分片。即使我们对异常行为进行了限制,如果有大量用户注销账户,存储这些数据在一个 Redis Set 结构中可能成为一个灾难,可能出现 Redis 大 Key 问题。因此,我将 Set 结构进行分片,根据用户名的 HashCode 进行取模操作,将数据分散存储在 1024 个 Set 结构中,从而有效地解决了这个问题。

标签:Set,用户,穿透,缓存,注册,注销,用户名
From: https://blog.csdn.net/qq_45477639/article/details/139609377

相关文章

  • 事件注册与事件代理学习
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 【云岚到家】-day03-2-门户缓存实现实战
    【云岚到家】-day03-2-门户缓存实现实战5缓存实现5.2定时任务更新缓存5.2.1分布式调度平台5.2.1.1jdk提供的Timer定时器5.2.1.2使用第三方Quartz方式5.2.1.3使用分布式调度平台XXL-JOB5.2.2XXL-JOB5.2.2.1介绍5.2.2.2部署调度中心5.2.2.3执行器5.2.2定义缓......
  • 详细描述MyBatis缓存的实现原理?
    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和映射原始类型、接口和Java的POJO(PlainOldJavaObjects,普通的Java对象)为数据库中......
  • uni-app在微信小程序端自定义组件中样式穿透失效
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app。坑位最近因UI有别的事忙,导致手上暂时没什么活了,我于是抽时间优化项目代码,第一件事就是抽取复用组件。正好项目中有多处用到uVie......
  • WordPress、Typecho 站点如何让 CloudFlare 缓存加速
    众所周知WordPress、Typecho都是著名动态博客站点(一个最简单的判断依据就是都要依赖结合数据库),这类站点在CDN缓存上都有一个致命的缓存弊端就是动静态请求的区分,理论上要让CDN绕过所有的动态请求,缓存所有的静态请求,否则就会造成前端登录和非登录状态的混乱,影响用户浏览体......
  • jmeter做一个注册的脚本
    前置处理器:在请求之前做的操作在前置处理器里后置处理器:收到响应之后的操作在后置处理器里1、抓包获取注册接口   2、复制URL、参数等信息到jmeter  3、jmeter添加监听器-察看结果树运行脚本查看结果 啥意思没明白,反正脚本没成功,如果脚本成功响应数据应该是类......
  • 禁止Windows用户使用cmd、powershell、注册表、*.bat脚本、修改网卡IP等操作
    如果你想让你的计算机或域控用户的计算机禁止使用cmd、powershell、注册表、bat脚本、修改网卡IP等操作1. 使用本地组策略(如果是本地用户)如果是非域用户,如果你在Windows10Pro或更高版本上,可以使用本地组策略(LocalGroupPolicy)来限制访问。打开“本地组策略编辑器”(gpedit.......
  • easyrecovery专业版破解无需注册绿色版免费下载 easyrecovery16数据恢复软件永久激活
    EasyRecovery(易恢复中国)是由全球著名数据厂商Ontrack®出品的一款数据文件恢复软件。支持恢复不同存储介质数据:硬盘、光盘、U盘/移动硬盘、数码相机、Raid文件恢复等,能恢复包括文档、表格、图片、音视频等各种文件。开发背景:全球领先的数据恢复解决方案提供商Ontrack近......
  • 龙哥量化:筹码穿透通达信副图,研究透这筹码指标,你就会对股票的趋势一目了然
    如果您需要代写公式,请联系我。龙哥QQ:591438821龙哥微信:Long622889筹码穿透研究透了这个筹码指标,你就会对股票的趋势一目了然,心有成竹。黄线穿透蓝绿浮筹,股票将会进入一个上涨的趋势。源码{筹码穿透}AF:=(COST(99)-COST(1));K1:STICKLINE(COST(99)-COST(95)<AF,COST(99......
  • linux清理缓存
    当cache缓存占用太大,服务起不来,需要查看清理缓存执行free-m或者free-h,查看缓存释放缓存区内存的方法(请注意,以下操作需要root权限)建议在清理缓存之前先备份重要数据,以免发生意外情况。1、清理磁盘缓存刷新文件系统缓存,将缓存中的数据写入磁盘。sync清理页缓存。这将清......