分散ロックは、実際には、分散システムを制御して共有リソースを秩序正しく操作すること、および相互排他によって一貫性を維持することとして理解できます。
不適切な例を挙げると、共有リソースがさまざまな本がある家であるとします。分散システムは、家に入って本を読みたい人々であり、分散ロックにより、家には A のドアしかなく、一度に 1 人だけが入ることができ、ドアの鍵は 1 つだけです。 (推奨学習: Redis ビデオ チュートリアル )
redis を使用して分散ロックを実装する
redis コマンド セット キー値 NX EX を使用するmax -lock-time はロックを実装します
redis コマンド EVAL を使用してロック解除を実装します
Lock:
Jedis jedis = new Jedis("127.0.0.1", 6379); private static final String SUCCESS = "OK"; /** * 加锁操作 * @param key 锁标识 * @param value 客户端标识 * @param timeOut 过期时间 */ public Boolean lock(String key,String value,Long timeOut){ String var1 = jedis.set(key,value,"NX","EX",timeOut); if(LOCK_SUCCESS.equals(var1)){ return true; } return false; }
解釈:
ロック操作: jedis.set(key,value,"NX","EX",timeOut)[保証されたロックのアトミック操作]
キーはロックの識別子としての redis のキー値であり、ここではその値がクライアントの識別子として使用されます。キーと値が一致した場合にのみ、ロックを削除する権利を得ることができます [セキュリティの保証]
timeOut で有効期限を設定すると、デッドロックが発生しないことが保証されます [デッドロックを回避]
NX、EX とはどういう意味ですか?
NX: キーが存在しない場合、キーが存在しない場合にのみ操作が実行されます;
EX: キーの有効期限を秒に設定します。具体的な時間は次のとおりです。 5 番目のパラメータの決定によって決定されます。
Unlock
Jedis jedis = new Jedis("127.0.0.1", 6379); private static final Long UNLOCK_SUCCESS = 1L; /** * 解锁操作 * @param key 锁标识 * @param value 客户端标识 * @return */ public static Boolean unLock(String key,String value){ String luaScript = "if redis.call(\"get\",KEYS[1]) == ARGV[1] then return redis.call(\"del\",KEYS[1]) else return 0 end"; Object var2 = jedis.eval(luaScript,Collections.singletonList(key), Collections.singletonList(value)); if (UNLOCK_SUCCESS == var2) { return true; } return false; }
解釈:
luaScript この文字列は lua スクリプトです。つまり、 if according to keyで取得した値が渡された値と同じ場合はdelを実行、そうでない場合は0を返す [セキュリティの確保]
jedis.eval(String, list, list); このコマンドはlua スクリプトを実行するには、KEYS ARGV のセットが 2 番目のパラメータで、ARGV のセットが 3 番目のパラメータです [確実にロックを解除するためのアトミック操作]
上記は、Redis を使用して分散ロックを正しく実装する方法を実現しています。ですが、ロックに小さな欠陥があります 適切な有効期限を適切な値に設定する必要がありますが、これは実際にはビジネス シナリオに基づいて検討する必要があります。
Redis 関連の技術記事の詳細については、Redis 入門チュートリアル 列にアクセスして学習してください。
以上がRedis を使用して分散ロックを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。