云计算百科
云计算领域专业知识百科平台

后端学习日记1.27

文章目录

  • 前言
  • 一、缓存添加
  • 二、缓存更新策略
    • 1.内存淘汰
    • 2.超时剔除
    • 3.主动更新
    • 4.小结
  • 三、缓存穿透
    • 1.空值缓存
    • 2.布隆过滤
    • 3.小结
  • 四、总结

前言

redis学的有点快了。今天从原理角度来复习一下缓存穿透的来龙去脉。由于学的是redis数据库,所以很多原理都是基于redis的机制和操作。


一、缓存添加

由于每次网络向后端发出请求,后端去数据库查询,返回给前端。这个过程中,由于数据库性能问题,导致请求大量增加的同时,会出现用户功能体验延迟的情况。所以为了避免这个情况,考虑到缓存的高性能,后端接收请求后首先访问缓存,命中则直接返回查询内容;反之则去数据库查询数据,并将查询到的数据存放进缓存中,提高下次操作性能。下面是缓存添加的示意图。 在这里插入图片描述

二、缓存更新策略

数据一致性要求缓存和数据库中的数据要保持一致。所以数据库每次增删改操作都需要对缓存进行更新,避免数据不一致的情况。这里从数据一致性结果的高低介绍三种方法。

1.内存淘汰

内存淘汰是基于redis自身机制,从而实现无需手动维护的更新方式。

Redis 内存淘汰机制是当内存使用达到配置的maxmemory阈值时,自动筛选并删除部分键值对以释放内存的核心策略,用于防止内存溢出,保证服务稳定运行。并且淘汰过程中保证高性能且不阻塞正常请求。但前提需要去conf文件中配置maxmemory的值。这里简要介绍一下redis怎么执行内存淘汰。

  • 客户端发起写操作(set/hset 等),Redis 检测到当前内存已达到maxmemory;
  • Redis 根据配置的maxmemory-policy,随机采样指定数量的键(maxmemory-samples);
  • 从采样结果中筛选出符合淘汰条件的键(如 LRU 选最久未访问、LFU 选频率最低);
  • 删除筛选出的键,释放内存,完成当前写操作;
  • 若一次淘汰后内存仍未低于阈值,重复步骤 2-4,直至内存达标。
  • 从这个过程中,可以了解到内存淘汰机制的随机性,使得最后的数据一致性也会较低。该方法维护成本也低。


    2.超时剔除

    超时剔除方法基于redis中TTL字段值实现的一种方法。数据存放进缓存时给它添加一个字段TTL,表示过期时间。当过期时间到了,自动删除该数据。就相当于自动重置到未添加缓存的状态。该方法需要手动添加字段,并且由于额外存放一个字段,内存消耗增大。相比于内存淘汰而言,维护成本变高,但是由于指向性,数据一致性也变高。


    3.主动更新

    主动更新理解起来很容易,手动编写业务逻辑,在增删改数据库时同时更新缓存。这个方法关键在于对于不同业务的理解。这里就不再赘述,只能以后到项目中慢慢领会。


    4.小结

    在这里插入图片描述

    三、缓存穿透

    缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。大量发出这种恶意请求会给数据库带来巨大压力,甚至打垮数据库。这里提供两种常见的解决思路:空值缓存和布隆过滤。

    1.空值缓存

    这种是直接从定义本身出发。既然都不存在该数据,那我就给你返回一个空数据,并且给空值设置一个过期时间,让它自动剔除。

    Object cacheValue = redisTemplate.opsForValue().get(cacheKey);
    if (cacheValue != null) {
    if (NULL_VALUE.equals(cacheValue)) {
    return null;
    }
    }

    2.布隆过滤

    布隆过滤器是一种空间效率极高的概率型数据结构,能快速判断一个元素 “一定不存在” 或 “可能存在”。我们可以先把数据库中所有有效的 key 提前加载到布隆过滤器中,当请求过来时,先通过布隆过滤器判断 key 是否存在:

  • 如果布隆过滤器判定 key 不存在 → 直接返回,不查缓存和数据库;
  • 如果布隆过滤器判定 key 可能存在 → 再走 “缓存→数据库” 的流程。
  • 3.小结

    在这里插入图片描述

    四、总结

    从为什么使用缓存,到如何更新缓存,全都是为缓存穿透的出现作铺垫。因为要使用缓存,所以需要解决出现的一系列问题。后续再复习缓存雪崩和缓存击穿

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 后端学习日记1.27
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!