【Redis】Redis雪崩、 穿透

2023-05-16

目录

    • Redis穿透
    • Redis雪崩
    • 热点key重建优化

    Redis缓存中间件的使用,极大的提升了应用程序数据查询的性能和效率。在使用Redis的过程中存在其他的问题——Redis穿透、雪崩。

Redis穿透

redis穿透:指总是查询一条redis缓存中不存在的记录,会直接查询数据库略过redis,redis起不到作用。
解决方案:
1)缓存空对象
    缓存空对象会有两个问题: 第一, 空值做了缓存, 意味着缓存层中存了更多的键, 需要更多的内存空间(如果是攻击, 问题更严重) , 比较有效的方法是针对这类数据设置一个较短的过期时间, 让其自动剔除。 第二, 缓存层和存储层的数据会有一段时间窗口的不一致, 可能会对业务有一定影响。例如过期时间设置为5分钟, 如果此时存储层添加了这个数据, 那此段时间就会出现缓存层和存储层数据的不一致, 此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
代码如下:

String get (String key){
            // 从缓存中获取数据
            String cacheValue = cache.get(key);
            // 缓存为空
            if (StringUtils.isBlank(cacheValue)) {
                // 从存储中获取
                String storageValue = storage.get(key);
                cache.set(key, storageValue);
                // 如果存储数据为空, 需要设置一个过期时间(300秒)
                if (storageValue == null) {
                    cache.expire(key, 60 * 5);
                }
                return storageValue;
            } else {
                // 缓存非空
                return cacheValue;
            }
        }

2)布隆过滤器拦截
在这里插入图片描述
    如图,在访问缓存层和存储层之前, 将存在的key用布隆过滤器提前保存起来, 做第一层拦截。 例如: 一个推荐系统有4亿个用户id, 每个小时算法工程师会根据每个用户之前历史行为计算出推荐数据放到存储层中, 但是最新的用户由于没有历史行为, 就会发生缓存穿透的行为, 为此可以将所有推荐数据的用户做成布隆过滤器。 如果布隆过滤器认为该用户id不存在, 那么就不会访问存储层, 在一定程度保护了存储层。
    这种方法适用于数据命中不高、 数据相对固定、 实时性低(通常是数据集较大) 的应用场景, 代码维护较为复杂, 但是缓存空间占用少。
3)方案对比
在这里插入图片描述

Redis雪崩

redis雪崩:redis缓存中所有缓存数据失效,导致所有的查询都去查询数据库。
在这里插入图片描述
解决方案:
1)保证缓存层服务高可用性。 缓存层设计成高可用的, 即使个别节点、 个别机器、 甚至是机房宕掉, 依然可以提供服务, 例如前面介绍过的Redis Sentinel和Redis Cluster都实现高可用。
2) 依赖隔离组件为后端限流并降级。 无论是缓存层还是存储层都会有出错的概率, 可以将它们视同为资源。 作为并发量较大的系统, 假如有一个资源不可用, 可能会造成线程全部阻塞( hang) 在这个资源上, 造成整个系统不可用。 降级机制在高并发系统中是非常普遍的: 比如推荐服务中, 如果个性化推荐服务不可用, 可以降级补充热点数据, 不至于造成前端页面是开天窗。 在实际项目中, 我们需要对重要的资源( 例如Redis、 MySQL、HBase、 外部接口) 都进行隔离, 让每种资源都单独运行在自己的线程池中, 即使个别资源出现了问题, 对其他服务没有影响。 但是线程池如何管理, 比如如何关闭资源池、 开启资源池、 资源池阀值管理, 这些做起来还是相当复杂的。

热点key重建优化

1)互斥锁
    如果构建缓存过程出现问题或者时间较长, 可能会存在死锁和线程池阻塞的风险, 但是这种方法能够较好地降低后端存储负载, 并在一致性上做得比较好
2)设置缓存永不过期
    这种方案由于没有设置真正的过期时间, 实际上已经不存在热点key产生的一系列危害, 但是会存在数据不一致的情况, 同时代码复杂度会增大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Redis】Redis雪崩、 穿透 的相关文章

  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 为什么 Redis TimeSeries 不捕获聚合中的最后一个元素?

    我试图了解 Redis 的时间序列规则创建的工作原理 但我很困惑为什么 Redis 会忽略聚合中的最后一项 并想知道这是否是预期的行为 我在中创建了示例代码redis cli为了显示 127 0 0 1 6379 gt FLUSHALL O
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • 使用 Celery 通过 Gevent 进行实时、同步的外部 API 查询

    我正在开发一个 Web 应用程序 该应用程序将接收用户的请求 并且必须调用许多外部 API 来编写对该请求的答案 这可以直接从主 Web 线程使用 gevent 之类的东西来扇出请求来完成 或者 我在想 我可以将传入的请求放入队列中 并使用
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe
  • Redis 队列工作程序在 utcparse 中崩溃

    我正在尝试按照以下教程获得基本的 rq 工作 https blog miguelgrinberg com post the flask mega tutorial part xxii background jobs https blog m
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 如何在Redis中正确存储图片?

    决定将图像存储在Redis中 如何正确执行 现在我这样做 redis gt set image path here is the base64 image code 我不确定这是否正常 将图片存储在Redis中是完全可以的 Redis 键和
  • 集合成员的 TTL

    Redis 是否可以不为特定键而是为集合的成员设置 TTL 生存时间 我正在使用 Redis 文档提出的标签结构 数据是简单的键值对 标签是包含与每个标签对应的键的集合 例如 gt SETEX id id 1 100 Lorem ipsum
  • 检查 Redis 列表中是否已存在某个值

    我想知道是否有办法检查 redis 列表中是否已存在某个键 我无法使用集合 因为我不想强制唯一性 但我确实希望能够检查字符串是否确实存在 Thanks 您的选择如下 Using LREM如果发现则更换它 维护一个单独的SET与您的LIST
  • redis能完全取代mysql吗?

    简单的问题 我是否可以使用 redis 而不是 mysql 来处理各种 Web 应用程序 社交网络 地理位置服务等 IT 领域没有什么是不可能的 但有些事情可能会变得极其复杂 将键值存储用于全文搜索之类的事情可能会非常痛苦 另外 据我所知
  • redis.exceptions.ConnectionError:连接到本地主机时出现错误-2:6379。名称或服务未知

    当我在服务器中运行代码时出现此错误 我的环境是 debian 并且Python2 7 3 Traceback most recent call last File fetcher py line 4 in
  • Redis AOF fsync(始终)与 LSM 树

    我对日志结构化合并树 LSM 树 的理解是 它利用了附加到磁盘非常快 因为它不需要查找 这一事实 只需将更新附加到预写日志并返回到客户端即可 我的理解是 这仍然提供了立即的持久性 同时仍然非常快 我不认为 Redis 使用 LSM 树 它似
  • 在 Redis 中存储 IP 范围

    我有很多不同提供商的 IP 范围 例如 P1 192 168 1 10 192 168 1 50 192 168 2 16 192 168 2 49 P2 17 36 15 34 17 36 15 255 P3 我将此 IP 转换为 int
  • 如何高效地将数十亿数据插入Redis?

    我有大约 20 亿个键值对 我想将它们有效地加载到 Redis 中 我目前正在使用 Python 并使用 Pipe 如redis py https redis py readthedocs io en latest redis Redis
  • Redis - 错误:值不是有效的浮点数

    我在 Redis 中有一个排序集 我试图通过在Python代码中使用zincrby来更新特定元素的计数器值 例如 conn zincrby usersSet float 1 user1 但它显示错误为 错误 值不是有效的浮点数 我在 cli
  • 如何在Redis中使用HSCAN命令?

    我想在我的作业中使用 Redis 的 HSCAN 命令 但我不知道它是如何工作的 Redis 的官方页面 http redis io commands hscan http redis io commands hscan 这个命令给了我空白
  • spring中如何使用jackson代替JdkSerializationRedisSerializer

    我在我的一个 Java 应用程序中使用 Redis 并且正在序列化要存储在 Redis 中的对象列表 但是 我注意到使用 RedisTemplate 会使用 JdkSerializationRedisSerializer 相反 我想使用 J
  • Flask-SocketIO redis 订阅

    我在用着https github com miguelgrinberg Flask SocketIO https github com miguelgrinberg Flask SocketIO实现 WebSocket 服务器 我需要从另一

随机推荐

  • java变量类型

    这几天小编在学习java时看到很多变量很懵圈 xff0c 去学习了一下 1 静态变量 xff08 类变量 xff09 xff1a 独立于方法之外的变量 xff0c 用 static 修饰 类变量也称为静态变量 xff0c 在类中以stati
  • PowerDisigner添加数据描述

    1 首先创建表 xff0c 然后双击表 2 弹出框后选择Columns 3 点击Coustomize Columns and Filter 或者使用快捷键 xff1a Ctrl 43 U 4 在comment前面打对勾 5 列集合里面会多出
  • Mapper对于数据求和返回值为null怎么解决

    在对于数据求和时返回值为null 报如下错误 数据库语句如下 SELECT FROM user WHERE user id 61 userid and YEARWEEK date format create time 39 Y m d 39
  • Ionic圆环进度条

    最近小编做的项目有个业务需求是对于自己的情况和目标有一个进度环的展示 如图 代码如下 Ts文件中 先定义两个变量max以及current 圆环进度条 color string 61 39 1890fb 39 backgound string
  • task-bug-detail.ts ispart of the declarations of 2 modules: APPModel

    Ionic手机端项目在打包的时候报错 task bug detail ts ispart of the declarations of 2 modules AppModule 出现原因在APPModel中 APPModel中声明 task
  • 字符串过长时截取字符串前n个字

    今天小编在做项目时发现现实内容过长产生乱码一样的效果 xff0c 就用截取字符串长度来优化了一下 方法代码如下 xff1a 实现的效果为超过16个字符串后 xff0c 从第15个字符串开始用 代替 if arr i reason 61 34
  • idea的xml文件Tag name expected

    小编在mapper文件中写sql语句时提示Tag name expected xff0c 找到原因是因为xml不识别 lt 号需要用特定转义符来表示 lt 号 SELECT CASE WHEN SUM integral is null Th
  • jenkins构建成功后提交的代码不起作用

    小编今天用Jenkins构建之后不报错 xff0c 但是打开软件提交代码的这个功能没有实现 最后定位找原因时发现提交的代码没有拉过去 xff0c 在本地build时报错 xff1a 提示引用两个组件Page xff0c 当这里报错时Jenk
  • 添加spring cloud微服务

    在之前的spring cloud项目中添加微服务 1 右键父项目文件夹 xff0c new添加maven项目 2 选择next 3 对于微服务自定义名字 4 微服务名字选定后对微服务的文件夹保存地址进行选择 5 创建成功
  • 2018半年博客总结

    自己接触编程三年了 xff0c 时间很快 xff0c 自己这半年经历了大学毕业答辩 xff0c 还有河北大学自考答辩 xff0c 感受到了别人的成长也看到了自己的成长 管理 这一个月刚当了小组长 xff0c 在之前都是自己领任务完成任务就好
  • ftp操作,权限设置及用户创建的各种坑

    首先说下我的环境 xff0c windows7 xff0c iis部署的的ftp服务器 坑1 xff0c 必须使用文件夹里面 xff0c 输入ip地址才能进去 xff0c ftp 192 168 1 12就能进去了 不要用IE和浏览器 xf
  • XXL-Job 没有到主机的路由

    最近项目需要添加定时任务 xff0c 使用了XXL job xff0c 在执行时报错界面如下 xff1a 1 查到原因说可能端口号没有开 服务器查看端口号 xff1a 9991防火墙端口未开启 2 解决方案 xff1a 打开服务器防火墙端口
  • 本地开启网关

    因为本地调试XXL JOB需要通过本地IP以及端口 xff0c 本地没有端口需要添加 xff0c 步骤如下 xff1a 1 2 3 4 5 6 7 8 9
  • 游标

    游标 xff08 Cursor xff09 是处理数据的一种方法 xff0c 为了查看或者处理结果集中的数据 xff0c 游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力 可以把游标当作一个指针 xff0c 它可以指定结果中的任
  • 自考总结

    又一次自考来临 xff0c 越来越深的体会是课本基础知识很重要 理解记忆 xff0c 还有各种方式 xff0c 不限于书本上的理论知识 xff0c 可以运行C 43 43 软件去写代码运行理解 思维导图是一遍一遍加深自己理解的过程 xff0
  • MySQL启动报错

    1 问题描述 2 解决方案 本地计算机上的MySQL服务启动后停止 某些服务在未由其他服务或程序使用时将自动停止 1 安装完MySQL后配好环境启动SQL服务报错 xff0c 如下图 xff1a 2 解决方案 1 xff09 查找报错原因
  • No compiler is provided in this environment

    小编今天在运行项目时报错 xff0c 如下图 xff1a 第一行错误排查原因 xff0c 发现是因为版本不对应 xff0c 找到项目引用版本的地方发现没有错误 xff0c 内容如下 xff1a 第二行错误排查原因 xff1a java编译环
  • 无法打开内核设备“\\.\Global\vmx86”

    1 今天小编在继续运行挂起的虚拟机时提示无法打开内核设备 Global vmx86 系统找不到指定的文件 是否在安装 VMware Workstation 后重新引导 未能初始化监视器设备 2 出现该问题的原因是 xff1a 是虚拟机服务没
  • 【Redis】redis学习

    目录 redis数据形式redis使用命令Redis特性 redis数据形式 redis数据形式 xff1a key value xff1b redis所有存放数据都是String类型 数据类型指的是value的类型 xff1a Strin
  • 【Redis】Redis雪崩、 穿透

    目录 Redis穿透Redis雪崩热点key重建优化 Redis缓存中间件的使用 xff0c 极大的提升了应用程序数据查询的性能和效率 在使用Redis的过程中存在其他的问题 Redis穿透 雪崩 Redis穿透 redis穿透 xff1a