面试题答案
一键面试- 加锁:
- 在进行数据库更新操作前,使用Redis的
SETNX
(SET if Not eXists)命令尝试获取锁。例如,以要更新的数据的唯一标识(如主键)作为锁的键,一个唯一值(如当前时间戳或UUID)作为锁的值。代码示例(以Python和redis - py库为例):
import redis r = redis.Redis(host='localhost', port = 6379, db = 0) lock_key = 'update_lock_{data_id}' lock_value = 'unique_value' if r.setnx(lock_key, lock_value): try: # 获得锁,执行数据库更新操作 pass finally: # 无论操作是否成功,都要释放锁 r.delete(lock_key) else: # 未获得锁,等待或返回错误信息 pass
- 在进行数据库更新操作前,使用Redis的
- 执行业务操作:
- 获取锁成功后,在MySQL中执行数据更新操作。确保更新语句的正确性和原子性,例如使用
BEGIN
、COMMIT
语句进行事务处理。以Python和pymysql
库为例:
import pymysql conn = pymysql.connect(host='localhost', user='root', password='password', database='test') cursor = conn.cursor() try: conn.begin() update_sql = "UPDATE your_table SET column = 'new_value' WHERE id = {data_id}" cursor.execute(update_sql) conn.commit() except Exception as e: conn.rollback() raise e finally: cursor.close() conn.close()
- 获取锁成功后,在MySQL中执行数据更新操作。确保更新语句的正确性和原子性,例如使用
- 释放锁:
- 无论数据库更新操作是否成功,在操作完成后,使用Redis的
DELETE
命令释放锁。如上述Python示例中,在finally
块中删除锁。这样其他节点就可以尝试获取锁并进行更新操作,从而避免了多节点同时更新导致的数据不一致问题。同时可以为锁设置一个合理的过期时间(如使用SET key value EX seconds NX
命令),防止因程序异常导致锁永远无法释放的情况。
- 无论数据库更新操作是否成功,在操作完成后,使用Redis的