当前位置: 首页 > news >正文

使用Redis实现缓存及对应问题解决

一、为什么需要Redis作缓存?

在业务场景中,如果有些数据需要极高频的存取,每次都要在mysql中查询的话代价太大,假如有一个存在于客户端和mysql之间的存储空间,每次可以在这空间中进行存取操作,就会减轻mysql的压力,而redis速度快效率高的特点是实现缓存的好选择。
在这里插入图片描述
在没有加入缓存的时候,客户端和服务端的工作流程如图所示
在这里插入图片描述
加入缓存之后, 在每次查询数据的时候,先在redis中查询,如果有就直接返回,如果没有再去mysql中查询,在mysql中查询到之后先写入到redis中,在返回给客户端。

二、实现加入缓存。

在这里插入图片描述

三、缓存的更新策略。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

先删除缓存,在更新数据库

在这里插入图片描述
假如在最开始的时候,缓存中和数据库中的值都是10,在正常的操作流程下,会得到如下的结果。
在这里插入图片描述
但是在特殊情况下,如果在线程一执行的时候,线程二插入进来,就会造成下图的情况。
在这里插入图片描述
而这种情况发生的概率还是很高的,因为更新数据库的操作还是相对于写入缓存来说是很慢的,在这个过程中,极有可能发生这种情况。

先操作数据库,在删除缓存

在这里插入图片描述
在正常的情况下,发生的是如下的操作
在这里插入图片描述
这种情况的特殊情况是:当缓存中的值失效,缓存中没有值,数据库中的值还是10,会发生下面这种情况。
在这里插入图片描述

但是这种情况的概率是小于前者的,因为写入缓存的时间明显是小于更新数据库的时间的,在这么短的时间内,发生更新数据库的操作的概率是很小的。
综上所述,应该先操作数据库再删除缓存。

四、缓存穿透。

缓存穿透指的是客户端请求的数据在缓存中和数据库都不存在,这样的缓存永远不会生效,这些请求都会打到数据库。
在这里插入图片描述
短期不一致的原因:当查询时没有的id以null存入到redis中,假如这时候真正的相同id存入到了数据库,在查询时就只能查询到redis中的null值,直到TTL过期,解决办法是可以手动的在数据库新增的值更新放入redis中。
在这里插入图片描述
布隆过滤器是一种基于哈希的算法,将二进制存入到布隆过滤器中,但它只是一种概率过率,他告诉你不存在的时候一定不存在,但是当告诉你存在时,却不一定存在。
在这里插入图片描述
要解决缓存穿透,业务逻辑就会变成这个样子。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

五、缓存雪崩。

缓存雪崩是指在同一时段大量的缓存key同时失效或者redis服务宕机,导致大量的请求到达数据库,带来巨大压力。

在这里插入图片描述

六、缓存击穿。

在这里插入图片描述

缓存击穿实现不用考虑缓存击穿的问题
在这里插入图片描述
在这里插入图片描述
互斥锁
在这里插入图片描述
获取锁和释放锁的逻辑代码实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
因为就算抛异常也要释放锁,所以把释放锁的代码放在finally中。
在这里插入图片描述

逻辑过期实现

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/223567.html

相关文章:

  • 【穿透科技】P2P穿透模块介绍
  • 中国第二批,11个大模型备案获批
  • 一文搞定多端开发,做全栈大牛 附三大企业实战项目
  • 带有滑动菜单指示器的纯 CSS 导航选项卡
  • Java学习笔记41——接口组成更新
  • iview实现table里面每行数据的跳转
  • Docker快速搭建Drupal内容管理系统并远程访问
  • Ansible优化大全
  • Python|OpenCV-图像的添加和混合操作(8)
  • Vue3+vite+cesium环境搭建
  • metaObjecthandler 的基本理解与使用(自动插入更新人和创建人)
  • SpringBoot与ES7实现多条件搜索
  • 【排序算法】 快速排序(快排)!图解+实现详解!
  • 急招开发、安全工程师实习生
  • 数据结构与算法—插入排序选择排序
  • 基于词云图的短信热词数据可视化
  • Linux/centos上如何配置管理Web服务器?
  • Java EE进阶2
  • 最新AI系统ChatGPT源码+AI绘画系统源码+支持GPT4.0+Midjourney绘画+搭建部署教程+附源码
  • 大厂面试题-为什么一线互联网公司严禁使用存储过程
  • SpringBoot+Swagger详细使用方法
  • [动态规划] (十二) 简单多状态 LeetCode 213.打家劫舍II
  • 算法与数据结构之链表
  • 深入剖析React Hooks中的 useCallback
  • 微服务中配置文件(YAML文件)和项目依赖(POM文件)的区别与联系
  • Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]
  • 【React】05.JSX语法使用上的细节
  • LeetCode 1759. 统计同质子字符串的数目【字符串】1490
  • FPGA UDP RGMII 千兆以太网(2)IDDR
  • chrome安装vue devtools