我是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,然后更新或清理我的缓存,保证数据的一致性和系统的高效运作。

相关推荐
bqq1986102618 分钟前
MySQL性能优化
mysql·mysql优化
未若君雅裁32 分钟前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
雨辰AI1 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20242 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有2 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao2 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
189228048613 小时前
NY352固态MT29F32T08GWLBHD6-24QJ:B
大数据·服务器·人工智能·科技·缓存
Mr数据杨3 小时前
【CanMV K210】显示交互 LCD1602 I2C 通信与滚动文本显示
人工智能·交互·硬件开发·canmv k210
海市公约3 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
颂love4 小时前
MySQL的执行流程
android·数据库·mysql