Redis缓存

2023-09-20 18:00:48

目录

什么是缓存?

缓存特性

1、缓存雪崩

2、缓存穿透

3、缓存击穿

4、缓存预热


什么是缓存?

在程序中如果没有设置缓存的时候,用户想要获取到数据一般都是直接从数据库中获取。

加入缓存之后会这样执行

我们都知道查询数据库是一个比较慢的过程,对用户而言这样的体验是非常不好的。加入缓存之后,查询数据就会先在缓存中查找,如果缓存中没有才会去访问数据库,在数据库中查找到数据后再写回到缓存中以便后面查找,这样可以大大降低访问数据库的次数,从而减少多次访问数据库带来的压力,提高查询效率。

缓存的优点

与操作数据库相比,操作缓存会更加高效,原因如下:

  • 缓存一般使用 key-value 来存储和查询数据,与查询数据库相比这种通过 key-value 方式的查询更加简单直接
  • 缓存的数据存储在内存中,而数据库的数据存储在磁盘里面,访问内存的速度比访问磁盘的速度要快的多
  • 缓存更容易实现分布式部署(一台服务器变成多台服务器相连的集群),而数据库比较难实现分布式部署,缓存的特性更容易平行扩展

缓存的分类

缓存可以分为以下两类:

  • 本地缓存:也叫做单级缓存,简单来说就是在一台服务器上的缓存,只适用于当前的本地系统
  • 分布式缓存:应用在分布式系统上的缓存。分布式系统就是将一套服务器部署在多台服务器上,通过负载均衡器将用户的请求按照一定的规则分发到不同的服务器上,如下图:

在分布式系统上加上分布式缓存之后就变成了下图过程:

缓存特性

1、缓存雪崩

缓存雪崩是指在短时间内大量的缓存同时过期,导致大量的请求直接访问数据库,进而给数据库造成巨大压力,严重的时候甚至会导致数据库宕机。

解决方法

①加锁排队:起到缓冲作用,能够防止大量请求同时操作数据库,但是增加了系统的响应时间,降低了系统的吞吐量,牺牲了一部分用户的体验。

②随机化过期时间:为了避免大量缓存同时过期,我们可以设置添加随机的时间。

// 缓存原本的失效时间
int exTime = 10 * 60;
// 随机数⽣成类
Random random = new Random();
// 缓存设置
redis.setex(cacheKey, exTime+random.nextInt(1000) , value);

③设置二级缓存:二级缓存是除了 Redis 本身的缓存,再设置一层缓存,当 Redis 缓存失效后,就去查询二级缓存,如下图:

2、缓存穿透

缓存穿透是指在缓存和数据库中都没有查询到数据,每次都会白白地访问数据库,如下图:

红色路线就是缓存穿透的执行路径,可以看出会白白地给数据库带来巨大的压力。

解决方法

  • 缓存空结果:对查询到的空结果也保存在缓存中,如果是一个集合,那么可以保存一个空的集合,如果是缓存单个对象,可以使用字段来进行区分,避免请求穿透到数据库。
  • 布隆过滤器处理:将所有可能对应的数据为空的 key 进行统一的存放,并在请求之前做拦截,避免请求穿透到数据库(这种方式实现起来相对麻烦,比较适合命中不高,但是更新不频繁的数据)。
3、缓存击穿

缓存击穿是指某个经常使用的缓存,在某一个时刻恰好失效了(例如缓存过期),并且此时恰好有大量的并发请求,这些请求就会给数据库造成巨大的压力,如下图:

解决方法:

  • 加锁排队:和处理缓存雪崩的方法类似,都是在查询数据库的时候加锁排队,缓存操作请求以此来减少服务器的运行压力。
  • 设置永不过时:对于某些常用的数据,我们可以将其设置为永不过期,这样就可以保证缓存的稳定性,需要注意的是,在数据更改之后,要及时更新这个热点缓存,否则就会造成查询结果误差。
4、缓存预热

缓存预热是一种优化方案,它可以提高用户的使用体验。

缓存预热是指在系统启动的时候,先把查询结果预存到缓存中,以便于用户后面查询时可以直接从缓存中读取,节省用户的等待时间,如下图:

缓存预热实现思路:

  • 把需要缓存的方法写在初始化的方法中,让程序启动时自动加载数据并且缓存数据。
  • 把需要缓存的方法挂在某个页面或是后端接口上,手动触发缓存预热。
  • 设置定时任务,定时进行缓存预热。

参考资料:https://blog.csdn.net/CYK_byte/article/details/129780182

更多推荐

提升开发效率的低代码思路

目录一、低代码如何快速开发?1.可视化开发2.预构建的组件和模板3.集成的开发和测试工具4.跨平台兼容性5.可伸缩性和可扩展性二、前后端分离的开发框架技术架构部署方式应用入口三、小结低代码开发工具正在日益变得强大,它正不断弥合着前后端开发之间的差距。对于后端来说,基于低代码平台开发应用时,完全不用担心前端的打包、部署等

如何申请办理400电话?

导语:随着企业的发展和市场竞争的加剧,越来越多的企业开始意识到拥有一个400电话的重要性。本文将介绍如何申请办理400电话,帮助企业提升客户服务质量和品牌形象。一、了解400电话的概念和优势400电话是一种企业客服电话号码,以400开头,可以通过固定电话和手机拨打。相比于普通电话号码,400电话具有以下优势:全国范围内

【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )

文章目录一、构造函数的初始化列表中为const成员变量初始化1、初始化const常量成员2、错误代码示例-没有初始化常量成员3、正确代码示例-在初始化列表中初始化常量成员4、完整代码示例构造函数初始化列表总结:初始化列表可以为类的成员变量提供初始值;初始化列表可以调用类的成员变量类型的构造函数进行成员变量初始化操作;初

【AI Business Model】人工智能的定义 | 了解 AI 的历史 | 简单理解什么是 “图灵测试“

💭写在前面:本章我们将讲解工业革命的定义、人工智能的定义以及第四次工业革命的特点。0x00人工智能的定义①WIKI百科定义:机器智能,技术使机器能够模拟人类的学习能力和问题解决能力。②在计算机领域的定义:为了实现某一目标,感知当前情况。决定行动以最大程度地实现该目标的代理,弱人工智能。③来自维基百科的AGI(人工通用

走进人工智能|自动驾驶 开启智能出行新时代

前言自动驾驶,也被称为无人驾驶或自动驾驶汽车,是指能够在没有人类干预的情况下自主地感知环境、决策和控制车辆行驶的技术和系统。文章目录前言主题发展趋势自动驾驶等级L0级自动驾驶L1级别自动驾驶L2级别自动驾驶L3级别自动驾驶L4级别自动驾驶L5级别自动驾驶小结应用领域核心技术传感器技术激光雷达传感器摄像头传感器超声波传感

讯飞星火认知大模型V2.0:迈向认知计算的全新时代

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Learn Prompt-ChatGPT 精选案例:学习助理

ChatGPT作为学习助理的强大是在于对个人需求的定制化回复。建立知识网络建立新知识和已有知识的链接。在知识之间建立链接不仅可以产生新的灵感而且还会在大脑的信息之间建立新的连接,让我们提取知识更加的可靠、高效。通过查看更多的例子可以帮助我们理解知识,例如在学习新概念时,可以向ChatGPT获取例子来帮助理解。实时反馈C

面向面试知识-Redis

面向面试知识-Redis什么是Redis运行于内存的基于key-value的非关系型数据库。一款开源的内存数据结构存储,用作数据库、缓存、消息代理等。(可以基于Redis实现分布式锁、以及消息队列)发布订阅??对数据类型的操作都是原子性的,因为执行命令由单线程负责,不存在并发竞争的问题。除此之外,Redis还支持:Re

日志的艺术

良好的日志是运维、开发人员排查问题的好工具,本文建议定义JSON格式的结构化日志格式,从而有效优化人工以及机器排查日志的效能,并能方便创建机器索引。原文:TheArtofLoggingViktorTalashuk@Unsplash从历史上看,日志对于诊断应用程序和基础设施性能非常重要,被广泛应用于业务仪表板的可视化和性

MySQL数据库详解 五:用户管理

文章目录1.数据库的用户管理1.1新建用户1.2重命名用户1.3删除用户1.4修改用户密码1.5忘记用户密码的解决方法1.6数据库用户授权1.6.1授权用户权限类别1.6.2添加权限1.6.2撤销权限2.mysql命令1.数据库的用户管理1.1新建用户createuser'用户名'@'来源地址'[identifiedb

天线原理【1】 天线辐射的物理过程

1前言前面讲以振子方程入手分析电磁场问题的解的时候,有网友发信息说这和天线有什么关系,怎么从振子入手分析天线;那我就开始写几次关于天线的。有一种说法是,能给任何人讲懂的理论,才说明你真的懂了。对天线部分我曾经很有信心,觉得能给任何人讲懂;因为我最多的思考是天线、所有关于振子方程、关于对电磁场问题解的理解,都是从天线出发

热文推荐