我是Redis,请看我和mysql是如何交互的吧~

1. 数据查询:先找我 Redis

过程描述:当有数据请求时,程序首先会找我(Redis)查询。因为我是在内存中工作的,查询速度非常快。如果我有数据,就直接返回,避免查询 MySQL。如果我没有缓存数据,程序会继续去 MySQL 获取,并将结果存储在我的缓存里,以便下次加速查询。

python 复制代码
import redis
import mysql.connector

# 连接 Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)

# 连接 MySQL
mysql_conn = mysql.connector.connect(
    host="localhost",
    user="your_mysql_user",
    password="your_mysql_password",
    database="your_database"
)
mysql_cursor = mysql_conn.cursor()

# 我是 Redis,先来看看数据在不在我的内存里
def get_user_data(user_id):
    # 我会根据用户ID生成一个缓存key
    cache_key = f"user:{user_id}"
    
    # 1. 先从我的缓存里(Redis)找数据
    cached_data = redis_client.get(cache_key)
    
    if cached_data:
        print("Cache hit, data from Redis")
        return cached_data  # 如果数据在我这里,就直接返回
    
    # 2. 如果数据不在我这儿,那就要请 MySQL 出场了
    print("Cache miss, data from MySQL")
    mysql_cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
    user_data = mysql_cursor.fetchone()
    
    if user_data:
        # 3. 我会把 MySQL 的数据记在我这儿,以备下次有人找
        redis_client.set(cache_key, user_data)
    
    return user_data

2. 数据更新:保持 Redis 和 MySQL 的同步

过程描述:当用户更新数据时,程序会先将数据写入 MySQL 数据库。为了保证数据的一致性,更新 MySQL 后,程序还会通知我(Redis),我会清理或更新缓存,确保下次查询时不会返回旧数据。

python 复制代码
# 用户更新数据的时候,我需要保持和 MySQL 数据一致
def update_user_data(user_id, new_data):
    # 1. 首先将新数据写入 MySQL
    mysql_cursor.execute(
        "UPDATE users SET name = %s, age = %s WHERE id = %s",
        (new_data['name'], new_data['age'], user_id)
    )
    mysql_conn.commit()
    
    # 2. 数据写入 MySQL后,我得清掉旧缓存或更新缓存
    cache_key = f"user:{user_id}"
    redis_client.delete(cache_key)  # 清除旧的缓存,以确保下一次数据更新正确
    
    # 我可以选择直接更新缓存,而不是删除缓存
    # redis_client.set(cache_key, new_data)

3. Redis 和 MySQL 的协作流程:加速读写操作

过程描述 :通过这种方式,我(Redis)和 MySQL 实现了良好的合作。当用户发起读请求 时,程序优先从我这里获取缓存的数据;如果缓存未命中,才去 MySQL 查询,并将结果缓存起来。而在写请求时,程序会先更新 MySQL,然后更新或清理我的缓存,保证数据的一致性和系统的高效运作。

相关推荐
让我上个超影吧26 分钟前
黑马点评【基于redis实现共享session登录】
java·redis
寒山李白1 小时前
MySQL复杂SQL(多表联查/子查询)详细讲解
sql·mysql·子查询·多表联查
冰橙子id1 小时前
centos7编译安装LNMP架构
mysql·nginx·架构·centos·php
玛奇玛丶2 小时前
面试官:千万级订单表新增字段怎么弄?
后端·mysql
天天摸鱼的java工程师3 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
Clang's Blog3 小时前
一键搭建 WordPress + MySQL + phpMyAdmin 环境(支持 PHP 版本选择 & 自定义配置)
数据库·mysql·php·wordpr
异常君4 小时前
高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
java·mysql·性能优化
RestCloud4 小时前
如何通过ETLCloud实现跨系统数据同步?
数据库·数据仓库·mysql·etl·数据处理·数据同步·集成平台
懒羊羊大王呀4 小时前
Ubuntu20.04中 Redis 的安装和配置
linux·redis
程序员岳焱4 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql