21.缓存穿透

news2024/11/15 19:31:47

缓存穿透

客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会到达数据库。会造成数据库宕机。

解决方案

1.缓存空对象

例如查询数据的id,发现数据库中没有,那么就在redis中缓存空对象。但是会有额外的内存消耗, 如果有很多数据都查不到,就会在redis中缓存很多null对象,垃圾数据。如果一开始数据在db中不存在,在redis中缓存了空对象。后来该数据有了,由于redis已经缓存了null对象,造成数据短期的不一致

数据不一致可以采用两种办法,第一,给redis中缓存的key设置ttl过期时间,过一段时间数据将会一致。第二,当数据产生了插入db的后,也更新下缓存,将原来的缓存的null对象给覆盖掉。

2.布隆过滤

布隆过滤是一种算法,在客户端与redis之间有一个拦截布隆过滤器。

优点:内存占用少,没有多余的key。缺点:实现复杂,存在误判可能。

 缓存空对象的代码实现

@Override
    public Result queryById(Long id) {
        String key = RedisConstants.CACHE_SHOP_KEY + id;
        //从redis中查询商铺缓存
        String shopJsonStr = stringRedisTemplate.opsForValue().get(key);
        //redis中有数据直接返回
        if(StrUtil.isNotBlank(shopJsonStr)) {
            Shop shop = JSONUtil.toBean(shopJsonStr, Shop.class);
            return Result.ok(shop);
        }
        //判断命中的是否为空值
        if(shopJsonStr != null) {
            //说明命中空字符串,不会去查数据库
            return Result.fail("店铺不存在");
        }

        //redis中没有数据,继续查询数据库
        Shop shop = getById(id);
        if(ObjectUtil.isNull(shop)) {
            //将空值写入redis
            stringRedisTemplate.opsForValue().set(key, "", RedisConstants.CACHE_NULL_TTL, TimeUnit.MINUTES);
            //数据库没有查询到数据,返回错误
            return Result.fail("店铺不存在");
        }
        //数据库中查询到数据,存入redis,再返回数据;设置超时时间
        stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop), RedisConstants.CACHE_SHOP_TTL, TimeUnit.MINUTES);
        return Result.ok(shop);
    }
public static final Long CACHE_NULL_TTL = 2L;

主动的方式解决缓存穿透

1.增强id的复杂度,避免被猜测id的规律。

2.做好数据的基础格式校验。

3.加强用户权限校验,只有登录的用户有权限的用户才能访问。

4.做好热点参数的限流。

遗留问题:布隆过滤器的代码实现? 可以基于redisson实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot项目读取 resources 目录下的文件的9种方式

1. 使用 ClassLoader.getResourceAsStream() 方法 InputStream inputStream getClass().getClassLoader().getResourceAsStream("file.txt"); 2. 使用 Class.getResourceAsStream() 方法 InputStream inputStream getClass().getResourceAsStream("/file.txt&…

安达发|如何实现陶瓷产业智能化生产计划排单?

随着工业4.0的兴起,智能化生产已成为制造业转型升级的关键。陶瓷产业作为一个历史悠久且技术成熟的行业,面临着生产效率提升和成本控制的双重挑战。智能化生产计划排单作为提高生产效率、降低资源浪费的重要手段,对于陶瓷产业的现代化转型至关…

ElasticSearch 8.15.0 与 Kibana 8.15.0 尝鲜体验

还不算晚,虽然已经距离发布过去了快半个月~ 跟着下面的步骤进行一步一步操作(CV),只需要改动一下用户名、密码这些数据即可从零开始用 Docker安装 ES 与 Kibana 最新版,据说 Kibana 还有 AI 助手嘞(虽然是 8.12 推出的)~ 最后强调一点&#…

redis | 认识非关系型数据库Redis的列表类型及python如何操作redis

Redis 非关 kv型 数据类型列表常用命令应用场景练习 pyredis 操作redisubuntuwindows 连接redis生产者消费者模型 数据类型 数据类型丰富,字符串strings,散列hashes,列表lists,集合sets,有序集合sorted sets等等 列表 单进程 单线程 尽可能规避掉阻塞的操…

openIM prometheus容器一直重启问题处理

官方文档参考:https://docs.openim.io/zh-Hans/guides/gettingStarted/admin 具体操作: 1、打开 openim-server/config/prometheus.yml 文件,internal_ip改为127.0.0.1(内网ip,我的是在本地), 2、第二点说 在 open-i…

我的CSDN-----第128天创作纪念日

机缘 起初的我,是为了在学习代码的过程中通过写博客的方式来巩固自己的知识。后来在遇到不会的问题时可以在csdn上面查找,寻求一点思路,将学到的知识通过博客的方式呈现出来。 收获 每当发布一篇博客后,就会收到很多人的评论加关…

出现Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错

目录: bug Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty报错解决方法 bug Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requiredProperty 报错 在一个springboot demo启动的时候出现以下错误 ,…

【前端基础篇】JavaScript之DOM介绍

文章目录 WebAPI背景知识什么是WebAPI什么是APIAPI参考文档 DOM基本概念什么是DOMDOM树查找HTML元素方法概览1. document.getElementById(id)2.document.getElementsByTagName(name)3. document.getElementsByClassName(name)4. document.querySelector(CSS选择器)5. document.…

实习手记(8):增删改查

上周又偷懒了没有按时写博客(扣大分啊啊!)但是好像也没有人看呢~其实最开始也只是想着记录一下实习历程,怕自己之后回过头想关于实习的都想不起来了,个人还是喜欢记录有关自己的学习生活的,就算没啥人看但回…

RabbitMQ 基础总结

一、前言 我们一般的项目过程都是同步通信,及一个服务结束后在执行另一个服务这会让总体时间变得很长,尤其是在高并发的时候用户体验感很不好,且在调用一个服务期间cup内存等都处于空闲状态造成资源浪费 。如果调用其中某一个服务时…

LVS+Keepalived集群(主、备)

1、Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用(HA)方案,可以解决静态路由出现的单点故障问题。 keepalived 高可用之间是通过VRRP进行通信,VRRP是通过竞选的来确定主备,主优先级高…

学习之appium的简单使用

使用之前需要先安装一下依赖 1、安装jdk:暂时为整理笔记以后补充 2、安装nodejs:https://blog.csdn.net/qq_42792477/article/details/141363957?spm1001.2014.3001.5501 3、安装SDk(安卓篇):https://blog.csdn.net/qq_42792477…

<数据集>Visdrone数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:8629张 标注数量(xml文件个数):8629 标注数量(txt文件个数):8629 标注类别数:10 标注类别名称:[pedestrian,people,bicycle,car,van,truck,tricycle,awning-tricycle…

HubSpot 自动化营销平台助力出海企业精准获客与转化 | 自动化营销

HubSpot 提供了多个开源 cms 和一体化且全面的解决方案,可帮助出海企业优化内容营销策略 HubSpot 自动化营销加速国际化 随着全球化的推进,越来越多的企业开始寻求拓展国际市场,而在这个过程中,有效的客户关系管理和营销自动化成…

ActiveMQ指南

入门 官网: http://activemq.apache.org/ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。 JMS JMS即Java消息服务(Java Message Service&#xf…

Linux自旋锁和读写锁

在前面的文章中我们已经介绍了有关互斥锁的概念与使用,本篇将开始介绍在 Linux 中的自旋锁和读写锁。这三种锁分别用于在不同的应用场景之中,其中互斥锁最为常用,但是我们需要了解一下其他的锁。 对于自旋锁和读写锁都介绍了其原理以及接口使…

【信创】麒麟KylinOS V10打开root登录桌面权限

原文链接:【信创】麒麟KylinOS V10打开root登录桌面权限 Hello,大家好啊!今天给大家带来一篇关于在麒麟KYLINOS V10上如何打开root用户登录桌面的文章。在大多数Linux发行版中,出于安全考虑,root用户默认情况下是禁止直…

KRTS网络模块:TCP服务端、客户端实例

KRTS网络模块:TCP服务端、客户端实例 目录 KRTS网络模块:TCP服务端、客户端实例TCP简介KRST服务端简介核心特性界面设计核心代码 KRTS客户端简介核心特性界面设置核心代码 运行实例 Socket模块基于Packet模块,实时提供更高的协议,如RAW-IP、TCP 和 UDP(参…

【求助帖】用PyTorch搭建MLP网络时遇到奇怪的问题

求助:我在测试自己搭建的通用MLP网络时,发现它与等价的参数写死的MLP网络相比效果奇差无比,不知道是哪里出了问题,请大佬们帮忙看下。 我写的通用MLP网络: class MLP(nn.Module):def __init__(self, feature_num, cl…

3、Unity【基础】Resources资源场景动态加载

文章目录 一、Resources资源动态加载1、Unity中特殊文件夹1、工程路径获取2、Resources资源文件夹3、StreamingAssets流动资源文件夹4、persistentDataPath持久数据文件夹5、Plugins插件文件夹6、Editor编辑器文件夹7、默认资源文件夹StandardAssets 2、Resources同步加载1、Re…