Redis强化技术

1.前言

        随着企业公司、用人单位对Java工程师技能要求的不断提高和变化,Redis缓存技术的掌握变得越来越强,从各大招聘平台企业发布的招聘信息来看,要求熟练掌握Redis技术的企业占到了百分之90以上,Redis关键字也仅排在Java、Spring、Mysql之后。可见其举足轻重的地位。

2.Redis常见问题及解决方案 

        2.1缓存穿透 

        所谓缓存穿透:就是一个业务请求先查询redis,发现redis中没有这条数据。转而去查询数据库,但是数据库也没有的情况。 正常业务场景下,如果我们遇到上述问题,可以将空值保存在Redis中,之后的请求都可以直接从Redis查询到,就不需要再连接数据库了。

       但是 如果有恶意的请求,不断的高并发的访问Redis和数据库中不存在的数据,比如一些电商秒杀场景下,高并发的访问会直接导致当前服务器出现宕机的情况。

        解决方案:业界主流解决方案——布隆过滤器
        布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
        通俗讲:布隆过滤器说存在即为存在,它说不存在就不存在。还拿上面的秒杀做案例,我们可以把秒杀产品的信息保存在布隆过滤器中,只有对这些产品的请求才会被放行到Redis或者DB中,其他请求直接驳回。
        布隆过滤器优点:相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能。
        布隆过滤器缺点:误算率:随着存入的元素数量增加,误算率随之增加。常见的补救办法是建立一个小的白名单,存储那些可能被误判的元素。但是如果元素数量太少,则使用散列表足矣。另外,一般情况下不能从布隆过滤器中删除元素。我们很容易想到把位列阵变成整数数组,每插入一个元素相应的计数器加1, 这样删除元素时将计数器减掉就可以了。然而要保证安全的删除元素并非如此简单。首先我们必须保证删除的元素的确在布隆过滤器里面. 这一点单凭这个过滤器是无法保证的。另外计数器回绕也会造成问题。
        在Redis4.0后,官方提供了布隆过滤器的插件功能,布隆过滤器可以作为一个插件加载Redis服务器直接使用。

        布隆过滤器的使用步骤

1.针对现有所有数据,生成布隆过滤器,保存在Redis中

2.在业务逻辑层,判断Redis之前先检查这个id是否在布隆过滤器中

3.如果布隆过滤器判断这个id不存在,直接返回

4.如果布隆过滤器判断id存在,在进行后面业务执行

        2.2缓存击穿

        一个计划在Redis保存的数据,业务查询,查询到的数据Redis中没有,但是数据库中有此数据。这种情况要从数据库中查询后再保存到Redis,这就是缓存击穿。但是这个情况也不是异常情况,因为我们大多数据都需要设置过期时间,而过期时间到时,这个数据就会从Redis中移除,再有请求查询这个数据,就一定会从数据库中再次同步。
缓存击穿本身并不是灾难性的问题或者是不许发送的现象

 

 

         2.3缓存雪崩

         上面讲到击穿现象,同一时间发生少量击穿是正常的。但是如果出现同一时间大量击穿现象就会如下图:

        所谓缓存雪崩,指的就是Redis中保存的数据,短时间内有大量数据同时到期的情况,所有请求都击穿Redis打到我们的DB上面造成了宕机。如上图所示,本应该有Redis反馈的信息,由于雪崩都去访问了Mysql,mysql承担不了,非常可能导致服务器异常。
        要想避免这种情况,就需要避免大量缓存同时失效,大量缓存同时失效的原因:通常是同时加载的数据设置了相同的有效期导致的。我们可以通过在设置有效期时添加一个随机数,这样就能够防止大量数据同时失效了。
        除了上述情况还存在Redis服务器宕机,大量请求打到数据库的可能。我们可以通过Redis高可用,搭建Redis集群,主从架构来解决这一问题。
        关于搭建Redis集群可以看这篇文章:基于Linux系统部署Redis Cluster集群_Leon_coding的博客-CSDN博客Redis Cluster是一个提供在多个 Redis 节点间共享数据的程序集。Redis 集群的优势:1.可以是多主多从结构2. 自带主从切换,不需要哨兵服务3. 使用“哈希槽”算法Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。......https://lee-coding.blog.csdn.net/article/details/126543699


 

 

 


 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon_coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值