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