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

相关推荐
code2cat20 分钟前
【随笔】KV缓存卸载:逐层预取能藏住多少传输时间
人工智能·缓存·大语言模型
我不会起名字3221 小时前
Redis 从 0 到 1(二十八):Redis 抖一下,重试把它打挂了——超时/重试/熔断的 Go 封装
redis·go·超时·熔断·重试
.痞老板.2 小时前
mysql初阶--数据类型
android·数据库·mysql
Risehuxyc2 小时前
MySQL密码插件
数据库·mysql
我不会起名字3222 小时前
Redis 从 0 到 1(三十):删了一半数据 RSS 不降——内存碎片与 activedefrag 观测
redis·内存碎片·rss·排查·activedefrag
.痞老板.15 小时前
mysql初阶--数据库基础
数据库·mysql
MUSHANGXS16 小时前
大模型时代的新蓝海-基于OS底层的AI-Agent应用
人工智能·职场和发展·交互
城北徐宫16 小时前
MySQL约束条件一览
数据库·mysql
码农小河6616 小时前
基于SSM+JSP+MySQL的在线医疗服务系统的设计与实现
java·开发语言·mysql
csdn_aspnet17 小时前
使用 Docker 和 RedisInsight 设置 Redis 以进行本地开发
redis·docker·容器·redisinsight