服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - 你管这破玩意叫缓存穿透?还是缓存击穿?

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

2023-05-16 05:00未知服务器之家 Redis

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

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

大家好,我是哪吒。

今天分享一下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还在。

本文转载自微信公众号「哪吒编程」,可以通过以下二维码关注。转载本文请联系哪吒编程公众号。

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

延伸 · 阅读

精彩推荐
  • RedisRedis实战之百度首页新闻热榜的实现代码

    Redis实战之百度首页新闻热榜的实现代码

    这篇文章主要介绍了Redis实战之百度首页新闻热榜的实现代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    山前留名11912021-07-25
  • Redis关于Redis单线程的正确理解

    关于Redis单线程的正确理解

    很多同学对Redis的单线程和I/O多路复用技术并不是很了解,所以我用简单易懂的语言让大家了解下Redis单线程和I/O多路复用技术的原理,对学好和运用好Re...

    小白菜_19232021-11-24
  • RedisRedis配置文件详解

    Redis配置文件详解

    这篇文章主要介绍了Redis配置文件详解,本文详细完整的用中文解释了Redis配置文件中各种参数的作用和功能,需要的朋友可以参考下 ...

    Redis教程网5162019-10-23
  • Redisredis中队列消息实现应用解耦的方法

    redis中队列消息实现应用解耦的方法

    这篇文章主要给大家介绍了关于redis中队列消息实现应用解耦的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    macccc3382019-11-16
  • Redis使用redis分布式锁解决并发线程资源共享问题

    使用redis分布式锁解决并发线程资源共享问题

    这篇文章主要介绍了使用redis分布式锁解决并发线程资源共享问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    保军Baojun3662019-11-26
  • Redis详解Redis 缓存删除机制(源码解析)

    详解Redis 缓存删除机制(源码解析)

    这篇文章主要介绍了Redis 缓存删除机制(源码解析),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下...

    klew9002021-07-27
  • Redis详细分析Redis集群故障

    详细分析Redis集群故障

    这篇文章主要介绍了详细分析Redis集群故障的相关内容,具有一定的参考价值,这里分享给大家,供需要的朋友参考。 ...

    带鱼兄9112019-11-08
  • RedisRedis Cluster 字段模糊匹配及删除

    Redis Cluster 字段模糊匹配及删除

    在数据库内我们可以通过like关键字、%、*或者REGEX关键字进行模糊匹配。而在Redis内我们如何进行模糊匹配呢?本文就来介绍一下...

    在风中的意志10992021-08-06