Redis使用场景

news/2024/9/20 12:00:07/文章来源:https://www.cnblogs.com/PandaVerse/p/18399430

Redis使用场景

目录

缓存

  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩
  • 双写一致性
  • 持久化
  • 数据过期策略
  • 数据淘汰策略

分布式锁

  • 实现原理(setnx、redission)

其他

  • 哨兵模式、集群脑裂
  • 分片集群、数据读取规则
  • redis是单线程的却很快

缓存

一、缓存穿透

定义:查询一个不存在的数据,Mysql查询不到数据也不会直接写入缓存,导致每次请求都要查数据库

两个解决方案:

  1. 缓存空数据
    优点:简单
    缺点:消耗内存,可能发生不一致问题

  2. 使用布隆过滤器(作用:拦截不存在的数据)
    优点:内存占用较少
    缺点:实现复杂,存在误判

举例说明:根据文章id查询文章,请求路径如下:
一个get请求: api/enws/getById/1

正常缓存流程:根据id到redis中爬取数据,若找到数据则返回结果;若redis中未找到,再到数据库中查找,将结果返回,返回前需将数据库中查到的数据存储于redis中

缓存穿透是查询一个不存在的数据,Mysql查询不到数据也不会直接写入缓存,导致每次请求都要查数据库。导致这种情况一般是由于系统被恶意攻击,请求路径被获取后制造假id(0、复数、很大的值),疯狂冲击数据库,数据库并发并不高,请求达到一定量就会造成宕机

关于布隆过滤器

二、缓存击穿

定义:给某个key设置过期时间,当key过期时,刚好这个时间点key有大量的并发请求,这些并发请求可能瞬间把DB压垮。

虽然我们再查询时把数据同步到redis,但可能在缓存重建时,存入的是多个表汇总的结果,可能需要分组统计花费较长的时间,比如花费了50毫秒,这时若有大量请求数据库是承受不住的。

两个解决方案:

  1. 互斥锁
  2. 逻辑过期

互斥锁:强一致性、性能差
比如:跟钱相关的业务需要保证强一致性
互斥锁文字描述:线程1请求查询,在redis中未查询到缓存数据,于是获取互斥锁,查询数据库重建缓存数据,写入缓存,释放锁;线程1进行的同时线程2也请求查询未命中,于是获取互斥锁但失败了,只能休眠会再一直重试到缓存命中。
互斥锁的作用:确保任意时刻只有一个线程可以访问共享资源,从而避免数据竞争和不一致问题。

逻辑过期:高可用、性能优
比如:互联网行业,更加注重用户体验
逻辑过期文字描述:线程1查询缓存,发现逻辑时间已过期,获取互斥锁后,开启新线程2查询数据库重建缓存数据、写入缓存并重置逻辑过期时间、释放锁,同时线程1中继续并返回过期数据。线程1进行的同时线程3也查询发现逻辑时间过期,获取互斥锁失败后返回过期数据。当线程4命中缓存并没有过期,就可以获得最新查询数据了。

三、缓存雪崩

定义:指同一时段大量缓存key同时失效或Redis服务宕机,导致大量请求达到数据库造成巨大压力。

解决方案

  1. 给不同key的TTL添加随机值(给不同key设置不同的过期时间)
  2. 利用redis集群服务的可用性,比如哨兵模式、集群模式(解决redis宕机问题)
  3. 给缓存业务添加降级限流策略,例如ngxin、spring cloud gateway
  4. 给业务添加多级缓存,例如Guava、Caffeine

降级可作为系统的保底策略,适用于穿透、击穿、雪崩

四、双写一致性

定义:当修改了数据库数据也要更新缓存的数据,保持缓存和数据库的数据一致

  • 读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间
  • 写操作:延迟双删

先删除缓存,还是先修改数据库?

先删除缓存,再修改数据库

  • 正常情况:

  • 出现脏数据情况:

修改数据库数据前被其他线程写入缓存,导致缓存与数据库数据不一致

先修改操作数据库,再删除缓存

  • 正常情况:

  • 出现脏数据情况:

线程1得到的返回的结果写入缓存,与线程2更新的数据库数据对不上

所以不管先删除缓存,还是先修改数据库都会出现脏数据,应该采取延迟双删的方法,即删除两次缓存,可以降低脏数据的出现。延迟删除是因为数据库是主存模式,延迟删除让主节点把数据同步到从节点,但延迟删除也只是控制了一部分脏数据的风险,由于延迟时间不好确认,也有脏数据的风险,做不到绝对的强一至。

如何保持强一致性?

  1. 可以采用分布式锁(互斥锁)

强一致,性能低

一般存入缓存的数据都是读多写少,用读写锁来进行控制

  • 共享锁:加锁后其他线程可以共享读操作
  • 排他锁:加锁后阻塞其他线程读写操作

具体代码操作:

  • 读操作
  • 写操作
  1. 异步通知保证数据的最终一致性

利用异步通知解决数据同步问题

  • MQ

  • canal

它是基于mysql的主从同步实现
当有数据修改写入数据库后,数据库一旦变化就会记录到BINLOG日志文件中,cannal通过binlog数据文件获取变化,我们就可以在缓存服务获取变化的数据,然后更新到缓存

五、持久化

两种方式:RDB、AOF

  1. RDB(redis数据备份文件,也叫数据快照)

将内存中的数据存到磁盘中,当redis实例故障重启后,从磁盘读取快照文件,恢复数据

人工主动备份:

redis内部有触发RBG的机制,可以在redis.conf文件中找到

  1. AOF(追加文件,redis处理的每一个命令都记录在AOF文件,可看作是命令日志文件)

六、数据过期策略

Redis过期删除策略:惰性删除 + 定期删除两种策略配合使用

  1. 惰性删除

定义:访问key时再判断是否过期,过期则删除,反之返回key

优点:对CPU友好
缺点:对内存不友好

  1. 定期删除

定义:每隔一段时间,会从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key(随之时间推一会遍历所有key,把所有过期key删除)

  • 定期删除分两种模式:SLOW、FAST

SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整次数

FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不好过1ms

优点:可通过限制删除操作执行时长和频率减少删除操作对CPU的影响,另外定期删除能有效释放过期键占用的内存
缺点:难以确定删除操作执行的时长和频率

七、数据淘汰策略

定义:当redis内存不足想添加新key,会按照某种规则将内存数据删除,这种数据删除规则被成为内存的淘汰策略

  • redis支持8中不同策略来选择删除key
  1. noeviction:不淘汰任何key,但内存满不语序写入新数据,默认策略

使用建议

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

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

相关文章

flutter 的一些概念三

介绍一些Fluter面试中可能会遇到的一些非项目相关的概率名词,像stream与future的关系,platformView是什么本文同步发布于公众号:stringwu的互联网杂谈:flutter 的一些概念三 1 Stream 与 Future的关系 Stream 和 Future 都是 Flutter 中常用的异步编程模型,Future 适用于一次…

使用css和html初步搭建页面

由于很多html标签在博客中会生效,所以我有时候会简写 1.html分为头部head和body.头部中定义标题title2.设置标题使用h1,共有六级为h1~h6.想要设置标题具体颜色要使用css,的style,有三种方式 (1)h1 color:(2)写一个外部css文件(3)使用设置.同时使用元素选择,ID选择,类选择可以单…

通义灵码助力高校开学第一课,“包”你满意,新学期加油!

通义灵码作为国内领先的 AI 编码工具,近年来在高校中得到了广泛应用和推广。它不仅帮助大学生更高效地学习编程、提高代码质量,还激发了他们的创新思维,并为未来的职业生涯做好了准备。通义灵码作为国内领先的 AI 编码工具,近年来在高校中得到了广泛应用和推广。它不仅帮助…

第十三讲:count()这么慢,我该怎么办?

第十三讲:count(*)这么慢,我该怎么办? 简概:count(*) 的实现方式 ​ 你首先要明确的是,在不同的 MySQL 引擎中,count() 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count() 的时候会直接返回这个数,效率很高; 而 InnoDB 引擎就麻烦了,它执…

C# Winform 打安装包

开发好一款Winform程序,往往都是直接拉Debug文件里的内容,直接运行。这样直接给客户,或者打个简易的压缩包。视觉上觉得很low,客户也觉得价不配位。因此这个5毛钱的特效还是要加上,毕竟几十万的项目款都付了。提升一下软件的B格,让客户觉得物有所值。 一、下载安装扩展程…

解压zip文件或者安装软件出现 无法成功完成操作 解决方案

近期, 有一些朋友反馈在解压zip压缩包, 或者在安装软件的过程中出现了下面的错误提示: "无法成功完成操作, 因为文件包含病毒或者潜在垃圾文件" "Operation did not complete successfully because the file contains a virus or potentially unwanted software…

Windows10添加鼠标右键打开

1打开注册表2.进入目录计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\,新建项,2.1继续新建子项,重命名为command2.2修改子项中的默认,添加路径结果:ps: 可以重命名。在第一个新建项中新建“字符串值”,重命名为“ICON”可以设置图标。效果图:

2024 天池云原生编程挑战赛决赛名单公布,9 月 20 日开启终极答辩

2024 天池云原生编程挑战赛决赛名单公布,9 月 20 日开启终极答辩历时 4 个月,2024 天池云原生编程挑战赛决赛名单公布! 本届大赛规模创新高,参赛战队达 20000+ 支, 广覆盖国内外优秀高校和杰出企业!吸引了来自北京大学、清华大学等 176 所国内外优秀高校,以及美团、米哈…

Linux救援模式

故障背景:误删除或修改/etc/passwd导致无法远程登录. 禁止root远程登录,没有添加普通用户,无法远程登录. root密码忘记,无法远程登录. linux无法启动1.解决方案 root密码,恢复有备份的系统文件,都要重启系统,才能进入救援模式解决方案应用场景系统自带的救援模式系统还可以正常…

API 网关 OpenID Connect 实战:单点登录(SSO)如此简单

本文对 Higress 中开源的 OIDC Wasm 插件进行了介绍,现在 Higress 项目中 Wasm 插件支持使用 Go、C++、Rust、AssemblyScript 等语言编写,后续会支持更多的编程语言,有着更低的开发门槛,同时 Wasm 插件运行在隔离的沙箱环境中,具有更高的安全性,而 Wasm 本身作为一种高性…

在全连接层中进行批量数据并行执行

在全连接层中进行批量数据并行执行 在全连接网络中,为了增加并发性并减少权重的负载,可以同时处理一批图像(来自多个视频通道),如图11-31所示。图11-31 增加并发性并减少权重的负载,可以同时处理一批图像 11.2.6 特征缓存 在流处理中,对输入和结果使用双缓冲区。对于下一…