封装缓存组件库避免注册用户时,用户名全局唯一带来的**缓存穿透**问题,减轻数据库访问压力;

本文探讨了在高并发会员注册场景中如何防止缓存穿透,提出使用布隆过滤器判断用户名是否存在,配合RedisSet存储已注销用户名,以及通过缓存分片减轻存储负担的策略。这种解决方案兼顾了性能和用户体验,是理想的选择。
摘要由CSDN通过智能技术生成

缓存穿透:缓存穿透是指在使用缓存系统时,恶意或频繁地请求一个不存在于缓存中的数据,导致每次请求都需要查询数据库或其他数据存储系统,从而绕过了缓存的效果,严重影响系统性能。

业务背景:在高并发的会员注册场景下,可能会出现缓存穿透问题。主要原因可能是:1.用户注册时,需要验证用户名是否已存在,这通常需要查询数据库。2.如果缓存中没有该用户名,就会去数据库查询,如果数据库中也没有,就可以判断该用户名可用。而且极端情况下,注册的流程可能时恶意请求访问。注册请求缓存穿透流程图如下:

在这里插入图片描述

解决方案:如果没有用户名注销后可重复使用的需求,布隆过滤器无疑是最好的解决方案。但是考虑到企业的需求多样化,我们在设计时需要做好全方面的准备。设计时需要考虑一个问题,布隆过滤器删除不了。如果已经加进去的用户名,无疑是无法再次复用的。为此,我们可以通过再加一层缓存来解决这个问题。

1)Redis Set 结构是什么?当用户注销后,系统会将其用户名放入缓存结构中。如果其他用户想要使用该用户名,会检查缓存是否存在该用户名。如果缓存中存在该用户名,就表示该用户名已被注销,可以被再次使用。
在这里插入图片描述

思考:为了解决这个问题,我们可以采取多种解决方案,但每种方案都存在一些弊端。

  • 对不存在的 Key 进行缓存值设为 Null:虽然可以避免重复查询数据库,但对用户体验不友好,且可能会导致数据库压力增加。
  • 布隆过滤器:虽然可以快速判断是否存在于集合中,但无法处理删除元素的情况,且存在哈希碰撞导致误判的可能性。
  • Redis Set 存储已注册用户名:占用内存较多且复杂度较高,不适合实际应用。
  • 分布式锁:虽然可以解决并发查询数据库的问题,但影响用户注册的响应时间,不友好的用户体验。

结论:最终,我们可以采用布隆过滤器结合缓存的方式来解决缓存穿透问题。通过布隆过滤器判断用户名是否可能存在,再通过缓存来确认是否真的存在,避免了对数据库的频繁查询。为了解决布隆过滤器无法删除的问题,我们再加一层缓存来存储已注销用户名,实现了用户名的可复用性。此外,为了防止缓存结构过大带来的问题,我们对缓存进行了分片处理,有效减轻了存储和查询的负担。综上所述,综合考虑业务需求和系统性能,采用布隆过滤器结合缓存的解决方案是一个比较理想的解决方案,可以有效防止缓存穿透,并提升系统的性能和用户体验。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值