首页 > 数据库 >Redis学习之缓存穿透

Redis学习之缓存穿透

时间:2023-09-20 17:14:27浏览次数:42  
标签:shop shopJson 缓存 return Redis 穿透 Result id

缓存穿透

攻击者可以恶意请求数据库中不存在的数据,从而使得每次查询都要绕过缓存查数据库,增大数据库的压力。

解决方案:

1.缓存空值:比如塞一个空字符串。注意可以给空对象的键过期时间设置短一些,或者在新增数据时强制清除下对应缓存(防止查出来还是 null)

2.布隆过滤器

image-20230920165041595

预防做法:

1.增强对请求数据的校验,比如 id > 0

2.增强对数据格式的控制,比如 id 设置为 10 位,不为 10 位的请求直接拒绝

3.增强用户权限校验

4.通过限流来保护数据库

修改后的代码

@Override
    public Result queryById(Long id) {
        String key = CACHE_SHOP_KEY + id;
        // 1.从redis查询商铺缓存
        String shopJson = stringRedisTemplate.opsForValue().get(key);
        // 2.判断是否存在
        if (StrUtil.isNotBlank(shopJson)) {
            // 3.存在,直接返回
            Shop shop = JSONUtil.toBean(shopJson, Shop.class);
            return Result.ok(shop);
        }
        // 判断命中的是否是空值
        if (shopJson != null) {
            // 返回一个错误信息
            return Result.fail("店铺不存在!");
        }
        // 4.不存在,根据id查询数据库
        Shop shop = getById(id);
        if (shop == null){
            // 将空值写入redis
            stringRedisTemplate.opsForValue().set(key,"",CACHE_NULL_TTL, TimeUnit.MINUTES);
            // 5.不存在返回错误
            return Result.fail("店铺不存在!");
        }
        // 6.存在,写入redis
        stringRedisTemplate.opsForValue().set(key,JSONUtil.toJsonStr(shop),CACHE_SHOP_TTL, TimeUnit.MINUTES);
        // 7.返回
        return Result.ok(shop);
    }

标签:shop,shopJson,缓存,return,Redis,穿透,Result,id
From: https://www.cnblogs.com/ysk0904/p/17717784.html

相关文章

  • Redis学习之缓存实现及缓存更新
    介绍什么是缓存?缓存就是数据交换的缓冲区(称作Cache[kæʃ]),是存贮数据的临时地方,一般读写性能较高。为什么需要缓存?提前准备好数据,便于更快地读写。 缓存是把双刃剑,要权衡利弊。优点:降低后端负载提高读写效率,降低响应时间缺点:数据一致性成本代码维护成本运维......
  • Redis 面试常见问答
    本文出自:https://thinkinjava.cn作者:莫那鲁道1\.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓存宕机使用断......
  • Redis的五中数据类型以及应用场景
    1.string字符串在redis中string是可以修改de被称之为动态字符串.其中内部更像arraylist内部维护一个字节数组,在其内部分配了一定的空间.内存分配机制当字符串的长度小于1m的时候,每次扩容都是加倍空间当字符串长度超过1m的时候每次扩容只会扩张1m的空间字符串的最大长度......
  • Redis之Sentinel哨兵监控
    哨兵简介 1.redis提供了哨兵的命令,是一个独立的进程 2.哨兵通过发送命令给节点,通过redis节点响应达到监控多个redis实例的运行情况 3.当哨兵发现master宕机,会自动将从节点切换成主节点,并通知其他的从节点,修改配置文件切换主机 4.默认端口是26379哨兵的主要任务 1.......
  • Redis 不同插入方法的性能对比
    1.测试目的对比Redis不同插入方法(插入同时能设置过期时间)的性能区别。2.测试数据key:SMGP_value:JSON数据{ "spName":"100003", "protocol":"SMGP", "remoteAddress":"192.192.192.192:44192", "host":"192.192......
  • redis
    前言原文作者:KyleViolet文章链接:Redis入门|Kyle'sBlog(cyborg2077.github.io)版权声明:本博客所有文章除特别声明外,均采用CCBY-NC-SA4.0许可协议。转载请注明来自Kyle'sBlog!本文章为在原文基础上,进行稍作修改的文章,版权声明如上。本文为瑞吉外卖项目的后续......
  • Redis 面试常见问答
    本文出自:https://thinkinjava.cn作者:莫那鲁道1.什么是缓存雪崩?怎么解决?一般而言,我们会利用缓存来缓冲对数据库的冲击,假如缓存无法正常工作,所有的请求便会直接发送至数据库,进而导致数据库崩溃,从而导致整个系统崩溃。如何解决呢?2种策略(同时使用):对缓存做高可用,防止缓......
  • dns缓存中毒43.227.199.x
    什么是DNS缓存中毒DNS缓存中毒是一种网络攻击,它使您的计算机误以为它会到达正确的地址,但事实并非如此。攻击者使用DNS缓存中毒来劫持互联网流量并窃取用户凭据或个人数据。DNS缓存中毒攻击也称为DNS欺骗,它试图诱骗用户将其私人数据输入不安全的网站。什么是DNS缓存在讨论攻击之......
  • redis cluster三主六从 redis三主三从集群搭建
    转自:https://blog.51cto.com/u_16099166/6885197一、下载安装二、本文架构(三台服务器,每台部署两个节点,主从同步,生产最好是部署六台服务器): 三、进入redis安装目录,复制redis.conf文件,建立从节点配置文件1#进入redis安装目录2cdredis34#复制redis.conf文件5cpredis.......
  • redis三主三从哨兵模式 redis三主三从集群
    转自:https://blog.51cto.com/u_16213559/7033634conf复制/usr/local/src/redis-6.2.6文件夹下redis.conf文件到/usr/local/src/master-slave文件夹中命名为redis6381.conf1#允许访问的地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问,生产环境不......