redis的典型应用 --缓存

Redis最主要的用途,分为三个方面:

1.存储数据(内存数据库)

2.缓存(最常用)

3.消息队列

缓存 (cache) 是计算机中的⼀个经典的概念。核⼼思路就是把⼀些常⽤的数据放到触⼿可及(访问速度更快)的地⽅,方便随时读取。

使用redis作为缓存

通常是使用redis作为数据库的缓存(mysql),mysql这样的关系型数据库的速度比较慢,就可以使用redis作为mysql的缓存。

如果访问数据库的并发量⽐较⾼, 对于数据库的压⼒是很⼤的, 很容易就会使数据库服务器宕机。

为什么并发量⾼了就会宕机?

服务器每次处理一个请求,一定要消耗一些硬件资源(cpu,内存,硬盘,网络),任意一种资源的消耗超出了机器能提供的上限,机器就很容易故障了。

如何提高mysql能承担的并发量?

1.开源:引入更多的机器,构成数据库集群。

2.节流:引入缓存。把一些频繁读取的热点数据,保存到缓存上。后续在查询数据的时候,如果缓存中已经存在了,就不再访问mysql了。

Redis 访问速度⽐ MySQL 快很多。或者说处理同⼀个访问请求, Redis 消耗的系统资源⽐
MySQL 少很多. 因此 Redis 能⽀持的并发量更⼤.

缓存更新策略

如何知道redis中应该存储哪些数据呢?这就涉及到redis缓存的更新策略。

定期生成

会把访问的数据,以日志的形式记录下来。

每隔⼀定的周期(⽐如⼀天/⼀周/⼀个⽉), 对于访问的数据频次进⾏统计。挑选出访问频次最⾼的前 N%的数据。

搜索引擎为例,可以写一套离线的流程,通过定时任务来触发:

a) 完成统计热词的过程。

b)根据热词,找到搜索结果数据(广告数据)

c)把得到缓存数据同步到缓存服务器上

d)控制这些缓存服务器自动重启

优点:实现起来比较简单,过程更可控,方便排查问题。

缺点:实时性不够,如果出现一些突发性事件,有一些本来不是热词的内容,成了热词。新的热词就可能给后面的数据库带来较大的压力。(⽐如春节期间, "春晚" 这样的词就会成为⾮常⾼频的词. ⽽平时则很少会有⼈搜索 "春晚".)

实时生成

实时生成的流程:

• 如果在 Redis 查到了, 就直接返回.
• 如果 Redis 中不存在, 就从数据库查,把查到的结果同时也写⼊ Redis。

可这样不停的写redis,就会使redis的内存占用越来越多。会逐渐达到内存上限。

此时如果继续往里插入数据,就会触发问题。为了解决上述情况,redis就引入了“内存淘汰策略”。

主要有以下几种:

Redis 也提供了内置的淘汰策略, 也可以供我们直接使⽤:

整体来说 Redis 提供的策略和我们上述介绍的通⽤策略是基本⼀致的。只不过 Redis 这⾥会针对 "过期key" 和 "全部 key" 做分别处理。

缓存使用注意事项

缓存预热

缓存中的数据,定期生成不涉及“预热”。

在实时生成时,redis服务器首次接入之后,服务器里时没有数据的。客户端先查询redis,如果没查到,就再查一次mysql,查到了之后,会把数据也写到redis中。

此时,所有的请求都会打给mysql,随着时间的推移,redis上的数据越积累越多,mysql承担的压力就逐渐减小了。

缓存预热,就是用来解决上述问题的。

定期生成和实时生成,结合一下。即先通过离线的方式,通过一些统计的途径,先把热点数据找到一批,导入到redis中。此时导入的热点数据,就能帮mysql承担很大的压力了。随着时间的推移,逐渐就使用新的热点数据淘汰掉旧的数据。

缓存穿透

查询到的某个key,在redis中没有,mysql中也没有。这个key肯定也不会被更新到redis中。如果像这样的数据存在很多,并且还反复查询,一样也会给mysql带来很大的压力。这种情况称为 缓存穿透。

为何会产生这样的现象?

如何解决这种现象?

1)如果发现这个key,在redis和mysql上都不存在,仍然写入redis中,value设置成一个非法值(比如"")

2)引入布隆过滤器,每次查询redis/mysql之前都判定一下key是否在布隆过滤器上存在。(把所有的key都插入到布隆过滤器中)

布隆过滤器:本质上是结合了hash+bitmap,以比较小的空间开销,比较快的时间速度,实现针对key是否存在的判定。

缓存雪崩

由于在短时间内,redis上大规模的key失效,导致缓存命中率陡然下降,并且mysql的压力迅速上升,甚至直接宕机。

为何产生?

1)redis直接挂了。redis宕机/redis集群模式下大量节点宕机。

2)redis没问题,但是可能之前短时间内设置了很多key给redis,并且设置的过期时间是相同的。(给redis里设置key作为缓存的时候,有时为了考虑缓存的时效性,就会设置过期时间)

如何解决?

1)加强监控报警,加强redis集群可用性的保证。

2)不给key设置过期时间/设置过期时间的时候添加随机的因子(避免同一时刻过期)

缓存击穿

相当于缓存雪崩的特殊情况。针对热点 key , 突然过期了, 导致⼤量的请求直接访问到数据库上, 甚⾄引起数据库宕机。热点key访问的频率高,比缓存雪崩影响更大。

如何解决?

1)基于统计的⽅式发现热点 key, 并设置永不过期。往往需要服务器结构做出较大的调整。

2)进行必要的服务降级,在特定的情况下适当的关闭一些不重要的功能,只保留核心功能。例如访问数据库的时候使用分布式锁,限制同时请求数据库的并发数。

以上,关于redis的缓存,希望对你有所帮助。

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

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

相关文章

初始操作系统---Linux

目录 前言: 硬件层是软件层设计的基石(冯诺依曼体系结构): 冯诺依曼体系结构: 整个系统的运行效率 存储分级的概念 感性的理解数据的流动: 初始操作系统: 本质: 操作系统存在的必要性: 进程(系统里的任务): 操作系统创建进程的方式: 一些内容补充: 系统调用: 小结: 前…

<项目> 主从Reactor模型的高并发服务器

目录 Reactor 概念 分类 单Reactor单线程 单Reactor多线程 多Reactor多线程 项目介绍 项目规划 模块关系 实现 TimerWheel -- 时间轮定时器 定时器系统调用 时间轮设计 通用类型Any Buffer Socket Channel Poller EventLoop(核心) eventfd 设计思路 …

游戏引擎学习第173天

今天的总结和计划 今天我们将继续昨天和前几天的工作,基本上已经完成了字体支持的功能,我们成功地把字体功能加入了游戏中,包括字距调整等基本功能。然而,我觉得整体还没有完全完成,感觉还有一些地方没有完全打理好&a…

Linux安装go环境

安装一个lazydocker,根据文档需要先安装go环境 https://github.com/jesseduffield/lazydocker 官方文档解析 https://go.dev/doc/install 文档内容如下,一共三步 1.删除先前安装的go,解压下载的go压缩包到/usr/local目录 2.添加环境变量&…

React如何导入md5,把密码password进行md5加密

在 React 项目里对密码进行 MD5 加密,你可以借助 crypto-js 库,它提供了 MD5 加密功能。以下是详细步骤: 1. 安装 crypto-js 库 在项目根目录下,通过以下命令来安装 crypto-js : npm install crypto-js 2. 在 Reac…

【ES】Elasticsearch学习

文章目录 简单的安装 简单的安装 参考:https://blog.csdn.net/smilehappiness/article/details/118466378 官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html 下载:https://www.elastic.co/cn/downloads/e…

Cool Request:可以统计任意方法耗时

什么是Cool Request Cool Request是一个IDEA中的接口调试插件,除了可以发起基本的HTTP请求之外,还提供了强大的反射调用能力,可以绕过拦截器,这点广受网友的好评,当然伴随着还有Spring中对Scheduled注解的调用&#x…

dfs(二十二)78. 子集

78. 子集 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 (幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1,2]…

什么是TCP,UDP,MQTT?

以下内容来源于抖音,作者织点代码,读者根据文章内容以及相应论文添加自己的理解进行注释。 计算机之间怎么通信? 彼此之间用网线连接在一起就可以了 但是这样子太麻烦了,成本太高,操作也麻烦 集线器 于是我们可以把线拧在一起 而拧在一起的这个设备,就是集线器 但集线…

计算机操作系统(三) 操作系统的特性、运行环境与核心功能(附带图谱更好对比理解))

计算机操作系统(三) 操作系统的特性、运行环境与核心功能 前言一、操作系统的基本特性1.1 并发1.2 共享1.3 虚拟1.4 异步 二、操作系统的运行环境2.1 硬件支持2.2 操作系统内核2.3 处理机的双重工作模式2.4 中断与异常 三、操作系统的主要功能3.1 处理机…

k8s搭建kube-prometheus

后续再补一个k8s集群搭建的博客,从0开始搭建k8s集群。使用kube-prometheus非常方便,主要问题只在于拉取镜像。除了拉取镜像外其他时间5分钟即可。耐心等待拉取镜像。 一.kube-prometheus简介 kube-prometheus 是一个专为 Kubernetes 设计的开源监控解决…

QT网页显示的几种方法及对比

一.直接跳转打开网页 1.使用QDesktopServices::openUrl调用系统浏览器 原理:直接调用操作系统默认浏览器打开指定URL,不在应用程序内嵌入网页。 优点: 实现简单,无需额外模块或依赖。 适用于仅需跳转外部浏览器的场景。 缺点&…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式(抽象类使用场景) 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法,需要声明,但是又不确定如何实现时&#xff…

Python数据可视化工具:六西格玛及其基础工具概览

在当今数据驱动的时代,数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛(Six Sigma)作为一种以数据为基础、追求完美质量的管理理念,其实施依赖于一系列基础工具的灵活运用。而Python,凭借其强…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!(),默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate,将 Panic 信息打…

网络编程中客户端与服务器的搭建与协议包应用

1.客户端的搭建 2.服务器搭建 3.TCP中的粘包现象 tcp协议为了提高发送的效率,会将短时间连续发送的小数据,当做一组数据统一发送 原理是: tcp协议本身存在一个1500字节的缓存区,tcp协议每次write发送数据的时候,总是…

微博ip属地不发微博会不会变

随着社交媒体的普及,微博作为其中的佼佼者,一直备受关注。而且微博上线了显示用户IP属地的功能,这一功能旨在减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为,确保传播内容的真实性和透明度。然而,这也引发了一些…

【初探数据结构】树与二叉树

💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习! 👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对数据结构感…

Neo4j GDS(Graph Data Science)库安装(Mac版)

Neo4j GDS(Graph Data Science)库安装(Mac版) Neo4j GDS库安装(Mac版) Neo4j GDS(Graph Data Science)库安装(Mac版)前言GDS(Graph Data Science&…

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期,DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS),使得文件系统这一有着 70 多年历时的“古老”的技术,又获得了各方的关注。在 AI 业务中,企业需要处理大量的文本、图像、视频等非结构化数据,还需要应对…