使用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.mzph.cn/news/133925.shtml

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

相关文章

go程序获取工作目录及可执行程序存放目录的方法-linux

简介 工作目录 通常就是指用户启动应用程序时,用户当时所在的文件夹的绝对路径。 如:root用户登录到linux系统后,一顿cd(change directory)后, 到了/tmp文件夹下。此时,用户要启动某个应用程序&#xff0…

mediapipe流水线分析 二

目标检测 Graph 一 流水线上游输入处理 1 TfLiteConverterCalculator 将输入的数据转换成tensorflow api 支持的Tensor TfLiteTensor 并初始化相关输入输出节点 ,该类的业务主要通过 interpreter std::unique_ptrtflite::Interpreter interpreter_ nullptr; 实现…

Python教程---Python基础语法2

1.变量和字面量(常量) 字面量就是一个一个的值,比如:1,2,3,4,5,6,‘HELLO’ 字面量所表示的意思就是它的字面的值,在程序中可以直接使用字面量 变量(varia…

利用大语言模型(LLM )提高工作效率

日常工作就是面向 google/ 百度编程,除了给变量命名是手动输入,大多时候就是通过搜索引擎拷贝别人的代码,或者找到旧项目一段代码拷贝过来使用。这无疑是开发人员的真实写照;然而,通过搜索引擎搜索答案,无疑…

Go 面向对象,多态

面向对象 工程结构 新建一个oop.go package _oop // Package _oop 引用名称import ("fmt""strconv" )// GIRL 常量 const (// GIRL 自增GIRL Gender iotaFIRSTSECONDTHIRD )type Gender uint8 // 无符号的8位整数类型// User 结构体 type User struct…

Vue 跨域的两种解决方式

一、通过 proxy 解决跨域 1.1 baseURL 配置 对 axios 二次封装时,baseURL 设置为 /api。 const serviceAxios axios.create({baseURL: /api,timeout: 10000, // 请求超时设置withCredentials: false, // 跨域请求是否需要携带 cookie });1.2 vue.config.js 配置…

SQLite 3.44.0 发布!

SQLite 开发团队于 2023 年 11 月 01 日发布了 SQLite 3.44.0 版本,带来了一些 SQL 和优化器增强,本文给大家做一个简要分分析。 新增 concat() 函数 新版本增加了两个连接字符串的函数:concat() 以及 concat_ws()。它们可以兼容 PostgreSQ…

代码冲突解决

远程仓库修改 本地代码修改 接下来我们push一下 如果使用IDE 冲突内容如下: 我们可以使用自带的工具进行修改 我们选择接受自己改动的即可 如果使用git工具怎么去处理呢 远程分支是这样 本地是这样的 add和commit之后,再pull,最后pus…

若依:用sqlite3随便掰饬掰饬

“若依”这个开源项目,感觉是外包公司标配了啊,都在用。从README感觉像是某位阿里员工的工作之余的小整理。对于SprintBoot,个人感觉太重型,不过人家生态起来了,不是那么容易玩完。但是随着VMware被博通收购&#xff0…

关键词搜索亚马逊商品数据接口(标题|主图|SKU|价格|优惠价|掌柜昵称|店铺链接|店铺所在地)

亚马逊提供了API接口来获取商品数据。其中,关键词搜索亚马逊商品接口(item_search-按关键字搜索亚马逊商品接口)可以用于获取按关键字搜索到的商品数据。 通过该接口,您可以使用API Key和API Secret来认证身份,并使用…

BP神经网络的数据分类——语音特征信号分类

大家好,我是带我去滑雪! BP神经网络,也称为反向传播神经网络,是一种常用于分类和回归任务的人工神经网络(ANN)类型。它是一种前馈神经网络,通常包括输入层、一个或多个隐藏层和输出层。BP神经网…

关于iOS:如何使用SwiftUI调整图片大小?

How to resize Image with SwiftUI? 我在Assets.xcassets中拥有很大的形象。 如何使用SwiftUI调整图像大小以缩小图像? 我试图设置框架,但不起作用: 1 2 Image(room.thumbnailImage) .frame(width: 32.0, height: 32.0) 在Image上应用…

浅析刚入门Python初学者的注意事项

文章目录 一、注意你的Python版本1.print()函数2.raw_input()与input()3.比较符号&#xff0c;使用!替换<>4.repr函数5.exec()函数 二、新手常遇到的问题1、如何写多行程序&#xff1f;2、如何执行.py文件&#xff1f;3、and&#xff0c;or&#xff0c;not4、True和False…

Unity项目转微信小游戏保姆教程,繁杂问题解决,及微信小游戏平台简单性能测试

前言 借着某人需求&#xff0c;做了一波简单的技术调研&#xff1a;将Unity项目转换为微信小游戏。 本文主要内容&#xff1a;Unity转换小游戏的步骤&#xff0c;遇到问题的解决方法&#xff0c;以及简单的性能测试对比 微信小游戏的限制 微信小游戏对程序包体大小有严格限制…

Manopt使用

本文记录一些黎曼流型的优化工具箱的使用 入手 安装 https://www.manopt.org/tutorial.html#gettingstarted

JavaScript高级编程

JavaScript是以对象为基础、函数为模型、原型为继承的基于对象的开发模式。JavaScript不是面向对象的编程语言&#xff0c;在ECMAScript 6规范之前&#xff0c;JavaScript没有类的概念&#xff0c;仅允许通过构造函数模拟类&#xff0c;通过原型实现继承。ECMAScript 6新增类和…

飞桨平台搭建PP-YOLOE模型

一、创建项目 此博客仅是运行PP-YOLOE源码&#xff0c;这里以变压器渗漏数据集为例COCO数据集太大了&#xff0c;跑不动&#xff0c;V100训练预估计得7天左右&#xff0c;即便是A100也得4天半&#xff0c;变压器渗漏油数据集跑一个小时左右&#xff0c;还可以接受&#xff0c;…

公司团建小游戏开发小程序游戏互动小游戏

在现代工作环境中&#xff0c;团队合作和员工士气是取得成功的关键因素。为了增强团队合作、提升员工士气&#xff0c;并促进员工之间的互动&#xff0c;公司团建小游戏成为了一种备受欢迎的方式。本文将探讨如何开发公司团建小游戏&#xff0c;以达到这些目标。 1. 游戏概念 …

京东数据分析(京东销量):2023年9月京东投影机行业品牌销售排行榜

鲸参谋监测的京东平台9月份投影机市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的相关数据数据显示&#xff0c;9月份&#xff0c;京东平台投影机的销量为13万&#xff0c;环比下滑约17%&#xff0c;同比下滑约25%&#xff1b;销售额将近2.6亿&#xff0c;环比下…

JVM虚拟机:如何查看自己的JVM默认的垃圾回收器

只需要在程序运行的时候指定下面的参数就可以看到当前自己的JVM默认的垃圾回收器是什么&#xff1f;如下所示&#xff1a; 如上所示&#xff0c;默认使用的是G1回收器&#xff0c;这是我的电脑&#xff0c;因为我的电脑安装jdk的版本是1.9 如果你的jdk的版本是1.8&#xff0c;那…