Java开发 - Redis常见问题场景及解决办法一览

前言

前面几篇博客对Redis的讲解不可谓不详细,从单节点到主从,到sentinel哨兵,到Redis Cluster都一一搭配使用给大家做了讲解,但在使用Redis的过程中我们还是要注意一些比较常见的问题,比如穿透、击穿等等,所以本篇博客主要就是给大家做这方面的扫盲,希望对一些初学者可以有些帮助。

导读

在开始讲解之前,Redis相关的博客地址我先给大家做一个推荐:

Java开发 - Redis初体验

Java开发 - 让你少走弯路的Redis的主从复制

Java开发 - 让你少走弯路的Redis主从实现单节点哨兵模式

Java开发 - 让你少走弯路的Redis集群搭建

Java开发 - 深入理解Redis哨兵机制原理

Java开发 - 深入理解Redis Cluster的工作原理

以上几篇,希望能给需要的朋友一些帮助,下面,我们来讲解Redis使用中常见的一些问题。

缓存穿透

出现的场景

当我们查询一个数据的时候,数据在Redis缓存中不存在,就会查询到数据库中,如果数据库中也没有这条数据,那就相当于没有查到任何东西。这看似很正常,可是当数以万计的查询同时进行时,缓存都没有数据,这些查询将直接访问数据库,这就带给数据库极大的压力,缓存也就失去了存在的意义。这种情况,我们称之为缓存穿透,即穿透了缓存,直达数据库,这个前提条件是大量的穿透。

解决办法

对于缓存穿透,解决的办法博主说两种:

第一种:这是业内比较常见的处理办法:保存空值。即数据库也查不到数据时,在Redis保存一个空值,并返回给请求方,下次再查询的时候就能查到空值直接返回。同时设置一个过期时间,万一这个值后面又存进去了。不过,一般在存进去的时候会把值同步到Redis,所以也不用担心数据库实际有数据,Redis仍为空的情况。

第二种:利用布隆过滤器,布隆过滤器都听过吧?没听过不要紧,最下面会说。首先将数据同步到布隆过滤器,接着再查询时判断数据不在布隆过滤器(布隆过滤器只能判断不存在),如果不存在就直接返回空数据,否则就去缓存中查找数据。看下图:

缓存击穿

出现的场景

当一个访问频繁的热点数据在Redis中突然失效时,大量的请求就会绕过Redis,直接访问数据库,相当于凿穿了Redis,这个情况其实和缓存穿透很类似,只是击穿是在缓存突然失效的时候无法找到缓存,直接访问了数据库。这种现象我们叫做缓存击穿。

解决办法

缓存击穿的解决办法也不少,主要分为以下几种:

第一种:设置热点数据为永不过期,这样就不会出现击穿的现象;

第二种:利用分布式锁,在热点数据失效后,保证只有一个线程去访问数据库,访问数据库后就把查询到的数据缓存到Redis,这样,后面的数据就不会出现击穿的情况。如下图:

缓存雪崩

出现的场景

缓存雪崩指在某一段时间内,缓存大量过期,或者Redis服务直接宕机,导致大量的缓存无法命中,越积越多,就像雪花一样,最后引起大范围的崩塌,就好像雪崩了一样。其本质也是直接访问了数据库,只是出现的情况和上面的击穿和穿透不一样。但严重的不是缓存的集中过期,而是Redis服务的宕机,我想,大家应该都能想明白这其中的道理。

解决办法

解决的办法嘛其实也很简单:

第一种:针对集中过期的数据,设置基数+随机数的过期时间,这样就不会出现缓存集中过期的场景,或者设置锁,限制绕过缓存访问数据库的线程数量;

第二种:针对Redis服务宕机的情况,使用Redis主从、集群都是很好的解决方案,但也要根据实际情况和成本出发去考虑问题。

布隆过滤器

关于布隆过滤器的使用,博主在先前的博客中有详细介绍过,传送门:Java开发 - 布隆过滤器初体验

所以,此处不再赘述,你只需要知道的是:布隆过滤器只能判断不存在某个数据,而不能判断存在。

结语

伴随着轻快的下课铃声,额...不是,伴随着博主留下一个个链接之后,本篇博客就要跟大家说再见了,学习使我快乐,不知道这篇博客能不能带给你快乐呢?咱们今天就讲到这里,下一篇讲什么,博主要好好想想,有可能是Kafka,也有可能是RabbitMQ,我再纠结纠结。

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

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

相关文章

助力保险行业数字化创新,麒麟信安参展2023中国财险科技应用高峰论坛

2023年7月27日,由中科软科技股份有限公司主办的“中国财险科技应用高峰论坛”在北京古北水镇成功举办。作为享誉中国保险科技界的盛会,本次活动以“数智保险 创新未来”主题,汇聚全国数百位保险公司主管领导、资深保险行业信息化专家&#xf…

Ae 效果:CC Kernel

颜色校正/CC Kernel Color Correction/CC Kernel CC Kernel(CC 卷积核)效果主要用于图像的卷积处理,通过在卷积矩阵中设置不同的权重值,可以实现图像的锐化 Sharpen、模糊 Blur、查找边缘 Find Edges以及浮雕 Emboss等效果。 ◆ …

服务调用---------Ribbon和Feign

目录​​​​​​​ 1、Ribbon 1.1 Ribbon简介 1.2 Ribbon负载均衡 负载均衡原理 负载均衡策略 Ribbon和Nginx的区别 1.3 服务调用和Ribbon负载均衡实现 2、Feign&openFeign 3、Feign支持的配置 日志功能 连接池 feign-api远程包 1、Ribbon 1.1 Ribbon简介 Ribb…

神经概率语言模型

本文主要参考《A Neural Probabilistic Language Model》这是一篇很重要的语言模型论文,发表于2003年。主要贡献如下: 提出了一种基于神经网络的语言模型,是较早将神经网络应用于语言模型领域的工作之一,具有里程碑意义。采用神经网络模型预测下一个单词…

05-向量的意义_n维欧式空间

线性代数 什么是向量?究竟为什么引入向量? 为什么线性代数这么重要?从研究一个数拓展到研究一组数 一组数的基本表示方法——向量(Vector) 向量是线性代数研究的基本元素 e.g. 一个数: 666,…

springboot整合tio-websocket方案实现简易聊天

写在最前: 常用的http协议是无状态的,且不能主动响应到客户端。最初想实现状态动态跟踪只能用轮询或者其他效率低下的方式,所以引入了websocket协议,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务…

实用上位机--QT

实用上位机–QT 通信协议如下 上位机设计界面 #------------------------------------------------- # # Project created by QtCreator 2023-07-29T21:22:32 # #-------------------------------------------------QT += core gui serialportgreaterThan(QT_MAJOR_V…

Unity实现在3D模型标记

Canvas 模式是UI与3D混合模式(Render modelScreen space-Camera) 实现在3D模型标记,旋转跟随是UI不在3D物体下 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public clas…

矩阵中的路径(JS)

矩阵中的路径 题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是…

valgrind——内存泄漏检测介绍

文章目录 1. 概述1. 体系结构2. Linux 程序内存空间布局3. 内存检查原理 2. valgrind工具3. 常用选项4. 示例1. 内存泄漏2. 数组越界3. 内存覆盖4. 使用未初始化的值5. 内存申请与释放函数不匹配 5. 总结 1. 概述 1. 体系结构 Valgrind 是一套 Linux 下,开放源代码…

移动端个人中心UI设计

效果图 源码如下 页面设计 <template><div class"container"><!-- 顶部用户信息 start--><div class"header"><div class"user-info"><van-image class"user-img" round width"70" :sr…

HCIP--云计算题库 V5.0版本

在国家政策的支持下&#xff0c;我国云计算应用市场发展明显加快&#xff0c;越来越多的企业开始介入云产业&#xff0c;出现了大量的应用解决方案&#xff0c;云应用的成功案例逐渐丰富&#xff0c;用户了解和认可程度不断提高&#xff0c;云计算产业发展迎来了“黄金机遇期”…

【ArcGIS Pro二次开发】(55):给多个要素或表批量添加字段

在工作中可能会遇到这样的场景&#xff1a;有多个GDB要素、表格&#xff0c;或者是SHP文件&#xff0c;需要给这个要素或表添加相同的多个字段。 在这种情况下&#xff0c;手动添加就变得很繁琐&#xff0c;于是就做了这个工具。 需求具体如下图&#xff1a; 左图是待处理数据…

C数据结构——无向图(邻接矩阵方式) 创建与基本使用

源码注释 // // Created by Lenovo on 2022-05-13-上午 9:06. // 作者&#xff1a;小象 // 版本&#xff1a;1.0 //#include <stdio.h> #include <malloc.h>#define MAXSIZE 1000 // BFS队列可能达到的最大长度 #define MAX_AMVNUMS 100 // 最大顶点数typedef enu…

电脑剪辑视频的软件有哪些?试试这几种视频剪辑工具

视频剪辑可以帮助人们在不同情境下更好地理解和消化视频内容。通过剪辑&#xff0c;可以去除不必要的素材并突出重点&#xff0c;使观看者能够更快地获取信息&#xff0c;并且更容易保持注意力的集中。此外&#xff0c;剪辑可以提高视频质量&#xff0c;例如通过添加音乐、图形…

CVPR2023新作:源数据集对迁移学习性能的影响以及相应的解决方案

Title: A Data-Based Perspective on Transfer Learning (迁移学习的基于数据的观点) Affiliation: MIT (麻省理工学院) Authors: Saachi Jain, Hadi Salman, Alaa Khaddaj, Eric Wong, Sung Min Park, Aleksander Mądry Keywords: transfer learning, source dataset, dow…

Git分布式版本控制工具和GitHub(二)--Git指令入门

一.指令入门前的准备 1.Git全局设置 2.获取Git仓库 例如&#xff1a;将我GitHub上的first_resp仓库克隆到本地。 点击进入first_rep&#xff0c;后面本地仓库操作的学习就是在这个界面右键打开Git Bash 3.工作区&#xff0c;暂存区&#xff0c;版本库概念 注&#xff1a;如果空…

Reinforcement-Learning

文章目录 Reinforcement-Learning1. RL方法分类汇总&#xff1a;2. Q-Learning3. SARSA算法4. SARSA&#xff08;λ&#xff09; Reinforcement-Learning 1. RL方法分类汇总&#xff1a; &#xff08;1&#xff09;不理解环境&#xff08;Model-Free RL&#xff09;&#xff…

【【51单片机的红外遥控】】

红外遥控&#xff0c;完全把控 红外遥控 利用红外光进行通信的设备&#xff0c;由红外LED将调制后的信号发出&#xff0c;再由专门的红外接收头进行解调输出 通信方式&#xff1a;单工 异步 红外LED波长&#xff1a;940nm 通信协议标准&#xff1a;NEC标准 用那种一体化红红外…

【MySQL】模具数据转移处理

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…