Redis---------实现更改数据业务,包括缓存更新,缓存穿透雪崩击穿的处理

 三种更新策略

0f2779723b364640ba1450f38e64e067.png

 内存淘汰是Redis内存的自动操作,当内存快满了就会触发内存淘汰。超时剔除则是在存储Redis时加上其有限期(expire),有限期一过就会自动删除掉。而主动更新则是自己编写代码去保持更新,所以接下来研究主动更新策略。

  主动更新策略

de7a52e30acc4b0380ba0e97ebba5418.png

908c99f0ca134e8baed5c50b108793b1.png

 结论:从上面可以得知我们一般是要删除缓存而不是更新

a58846b201a44512ad30205837584af1.png

 结论:从上面得知我们是要先操作数据库再操作缓存

总结主动更新策略的读写操作:

c27a687d44c940f798792f58197345e8.png

 代码实现:

    @Override@Transactional//加注解实现事务的原子性public Result updatesh(Shop shop) {Long id = shop.getId();if(id == null){return Result.fail("id错误!");}//1,先更新数据库updateById(shop);//2,删除缓存stringRedisTemplate.delete(CACHE_SHOP_KEY + "id");return Result.ok();}

 三种缓存的问题: 

缓存穿透

 请求的数据既不在Redis中也不在数据库中,导致每次请求都会打到数据库,例如id=-1

                           214c7cb9c8bb4f64bbc248ccb879a155.png

 解决的方法:①缓存空对象,把这个攻击的请求给一个NULL对象存到缓存中并设置TTL,使下次攻击命中②布隆过滤器,以位图来表示数据是否存在,如果存在就放行,否则直接拒绝访问,但是准确性不能保证

5cfd2accd1bf42d687b8e4f519191c66.png

缓存雪崩

大量的Redis缓存同时失效或者Redis服务器宕机,导致大量的请求打到数据库

        2294e16f560e4209819628a5c3b95d9c.png

解决的方法:①存缓存的时候使用随机的TTL有效期②利用Redis集群提高高可用性③给业务添加多级缓存,使用nginx缓存 + redis缓存 + 其他缓存,不同层使用不同的缓存,可靠性更强,去缓解Redis宕机带来的后果

缓存击穿

缓存击穿问题也叫热点key问题,缓存的热点key失效,导致大量的请求该热点的访问全部都打到数据库

cbdf880142c440179c8341857471ca14.png

解决的方法:①互斥锁,多个线程进行查询都会进行Redis重构,导致性能大大降低,所以使用锁机制,只有一个线程获得锁,并且完成Redis重构,其他的线程在此时间内进行等待②逻辑过期,即久缓存,存进Redis中不设置TTL过期时间,而是以逻辑时间来标识

463d4673a8ae44598a134e05c7011f24.png

互斥锁解决缓存击穿的思路:获得锁与释放锁的操作通过Redis中的setnx来实现,只有该键不存在的时候才可以获得锁,该键存在即表示有线程在操作Redis重构。

12fa43a9ee934333bdffa79c35939b5d.png

                      099933873099449096efd8a7dc8b6692.png

 逻辑过期解决缓存击穿的思路:设置一个字段表示其逻辑过期时间存在Redis中,而数据是不加TTL的,当我们去查询Redis时就判断这个逻辑字段是否过期,然后再进行返回或者重构操作

4508e487a19b4c32a71a98d1b4b67fd4.png

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

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

相关文章

【数据结构(邓俊辉)学习笔记】向量06——位图

文章目录 0.概述1.结构2.实现3. 应用3.1 去重3.2 筛法 0.概述 位图(Bitmap)是一种特殊的序列结构,可用以动态地表示由一组(无符号)整数构成的集合。 test() 判断k 是否存在集合S中。set() 将k 加入到集合S中。clear…

每日OJ题_贪心算法二④_力扣2418. 按身高排序

目录 力扣2418. 按身高排序 解析代码 力扣2418. 按身高排序 2418. 按身高排序 难度 简单 给你一个字符串数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个…

【Unity】在空物体上实现 IPointerClickHandler 不起作用

感谢Unity接口IPointerClickHandler使用说明_哔哩哔哩_bilibiliUnity接口IPointerClickHandler使用说明, 视频播放量 197、弹幕量 0、点赞数 3、投硬币枚数 2、收藏人数 2、转发人数 0, 视频作者 游戏创作大陆, 作者简介 ,相关视频:在Unity多场景同时编辑…

京东初级运营必修课程,从零开始学习(49节课)

课程内容: 01.1.全面解析店铺后台的各项功能 02.2.商品要素的重要性及如何打造黄金标题 03.3.手把手带你完成商品上架 04.4.为啥你的流量不转化-诸葛 05.5.怎么策划一张高点击率的照片 06.6.内功优化之数据化标题创建 07.7.内功优化之如何高转化活动落地页 …

node应用部署运行案例

生产环境: 系统:linux centos 7.9 node版本:v16.14.0 npm版本:8.3.1 node应用程序结构 [rootRainYun-Q7c3pCXM wiki]# dir assets config.yml data LICENSE node_modules nohup.out output.log package.json server wiki.log [rootRainYun-Q7c…

SpringBoot集成Log2j4指定外部配置文件源码解读

一、背景 程序读取外部log4j2.xml配置文件方式为启动命令添加了--logging.config/path/log4j2.xml,因系统安全整改,将/var/log/目录改为了700,程序使用非root启动时log4j2报错无法在/var/log目录下创建日志文件。经排查发现jar包的classpath…

python的self类

在Python的类(class)定义中,self 是一个变量名,它代表实例本身。在类定义的方法中,self 总是作为第一个参数,并且这是一个约定俗成的用法。通过 self,你可以访问和操作类的属性(vari…

Nacos如何支持服务发现和注册?

Nacos如何支持服务发现和注册 在微服务架构的浪潮中,服务发现和注册成为了支撑整个架构稳定运行的关键技术之一。而Nacos,作为阿里巴巴开源的一个动态服务发现、配置管理和服务管理平台,凭借其简单易用、功能强大的特性,受到了广…

我的创作纪念日—128天的坚持|分享|成长

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

C++进阶-----继承

1、继承的概念和定义 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象 程序设计的层次结构&#xf…

Docker-Compose概述与简单编排部署

目录 前言 一、Docker-Compose 概述 1、Docker-Compose 概念 2、Docker-Compose 优缺点 2.1 Docker-Compose 优点 2.2 Docker-Compose 缺点 3、Docker-Compose与Docker-Swarm的区别 二、两大文件格式 1、YAML 文件格式 2、JOSON 文件格式 3、YAML 与 JOSON 格式的区…

用Rust编写Python扩展

一、用Rust编写Python扩展 用Rust编写Python扩展是完全可行的,并且近年来变得越来越流行。Rust是一种内存安全的语言,它提供了与C语言类似的底层访问能力,但具有更强大的内存安全和并发特性。 为了使用Rust编写Python扩展,你可以…

全志ARM-蜂鸣器

sh操作准备: 1.使Tab键的缩进和批量对齐为4格 在/etc/vim/vimrc 中添加一项配置 set tabstop 4; 也可以再加一行 set nu显示代码的行数 vim的设置,修改/etc/vim/vimrc文件,需要用超级用户权限 /etc/vim/vimrc set shiftwidth4 设置批量…

【刷题篇】动态规划-二维费用的背包问题(十二)

文章目录 1、一和零2、盈利计划3、组合总和 Ⅳ4、不同的二叉搜索树(卡特兰数) 1、一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#x…

IC 卡技术在生活中的应用

在现代科技高速发展的时代,IC 卡技术已经深入到我们生活的各个角落。它以其便捷、高效和安全的特点,为我们的生活带来了诸多便利。 IC 卡广泛应用于公共交通领域,让我们的出行变得更加顺畅。使用公交卡,只需轻轻一刷&#…

vue3 + ts 快速入门(全)

文章目录 学习链接1. Vue3简介1.1. 性能的提升1.2.源码的升级1.3. 拥抱TypeScript1.4. 新的特性 2. 创建Vue3工程2.1. 基于 vue-cli 创建2.2. 基于 vite 创建(推荐)vite介绍创建步骤项目结构安装插件项目结构总结 2.3. 一个简单的效果Person.vueApp.vue …

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路,分别为5路呼叫显示电路和8路抢答器电路,包含Multisim仿真原文件,为掌握FPGA做个铺垫。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 一、5路呼叫显…

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置: 与LINUX传统IPC对比

【迅投qmt系列】4、获取数据的方式

获取数据是进行策略回测、实时执行的前提,不同的场景下,有相对合适的数据获取方式。 1、只取历史数据 这个场景的内容一般是将历史数据下载下来后,再将数据用于其他用途。因为对效率没有多少要求,代码最简单,它将qmt…

【数学】高斯-约旦消元

前置知识 高斯消元 高斯-约旦消元 和高斯消元一样,高斯-约旦消元也是通过加减消元来化简方程。两者之间的不同在于,高斯-约旦消元会将系数矩阵消成形如 A ′ [ a 1 , 1 ′ b 1 ′ a 2 , 2 ′ b 2 ′ ⋱ ⋮ a n , n ′ b n ′ ] A\begin{bmatrix}a_{1…