Redis 和 MySQL 结合使用

Redis 和 MySQL 结合使用的场景非常常见,通常是利用 Redis 作为缓存层来提升 MySQL 数据库的性能,减少数据库的压力,同时提高系统的响应速度。下面是它们结合使用的几种常见方法:

1. 缓存数据库(Cache-Aside)模式

在这种模式下,应用程序首先从 Redis 缓存中查找数据,如果没有找到(缓存未命中),则从 MySQL 数据库中查询数据,并将查询结果缓存到 Redis 中,以便下次查询时能直接从缓存获取。

过程:
  • 应用程序首先查询 Redis,如果 Redis 中有数据(缓存命中),直接返回。
  • 如果 Redis 中没有数据(缓存未命中),则查询 MySQL 数据库。
  • 从 MySQL 查询到的数据存入 Redis 缓存中,并设置缓存的过期时间。
  • 下一次查询时,直接从 Redis 中获取数据。
示例代码:
import redis
import mysql.connector# 连接 Redis 和 MySQL
r = redis.Redis(host='localhost', port=6379, db=0)
db = mysql.connector.connect(user='root', password='password', host='localhost', database='test')def get_user_info(user_id):# 先从缓存查询cached_data = r.get(f"user:{user_id}")if cached_data:return cached_data.decode('utf-8')  # 缓存命中,直接返回# 缓存未命中,从 MySQL 查询cursor = db.cursor()cursor.execute("SELECT name FROM users WHERE id = %s", (user_id,))result = cursor.fetchone()if result:# 查询到数据后存入缓存name = result[0]r.setex(f"user:{user_id}", 3600, name)  # 设置过期时间为1小时return namereturn None

2. 缓存穿透防护

缓存穿透是指查询的数据既不在缓存中也不在数据库中,导致每次请求都直接访问数据库。为防止这种情况,可以使用布隆过滤器或者缓存空值。

方案:
  • 使用布隆过滤器:在 Redis 中设置一个布隆过滤器,记录所有合法的键值。如果查询的数据不在布隆过滤器中,说明该数据不可能存在,直接返回空。
  • 缓存空值:当查询的数据不存在时,将空值存入 Redis,以避免重复查询数据库。
示例:
from pybloom_live import BloomFilter# 初始化布隆过滤器
bloom = BloomFilter(capacity=1000000, error_rate=0.001)def get_user_info_with_bloom(user_id):if user_id not in bloom:return None  # 如果布隆过滤器没有该数据,直接返回 Nonecached_data = r.get(f"user:{user_id}")if cached_data:return cached_data.decode('utf-8')  # 缓存命中cursor = db.cursor()cursor.execute("SELECT name FROM users WHERE id = %s", (user_id,))result = cursor.fetchone()if result:name = result[0]r.setex(f"user:{user_id}", 3600, name)  # 缓存数据return nameelse:# 数据库没有此数据,缓存空值r.setex(f"user:{user_id}", 60, "none")  # 设置过期时间为1分钟return None

3. 数据同步策略

由于 Redis 是内存数据库,当缓存中的数据发生变化时,必须确保 Redis 中的缓存和 MySQL 数据库中的数据保持一致。常见的同步方式有以下几种:

方案:
  • 定时更新缓存:定时任务检查数据库的更新,并更新 Redis 缓存。
  • 主动更新缓存:在数据更新时,应用程序在更新 MySQL 后,立即同步更新缓存。
  • 延时双删策略:当缓存数据失效时,数据库查询结果被更新到 Redis 中,为了避免数据不一致,可以在删除缓存后稍作延迟,再删除一次缓存。
示例:
def update_user_info(user_id, new_name):# 更新 MySQL 数据库中的数据cursor = db.cursor()cursor.execute("UPDATE users SET name = %s WHERE id = %s", (new_name, user_id))db.commit()# 删除 Redis 中的缓存r.delete(f"user:{user_id}")# 更新 Redis 缓存r.setex(f"user:{user_id}", 3600, new_name)

4. Redis 作为 MySQL 的主从架构加速

对于一些高并发的应用,MySQL 可能面临较大的读写压力,使用 Redis 可以在 MySQL 的读写分离架构中,帮助缓存热点数据,减轻主数据库的压力。

5. Redis 发布/订阅模式(Pub/Sub)

在一些需要实时通知的场景中,可以结合 Redis 的发布/订阅功能来实时同步 MySQL 数据库的变动。例如,MySQL 数据库中的某些数据发生变化时,使用 Redis 进行通知,让其他系统或服务进行响应。

总结

Redis 和 MySQL 结合使用的方式,主要是利用 Redis 的高速缓存和 MySQL 的持久化存储各自的优点:

  • Redis 用于缓存热点数据,提升查询速度。
  • MySQL 用于持久化存储,处理复杂查询。 结合使用时,通常需要处理缓存一致性、缓存失效、缓存穿透等问题。通过合理的策略(如缓存更新、布隆过滤器、延时双删等),可以提高系统的性能、可靠性和扩展性。

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

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

相关文章

【HarmonyOS NAPI 深度探索9】发布到 npm 并管理版本

【HarmonyOS NAPI 深度探索9】发布到 npm 并管理版本 开发了一个强大的 N-API 模块后,下一步就是将它发布到 npm,让更多开发者可以使用。同时,随着模块的更新迭代,版本管理也非常重要。今天,我们将讲解如何将 N-API 模…

如何在linux系统上完成定时开机和更新github端口的任务

任务背景 1.即使打开代理,有的时候github去clone比较大的文件时也会出问题。这时需要每小时更新一次github的host端口; 2.马上要放假,想远程登录在学校的台式电脑,但学校内网又不太好穿透。退而求其次,选择定时启动电…

MATLAB基础应用精讲-【数模应用】三维海浪模型仿真(附MATLAB和python代码实现)

目录 前言 ​算法原理 动态海面的建模方法 海浪谱理论 海洋水体构建技术 (一)波形模型 (二)水体着色 三维海浪模型建模 二维不规则长峰波海浪仿真 三维不规则短峰波海浪仿真 海浪建模的理论分析 谐波海面模型 Gerstner波模型 波动方程 代码实现 MATLAB p…

vector迭代器的使用以及迭代器失效

一、iterator的使用注意 begin与end 遵循左闭右开的原则,begin 指向vector的第一个元素,end 指向vector的最后一个元素的往下一个位置。 rbegin 与 rend rbegin指向最后一个元素的位置,rend指向第一个元素的往前一个位置。 二、vector的常…

无降智o1 pro——一次特别的ChatGPT专业模式探索

这段时间和朋友们交流 ChatGPT 的使用心得,大家都提到一个很“神秘”的服务:它基于 O1 Pro 模型,能够在对话里一直保持相对高水平的理解和回复,不会突然变得“降智”。同时,整体使用还做了免折腾的网络设置——简单一点…

Web前端开发技术之HTMLCSS知识点总结

学习路线 一、新闻网界面1. 代码示例2. 效果展示3. 知识点总结3.1 HTML标签和字符实体3.2 超链接、颜色描述与标题元素3.3 关于图片和视频标签:3.4 CSS引入方式3.5 CSS选择器优先级 二、flex布局1. 代码示例2. 效果展示3. 知识点总结3.1 span标签和flex容器的区别3.…

ToDesk设置临时密码和安全密码都可以当做连接密码使用

ToDesk 在各领域办公都已经是非常常见了 为了安全 ToDesk 设置了连接密码,想连接 需要输入远程码和连接密码 我们刚打开 系统默认给我们用的是临时密码,安全性确实很强 和定时Tokey一样,固定时间切换。 但是 如果我们要经常连接这个电脑&a…

js高亮文本

高亮文本 const inputs ["这是一个普通文本&#xff0c;包含关键字测试。",<p style"font-size: 10px">这是一个<span>GVM</span> <strong>测试</strong>内容。</p>, ];const keywords ["测试", "G…

锐捷路由器网关RG-NBR6135-E和锐捷交换机 Ruijie Reyee RG-ES224GC 电脑登录web方法

2025年1月17日22:29:35 最近淘了点东西&#xff0c;准备在家里搞一套深度学习的服务器&#xff0c;先把网关和交换机搞到了 锐捷路由器网关RG-NBR6135-E 电脑登录web方法 在拿到机器的时候&#xff0c;如果不是全新建议拿根牙签&#xff0c;差入reset 5-10秒,灯光会全部闪几下…

Windows下的C++内存泄漏检测工具Visual Leak Detector (VLD)介绍及使用

在软件开发过程中&#xff0c;内存管理是一个至关重要的环节。内存泄漏不仅会导致程序占用越来越多的内存资源&#xff0c;还可能引发系统性能下降甚至程序崩溃。对于Linux平台来说&#xff0c;内存检测工具非常丰富&#xff0c;GCC自带的AddressSanitizer (asan) 就是一个功能…

如何在vue中渲染markdown内容?

文章目录 引言什么是 markdown-it&#xff1f;安装 markdown-it基本用法样式失效&#xff1f;解决方法 高级配置语法高亮 效果展示 引言 在现代 Web 开发中&#xff0c;Markdown 作为一种轻量级的标记语言&#xff0c;广泛用于文档编写、内容管理以及富文本编辑器中。markdown…

openharmony应用开发快速入门

开发准备 本文档适用于OpenHarmony应用开发的初学者。通过构建一个简单的具有页面跳转/返回功能的应用&#xff08;如下图所示&#xff09;&#xff0c;快速了解工程目录的主要文件&#xff0c;熟悉OpenHarmony应用开发流程。 在开始之前&#xff0c;您需要了解有关OpenHarmon…

docker 部署confluence

1.安装docker的过程就不说了。 2.下载镜像。 docker pull cptactionhank/atlassian-confluence:7.4.0 docker images 3.下载pojie 包。 https://download.csdn.net/download/liudongyang123/90285042https://download.csdn.net/download/liudongyang123/90285042https://do…

Cloud Foundry,K8S,Mesos Marathon弹性扩缩容特性对比

一、Cloud Foundry 使用Scaling an Application Using App Autoscaler插件&#xff0c;基于资源使用情况触发简单扩缩容 CPU、内存、Http带宽、延时等 监控这些资源的使用情况决定扩缩容策略&#xff1a;实例是增加还是减少 Instance Limits 限制实例数量范围&#xff0c;定义…

node中文名的js文件有问题

新版Node无法运行含有中文名的JS文件&#xff0c;具体表现在无报错无反应。如下图&#xff1a; 源码如下&#xff1a; 改成英文的JS文件&#xff0c;则正常&#xff0c;如下图&#xff1a;

Node.js 到底是什么

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者使用 JavaScript 编写服务器端代码。 一、主要特点 1. 事件驱动和非阻塞 I/O 模型 Node.js 采用事件驱动架构&#xff0c;通过回调函数处理 I/O 操作&#xff0c;这使得它在处理大量并发请…

flutter 常用UI组件

文章目录 1. Toast 文本提示框oktoastbot_toast2. loading 加载窗flutter_easyloading3. 对话框gex dialog4.下拉刷新pull_to_refresh5. pop 窗custom_pop_up_menu6. pin code 密码框pinput7. 二维码qr_flutter8. swiper 滚动组件carousel_sliderflutter_swiper_view9. Badge 角…

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…

【深入解析】 RNN 算法:原理、应用与实现

深入解析 RNN 算法&#xff1a;原理、应用与实现 导语 递归神经网络&#xff08;Recurrent Neural Network&#xff0c;简称 RNN&#xff09;是深度学习领域的一项革命性技术&#xff0c;它对处理序列数据&#xff08;如文本、语音、视频等&#xff09;具有无可比拟的优势。与…

2.slf4j入口

文章目录 一、故事引入二、原理探究三、SLF4JServiceProvider四、总结 一、故事引入 故事要从下面这段代码说起 public class App {private static final Logger logger LoggerFactory.getLogger(App.class);public static void main( String[] args ) throws Exception {lo…