欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > Redis 和 MySQL 结合使用

Redis 和 MySQL 结合使用

2025/2/5 13:59:58 来源:https://blog.csdn.net/weixin_49364648/article/details/145228086  浏览:    关键词: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 用于持久化存储,处理复杂查询。 结合使用时,通常需要处理缓存一致性、缓存失效、缓存穿透等问题。通过合理的策略(如缓存更新、布隆过滤器、延时双删等),可以提高系统的性能、可靠性和扩展性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com