Redisの楽観的ロックを実現する方法
Redisのオプティミスティック・ロックは下記の手順で実装されます。
- Redis ではバージョンとしてフィールドを使用します。たとえば「version」という名前を付けます。
- ロックが必要なときは、最初に最新のバージョンの番号の値を取得し、それを変数に保存する。
- 続いてビジネスロジックの処理を行う。
- 処理が完了したら、現在のバージョン番号の値を再度取得し、変数に保存したバージョン番号と照合する。
- バージョンの番号と比較して、その間に排他操作によるデータの変更がない場合、バージョン番号を1つ増やして Redis に更新します。
- バージョン番号が異なっている場合は、その間に他の並行処理によってデータに変更があったことを示しており、ロールバック操作や再試行などの適切な処理を行う必要があります。
Redisの乐观ロックを使用した例は以下の通りです。
import redis
def optimistic_lock(key):
# 连接到 Redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 从 Redis 中获取版本号
version = r.get(key)
# 处理业务逻辑
# ...
# 再次获取当前版本号
new_version = r.get(key)
# 比对版本号
if version == new_version:
# 版本号相等,可以更新版本号
r.incr(key)
# 更新其他数据
# ...
else:
# 版本号不相等,有并发操作,进行相应的处理
# ...
Redisは単一スレッドであるため、オプティミスティックロックを使用する場合は、ビジネスロジック処理中に他の同時操作によってデータが変更されないようにする必要があります。そうしないと、同時実行の競合が発生します。