redis 常见问题分析

目录

redis 使用分析

一、redis 双写一致性分析

常见方式

1、先写数据库,后写缓存

2、先写数据库,后删缓存

3、先删缓存,再写数据库

4、延迟双删

二、redis 常见异常分析

一、缓存穿透

1、概念

2、解决方案

二、缓存雪崩

1、概念

2、解决方案


redis 使用分析

redis 使用场景:
1、配置文件,数据文件加载
2、web场景中的web页面缓存
3、业务场景中例如短信验证码等
4、可以做消息队列服务器使用,redis 5.0支持

一、redis 双写一致性分析

在数据做出修改时,应当先修改redis数据,还是先修改mysql数据? 在原有集合数据进行增减操作时,无操作顺序要求,redis和mysql的数据是一致的,在数据覆盖时,如果选择了错误的修改顺序,那么,redis和数据库mysql数据结果不一致

常见方式

1、先写数据库,后写缓存
并发,多线程下,可能存在一下问题:
1、数据覆盖操作,如果不按照顺序执行,数据结果不一致
2、数据库更新成功,缓存更新失败,数据结果不一致
​
可以在此键加上缓存时间,但是缓存生效期间,数据不一致
2、先写数据库,后删缓存

删除数据的原因很简单,VO|BO数据,是来自多表计算得出,属于聚合数据,无法直接更新缓存,只能删除缓存后,得到最新数据。

PO 数据库行级数据,可以直接写入redis VO 视图对象 BO 业务对象

并发,多线程下,可能存在一下问题:
数据库更新成功,缓存删除失败,数据结果不一致
3、先删缓存,再写数据库

LRU(The Least Recently Used,最近最久未使用算法):如果一个数据在最近一段时间没有被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最久没有访问的数据最先被置换(淘汰)。 LFU(Least Frequently Used ,最近最少使用算法):如果一个数据在最近一段时间很少被访问到,那么可以认为在将来它被访问的可能性也很小。因此,当空间满时,最小频率访问的数据最先被淘汰。

并发,多线程下,可能存在一下问题:
准备更新数据库时,缓存中的key不存在或已经被LRU和LFU淘汰,已经从旧数据中重新读取,数据结果不一致
4、延迟双删
在修改数据库数据前,需要先删除一次redis:此时是为了保证在数据库数据修改和redis数据被删除的间隔时间内,如有命中,保证此数据也不存在redis中。如果没有这一次删除,当数据库数据已经被修改了,但是还是可以从redis中读出旧数据,导致数据不一致。
第二次删除则是在修改数据库数据后,此时需要再次删除redis中对应数据一次,这一次是为了删除 第一次redis删除和数据库数据修改之间,如果有请求,那么旧数据又会重新缓存到redis中,然而数据在数据库中在接下来就会被修改,如果没有这一次删除,redis中则会存在数据库中旧的数据。
那么第二次为什么需要在数据库修改后延迟一定时间再删除redis呢?
为了等待之前的一次读取数据库,并等待其数据写入到缓存,最后删除这次脏数据,所以是一次数据从数据库中发到服务器+缓存写入的时间

二、redis 常见异常分析

一、缓存穿透

1、概念

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

为了避免缓存穿透其实有很多种解决方案。下面介绍几种。

2、解决方案

(1)布隆过滤器

布隆过滤器是一种数据结构,垃圾网站和正常网站加起来全世界至少也有几十亿个。网警要过滤这些垃圾网站,总不能到数据库里面一个一个去比较吧,这就可以使用布隆过滤器。假设我们存储一亿个垃圾网站地址。

可以先有一亿个二进制比特,然后网警用八个不同的随机数产生器(F1,F2, …,F8) 产生八个信息指纹(f1, f2, …, f8)。接下来用一个随机数产生器把这八个信息指纹映射到 1 到1亿中的八个自然数 g1, g2, …,g8。最后把这八个位置的二进制全部设置为一。过程如下:

有一天网警查到了一个可疑的网站,想判断一下是否是XX网站,首先将可疑网站通过哈希映射到1亿个比特数组上的8个点。如果8个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。

那这个布隆过滤器是如何解决redis中的缓存穿透呢?很简单首先也是对所有可能查询的参数以hash形式存储,当用户想要查询的时候,使用布隆过滤器发现不在集合中,就直接丢弃,不再对持久层查询。

这个形式很简单。

(2)、缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;

但是这种方法会存在两个问题:

如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

二、缓存雪崩

1、概念

缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

2、解决方案

(1)redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。

(2)限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

(3)数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自媒体原创改写工具,自媒体首发改写软件

自媒体平台已成为许多创作者表达观点、分享知识和积累影响力的关键渠道。创作是需要技巧和经验的。本文将分享一些自媒体文章改写技巧,并推荐一系列优秀的自媒体文章改写工具,帮助您提升创作效率,创作出更优秀的文章。 自媒体文章改写技巧 …

浅谈档案管理与档案数据挖掘应用

一、当前常见档案及其管理方式 一般,档案是指人们在各项社会活动中直接形成的各种形式的具有保存价值的原始记录。原始记录性是它的本质属性。随着社会发展及数字技术的发展,产生了电子档案,是档案领域最剧烈的一次变革,它直接影…

ssrf介绍、相关php函数及demo演示

SSRF系列 危害(利用) 漏洞判断 回显 延时 DNS请求 相关函数

汽车后服务行业汽美汽修店小程序作用如何

汽车后服务行业包括汽美、汽修等多种门店类型,如今家庭拥车量平均数非常高,这意味着后服务市场商家只要服务好、质量佳、具备一定引流转化方式,就能获得生意。 然而传统门店在近些年生意也不好做,自然流量减少、同行竞争压力等&a…

极狐gitlab ci job拉取代码之前执行命令

有时候我们希望可以在检索 Git 代码库和任何 submodules 之前执行一下命令操作,接下来为大家介绍下通过 hooks:pre_get_sources_script 可以满足该场景的使用。 文章目录 1. 开启 feature flag2. 使用方式方式1在 ci job 中定义 hooks.pre_get_sources_script 方式2…

私人收藏的动听音乐

私人收藏的动听音乐 电视剧《装台》大雀去世戏歌《人面桃花》华阴老腔--《将令一声震山川》 电视剧《装台》大雀去世 下载地址:https://raw.githubusercontent.com/omaidb/qiaofei_notes/main/music/%E8%A3%85%E5%8F%B0-%E5%A4%A7%E9%9B%80%E6%AD%BB%E4%BA%A1.m4a 戏…

L1-018:大笨钟

题目描述 微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。不过由于笨钟自己作息也不是很规律,所以敲钟并不定时。一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那个整点数…

达索系统SOLIDWORKS 2024 Simulation新功能

SolidWorks Simulation是什么? SolidWorks Simulation是一个虚拟测试环境,用于分析你的设计,评估其性能并做出决策以提高产品质量。从SolidWorks2009开始,FEA软件COSMOSWorks改名为SolidWorks Simulation。其为了体现设计仿真一体…

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1:解决思路2解决思路3(最终解决方案)后记 bug背景 项目中采用富文本编辑器后传参引起的bug,起因如下: 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1: 使用JSON方…

基于51单片机智能灯设计教室灯路灯设计

**单片机设计介绍,基于51单片机智能灯设计教室灯路灯设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的智能灯设计可以实现很多功能,包括节能、遥控、自动感应等等。下面我会介绍一下如何…

【运筹优化】运筹学导论:求解线性规划问题 - 单纯形法

文章目录 一、单纯形法的实质(几何原理)1.1 示例的求解1.2 关键的解原理1.2.1 解原理11.2.2 解原理21.2.3 解原理31.2.4 解原理41.2.5 解原理51.2.6 解原理6 二、构建单纯形法(代数原理)三、单纯形法的代数形式3.1 初始化3.2 最优…

网件R8500 trojan

一 将路由器刷机成改版梅林 路由器首页的Firmware:380.70_0-X7.9.1是梅林改版 380.xx 梅林原版固件 380.xx_x 梅林改版固件 必须是改版梅林才支持trojan,所以要确保是梅林改版固件 点击上传文件,选择下载好的改版固件,固件地址下载传送门…

TA-Lib学习研究笔记(八)——Momentum Indicators 下

TA-Lib学习研究笔记(八)——Momentum Indicators 下 Momentum Indicators 动量指标,是最重要的股票分析指标,能够通过数据量化分析价格、成交量,预测股票走势和强度,大部分指标都在股票软件中提供。 21. …

使用Plex结合cpolar搭建本地私人媒体站并实现远程访问

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频,已经算是生活中稀松平常的场景了,特别是各…

Angular 由一个bug说起之三:为什么时不时出现额外的水平/垂直滚动条?怎样能更好的防止它的出现?

目录: 什么是单元溢出 控制滚动条出现的属性 怎样能减少意外的滚动条出现 一、什么是单元溢出 在说到这个问题之前我们先简单阐述一下视图窗口(Viewport)和视图内容(View Content) 视图窗口简单来说就是呈现内容的视口,浏览器就是一个窗口&#xff…

【flink番外篇】1、flink的23种常用算子介绍及详细示例(2)- keyby、reduce和Aggregations

Flink 系列文章 1、Flink 专栏等系列综合文章链接 文章目录 Flink 系列文章一、Flink的23种算子说明及示例6、KeyBy7、Reduce8、Aggregations 本文主要介绍Flink 的3种常用的operator(keyby、reduce和Aggregations)及以具体可运行示例进行说明. 如果需要…

【设计模式】职责链模式设计在线文档帮助系统

职责链模式设计在线文档帮助系统 任务三:使用职责链模式设计在线文档帮助系统 某公司欲开发一个软件系统的在线文档帮助系统,用户可以在任何一个查询环境中输入查询关键字,如果当前查询环境下没有相关内容,则系统会将查询按照一定…

Ubuntu22.04 使用Docker部署Neo4j出错 Exited(70)

项目场景: 最近需要使用Neo4j图数据库,因此打算使用docker部署 环境使用WSL Ubuntu22.04 问题描述 拉下最新Neo4j镜像,执行命令部署 启动容器脚本 docker run -d -p 7474:7474 -p 7687:7687 \ --name neo4j \ --env "NEO4J_AUTHneo…

git的安装及ssh配置(Linux)

环境 CentOS Linux release 7.9.2009 (Core) Xftp7 安装 方法一:yum安装 yum是一个客户端软件,就好比手机上的应用商店,帮助我们对软件的下载、安装和卸载 1、首先查看自己是否安装过git [rootxiaoxi ~]# git -bash: git: command not fo…