redis与mysql的数据一致性问题(数据同步延迟)

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: redis与mysql的数据一致性问题(数据同步延迟)

redis与mysql的数据一致性问题(数据同步延迟)

案例:考虑一个简单的电子商务网站,有一个商品信息服务,使用MySQL存储商品信息,而使用Redis缓存了商品的价格信息。用户在浏览商品页面时,系统首先查询Redis获取商品价格,如果缓存中不存在,则从MySQL中查询并写入Redis缓存。这样的设计可以提高访问速度,但可能导致数据同步延迟。

# Python代码示例 - 获取商品价格的逻辑
import redis
import MySQLdb
def get_product_price(product_id):
    redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
    mysql_conn = MySQLdb.connect(host='localhost', user='user', password='password', db='ecommerce')
    cursor = mysql_conn.cursor()
    # 尝试从Redis中获取商品价格
    price = redis_client.get(f'product:{product_id}:price')
    if price is None:
        # 从MySQL中查询商品价格
        cursor.execute(f'SELECT price FROM products WHERE id={product_id}')
        result = cursor.fetchone()
        if result:
            price = result[0]
            # 将商品价格写入Redis缓存
            redis_client.set(f'product:{product_id}:price', price)
    cursor.close()
    mysql_conn.close()
    return price

解决方案:

  1. 使用消息队列进行异步更新:
    在商品价格发生变化时,将更新操作放入消息队列,异步地更新Redis缓存。这样可以避免用户在查询商品价格时遇到同步延迟。
# Python代码示例 - 使用消息队列进行异步更新商品价格
import redis
import MySQLdb
import json
from kafka import KafkaProducer
def update_product_price(product_id, new_price):
    # 更新MySQL中商品价格
    mysql_conn = MySQLdb.connect(host='localhost', user='user', password='password', db='ecommerce')
    cursor = mysql_conn.cursor()
    cursor.execute(f'UPDATE products SET price={new_price} WHERE id={product_id}')
    mysql_conn.commit()
    cursor.close()
    mysql_conn.close()
    # 将更新操作放入消息队列
    message = {'product_id': product_id, 'new_price': new_price}
    producer = KafkaProducer(bootstrap_servers='localhost:9092', value_serializer=lambda v: json.dumps(v).encode('utf-8'))
    producer.send('product_price_updates', value=message)
    producer.close()
  1. 定期同步数据:
    设置定时任务,定期从MySQL中获取商品价格并更新到Redis中,确保缓存数据的及时更新。
# Python代码示例 - 定期同步商品价格数据
import redis
import MySQLdb
import schedule
import time
def sync_product_prices():
    redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
    mysql_conn = MySQLdb.connect(host='localhost', user='user', password='password', db='ecommerce')
    cursor = mysql_conn.cursor()
    # 获取所有商品ID
    cursor.execute('SELECT id FROM products')
    product_ids = [result[0] for result in cursor.fetchall()]
    for product_id in product_ids:
        # 从MySQL中查询商品价格
        cursor.execute(f'SELECT price FROM products WHERE id={product_id}')
        result = cursor.fetchone()
        if result:
            price = result[0]
            # 将商品价格写入Redis缓存
            redis_client.set(f'product:{product_id}:price', price)
    cursor.close()
    mysql_conn.close()
# 每小时执行一次同步
schedule.every().hour.do(sync_product_prices)
while True:
    schedule.run_pending()
    time.sleep(1)
相关文章
|
7月前
|
存储 消息中间件 监控
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
蒋星熠Jaxonic,数据领域技术深耕者。擅长MySQL到ClickHouse链路改造,精通实时同步、数据校验与延迟治理,致力于构建高性能、高一致性的数据架构体系。
MySQL 到 ClickHouse 明细分析链路改造:数据校验、补偿与延迟治理
|
7月前
|
缓存 NoSQL 关系型数据库
MySQL 与 Redis 如何保证双写一致性?
我是小假 期待与你的下一次相遇 ~
828 7
|
10月前
|
关系型数据库 应用服务中间件 nginx
Docker一键安装中间件(RocketMq、Nginx、MySql、Minio、Jenkins、Redis)
本系列脚本提供RocketMQ、Nginx、MySQL、MinIO、Jenkins和Redis的Docker一键安装与配置方案,适用于快速部署微服务基础环境。
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
7月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
849 6
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
375 32
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
541 5
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
|
消息中间件 缓存 NoSQL
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
|
缓存 NoSQL 关系型数据库
Redis与MySQL的数据一致性
在高并发环境下,保持 Redis 和 MySQL 的数据一致性是一个复杂但重要的问题。通过采用读写穿透、写穿透、分布式锁、双写一致性保障和延时双删策略,可以有效地减少数据不一致的风险,确保系统的稳定性和可靠性。通过合理的缓存策略和数据同步机制,可以显著提升系统的性能和用户体验。
804 22

推荐镜像

更多