您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

你管这破玩意叫缓存穿透?还是缓存击穿?

时间:2023-05-15 15:11:24  来源:微信公众号  作者:哪吒编程

大家好,我是哪吒。

今天分享一下redis布隆过滤器的原理和应用场景,解决缓存穿透,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。

一、缓存预热

Redis缓存预热是指在服务器启动或应用程序启动之前,将一些数据先存储到Redis中,以提高Redis的性能和数据一致性。这可以减少服务器在启动或应用程序启动时的数据传输量和延迟,从而提高应用程序的性能和可靠性。

1、缓存预热常见步骤

(1)数据准备

在应用程序启动或服务器启动之前,准备一些数据,这些数据可以是静态数据、缓存数据或其他需要预热的数据。

(2)数据存储

将数据存储到Redis中,可以使用Redis的列表(List)数据类型或集合(Set)数据类型。

(3)数据预热

在服务器启动或应用程序启动之前,将数据存储到Redis中。可以使用Redis的客户端工具或命令行工具来执行此操作。

(4)数据清洗

在服务器启动或应用程序启动之后,可能会对存储在Redis中的数据进行清洗和处理。例如,可以删除过期的数据、修改错误的数据等。

需要注意的是,Redis缓存预热可能会增加服务器的开销,因此应该在必要时进行。同时,为了减少预热的次数,可以考虑使用Redis的其他数据类型,如哈希表(Hash)或有序集合(Sorted Set)。此外,为了提高数据一致性和性能,可以使用Redis的持久化功能,将数据存储到Redis中,并在服务器重启后自动恢复数据。

2、代码实现

@Component
@Slf4j
public class BloomFilterInit
{
    @Resource
    private RedisTemplate redisTemplate;

    //初始化白名单数据
    @PostConstruct
    public void init() {
        //1 白名单客户加载到布隆过滤器
        String key = "customer:1";
        //2 计算hashValue,由于存在计算出来负数的可能,我们取绝对值
        int hashValue = Math.abs(key.hashCode());
        //3 通过hashValue和2的32次方后取余,获得对应的下标坑位
        long index = (long)(hashValue % Math.pow(2,32));
        log.info(key+" 对应的坑位index:{}",index);
        //4 设置redis里面的bitmap对应类型白名单:whitelistCustomer的坑位,将该值设置为1
        redisTemplate.opsForValue().setBit("whitelistCustomer",index,true);

    }
}

二、缓存雪崩

Redis缓存雪崩是指在缓存系统中,由于某些原因,缓存的数据突然大量地被删除或修改,导致缓存系统的性能下降,甚至无法正常工作。

1、什么情况会发生缓存雪崩?

(1)误删除

由于误操作或故障,缓存系统可能会误删除一些正常的数据。这种情况通常会在数据库中发生。

(2)误修改

由于误操作或故障,缓存系统可能会误修改一些正常的数据。这种情况通常会在数据库中发生。

(3)负载波动

缓存系统通常会承受一定的负载波动,例如,在高峰期间,数据量可能会大幅增加,从而导致缓存系统的性能下降。

(4)数据变化频繁

如果缓存系统中的数据变化频繁,例如,每秒钟都会有大量的数据插入或删除,那么缓存系统可能会因为响应过慢而导致雪崩。

2、Redis缓存集群实现高可用

  • 主从 + 哨兵
  • Redis集群
  • 开启Redis持久化机制aof/rdb,尽快恢复缓存集群。

3、如何避免Redis缓存雪崩?

(1)数据备份

定期备份数据,以防止误删除或误修改。

(2)数据同步

定期同步数据,以防止数据不一致。

(3)负载均衡

使用负载均衡器将请求分配到多个Redis实例上,以减轻单个实例的负载。

(4)数据优化

优化数据库结构,减少数据变化频繁的情况。

(5)监控与告警

监控Redis实例的性能指标,及时发现缓存系统的异常,并发出告警。

三、缓存穿透

Redis缓存穿透是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存穿透?

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致穿透。

2、如何避免Redis缓存穿透?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

图片

Redis缓存穿透

四、通过空对象缓存解决缓存穿透

如果发生了缓存穿透,可以针对要查询的数据,在Redis中插入一条数据,添加一个约定好的默认值,比如defaultNull。

比如你想通过某个id查询某某订单,Redis中没有,MySQL中也没有,此时,就可以在Redis中插入一条,存为defaultNull,下次再查询就有了,因为是提前约定好的,前端也明白是啥意思,一切OK,岁月静好。

这种方式只能解决key相同的情况,如果key都不同,则完蛋。

五、google布隆过滤器Guava解决缓存穿透

图片

1、引入pom

<!--guava Google 开源的 Guava 中自带的布隆过滤器-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>

2、创建布隆过滤器

BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), 100);

布隆过滤器中添加元素。
bloomFilter.mightContAIn(1)

判断布隆过滤器中是否存在。

bloomFilter.mightContain(1)

3、fpp误判率

@Service
@Slf4j
public class GuavaBloomFilterService {
    public static final int SIZE = 1000000;

    //误判率
    public static double fpp = 0.01;

    //创建guava布隆过滤器
    private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), SIZE, fpp);
    
    public void guavaBloomFilter() {
        for (int i = 1; i <= SIZE; i++) {
            bloomFilter.put(i);
        }
        ArrayList<Integer> list = new ArrayList<>(10000);

        for (int i = SIZE + 1; i <= SIZE + (10000); i++) {
            if (bloomFilter.mightContain(i)) {
                log.info("被误判了:{}", i);
                list.add(i);
            }
        }
        log.info("误判总数量:{}", list.size());
    }
}

六、Redis缓存击穿

Redis缓存击穿是指在Redis缓存系统中,由于某些原因,缓存的数据无法被正常访问或处理,导致缓存失去了它的作用。

1、什么情况会发生缓存击穿?

根本原因:热点Key失效。

(1)数据量过大

当缓存中存储的数据量过大时,缓存的数据量可能会超过Redis的数据存储限制,从而导致缓存失去了它的作用。

(2)数据更新频繁

当缓存中存储的数据更新频繁时,缓存的数据可能会出现异步的变化,导致缓存无法被正常访问。

(3)数据过期

当缓存中存储的数据过期时,缓存的数据可能会失去它的作用,因为Redis会在一定时间后自动将过期的数据删除。

(4)数据权限限制

当缓存中存储的数据受到权限限制时,只有拥有足够权限的用户才能访问和处理这些数据,从而导致缓存失去了它的作用。

(5)Redis性能瓶颈

当Redis服务器的性能达到极限时,Redis缓存可能会因为响应过慢而导致击穿。

2、如何避免Redis缓存击穿?

(1)设置合理的缓存大小

根据实际需求设置合理的缓存大小,以避免缓存穿透。

(2)优化数据结构

根据实际需求优化数据结构,以减少数据的大小和更新频率。

(3)设置合理的过期时间

设置合理的过期时间,以避免缓存失去它的作用。

(4)增加Redis的并发处理能力

通过增加Redis的并发处理能力,以提高缓存的处理能力和响应速度。

(5)优化Redis服务器的硬件和软件配置

通过优化Redis服务器的硬件和软件配置,以提高Redis的性能和处理能力。

七、Redis缓存击穿解决方案

1、互斥更新

通过双检加锁机制。

2、差异失效时间

图片

先更新从缓存B,再更新主缓存A,而且让从缓存B的缓存失效时间长于A,保证A失效时,B还在。

本文转载自微信公众号「哪吒编程



Tags:缓存穿透   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
看完Redis缓存穿透、缓存击穿、缓存雪崩来吊打面试官!
一、前言「Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。」Redis在缓存应用中还是很广泛的,项目中也经常使用。基本上面试中肯定...【详细内容】
2023-12-06  Search: 缓存穿透  点击:(156)  评论:(0)  加入收藏
你管这破玩意叫缓存穿透?还是缓存击穿?
大家好,我是哪吒。今天分享一下Redis布隆过滤器的原理和应用场景,解决缓存穿透,实现快速入门,丰富个人简历,提高面试level,给自己增加一点谈资,秒变面试小达人,BAT不是梦。一、缓存...【详细内容】
2023-05-15  Search: 缓存穿透  点击:(333)  评论:(0)  加入收藏
如何解决缓存穿透、缓存击穿、缓存雪崩?才能使数据库幸免于难
随着互联网应用的不断发展,应用程序越来越复杂,同时面对的数据量也越来越大,对于性能的要求也越来越高。缓存技术的应用已经成为了许多互联网应用的必备技术之一。SpringBoot作...【详细内容】
2023-03-16  Search: 缓存穿透  点击:(134)  评论:(0)  加入收藏
Redis 缓存穿透、击穿问题
由于缓存重建耗时较长,在这时间穿插线程2,3,4进入;那么这些线程都不能从缓存中查询到数据,同一时间去访问数据库,同时的去执行数据库操作代码,对数据库访问压力过大。场景问题及原...【详细内容】
2023-01-31  Search: 缓存穿透  点击:(256)  评论:(0)  加入收藏
缓存穿透解决方案
当查询Redis中没有的数据时,该查询会下沉到数据库层,同时数据库层也没有该数据,当这种情况大量出现或被恶意攻击时,接口的访问全部透过Redis访问数据库,而数据库中也没有这些数据...【详细内容】
2021-07-30  Search: 缓存穿透  点击:(356)  评论:(0)  加入收藏
快速了解缓存穿透与缓存雪崩
更多内容,欢迎关注微信公众号:全菜工程师小辉~缓存穿透缓存系统,一般流程都是按照key去查询缓存,如果不存在对应的value,就去后端系统(例如:持久层数据库)查找。如果key对应的value...【详细内容】
2021-04-12  Search: 缓存穿透  点击:(616)  评论:(0)  加入收藏
缓存穿透、击穿、雪崩什么的分不清楚?看了这篇文章后,我明白了
对于缓存,大家肯定都不陌生,不管是前端还是服务端开发,缓存几乎都是必不可少的优化方式之一。在实际生产环境中,缓存的使用规范也是一直备受重视的,如果使用的不好,很容易就遇到缓...【详细内容】
2020-12-14  Search: 缓存穿透  点击:(227)  评论:(0)  加入收藏
帮你解读什么是Redis缓存穿透和缓存雪崩(包含解决方案)
作为一个内存数据库,redis也总是免不了有各种各样的问题,这篇文章主要是针对其中两个问题进行讲解:缓存穿透和缓存雪崩。并给出一些解决方案。这两个问题是基本问题也是面试常...【详细内容】
2020-03-14  Search: 缓存穿透  点击:(504)  评论:(0)  加入收藏
缓存穿透了怎么办?
在现在互联网架构中,几乎每个互联网项目都会引入缓存系统,比如 Redis、Memcached。来保护下游数据库和提升系统并发量。不管使用哪种缓存系统都有可能遇到 缓存穿透 的问题。...【详细内容】
2020-03-10  Search: 缓存穿透  点击:(293)  评论:(0)  加入收藏
怎样应对缓存穿透?
1为什么需要缓存 如果没有缓存,那么所有业务请求会直接指向数据库,以MySQL为例的数据库基本都是基于磁盘的,而磁盘I/O开销大,面对大规模请求时,会降低系统性能。 对一些热点数据,...【详细内容】
2019-11-12  Search: 缓存穿透  点击:(522)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(6)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(13)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(9)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(11)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(9)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条