目次
1、INCR
2. SETNX
3. SET
ホームページ データベース Redis Redisをロックするにはどのような方法がありますか?

Redisをロックするにはどのような方法がありますか?

May 27, 2023 pm 12:43 PM
redis

redis の一般的なロック コマンドは、INCR、SETNX、SET

1、INCR

この種のロックのロックの考え方は次のとおりです。

key が存在しない場合、まず key の値が 0 に初期化され、次に INCR 操作が実行されて 1 ずつ増加します。

その後、他のユーザーが INCR 操作を実行して 1 を追加したときに、返された値が 1 より大きい場合、そのキーは使用のためにロックされていることを意味します。

1. クライアント A は、ロックが取得されたことを示すキー値 1 の取得をサーバーに要求します。

2. クライアント B もサーバーにキー値 2 の取得を要求します。

3. クライアント A はコードの実行を完了し、ロックを削除します

4. クライアント B は一定時間待機し、次のキー値を取得しますリクエストを行うときは 1 で、ロックが正常に取得されたことを示します

5. クライアント B がコードを実行し、ロックを削除します

$redis->incr($key);
$redis->expire($key, $ttl); //设置生成时间为1秒
ログイン後にコピー

特定のコマンド:

127.0.0.1:6379>INCR keyName
ログイン後にコピー

2. SETNX

この種のロックの背後にある考え方は、キーが存在しない場合、キーを値に設定するというものです。キーが存在する場合、SETNX は何もアクションを実行しません。

SETNX は、SET if Not eXists の略称です。

1. クライアント A はサーバーにキー値の設定を要求します。設定が成功した場合は、ロックが成功したことを意味します。

2. クライアント B もサーバーに次のことを要求します。キー値を設定します。 if リターンが失敗した場合は、ロックが失敗したことを意味します

3. クライアント A はコードの実行を完了し、ロックを削除します

4. クライアント B はキー値の設定を要求します一定時間待機すると、設定が成功しました。

5. クライアント B がコードを実行し、ロックを削除します

$redis->setNX($key, $value);
$redis->expire($key, $ttl);
ログイン後にコピー

特定のコマンド:

redis> SETNX keyName value
(integer) 1
ログイン後にコピー

設定は成功しました1 が返され、設定は失敗し、ロックが返されます 0

3. SET

上記の 2 つのメソッドには問題があり、キーの有効期限を設定する必要があることがわかります。

では、なぜキーの有効期限を設定する必要があるのでしょうか?

リクエストの実行が何らかの理由で予期せず終了し、ロックが作成されても削除されなかった場合、ロックは常に存在するため、今後キャッシュが更新されることはありません。

したがって、事故を防ぐためにロックに有効期限を追加する必要があります。

ただし、Expire を使用して設定することはアトミックな操作ではありません。

トランザクションによるアトミック性も確保できますが、まだいくつか問題があるため、公式は別の問題を引用しています SET コマンド自体を使用することで、バージョン 2.6.12 から有効期限を設定する機能が追加されました。

1. クライアント A は、サーバーにキー値の設定を要求します。設定が成功すると、ロックは成功します。

2. クライアント B も、サーバーにキー値の設定を要求します。戻りが失敗した場合は、ロックが失敗したことを意味します。

3. クライアント A はコードの実行を完了し、ロックを削除します。

4. クライアント B は一定時間待機します。

5. クライアント B がコードを実行し、ロックを削除します

$redis->set($key, $value, array('nx', 'ex' => $ttl));  //ex表示秒
ログイン後にコピー

具体的な使用法:

redis>set key value NX EX max-lock-time 实现加锁
ログイン後にコピー

コマンドの説明:

  • key: キーはロックの識別子としての redis のキー値であり、値はここでクライアントの識別子として使用されます。キーと値の一致により、ロックを削除する権限が得られます [セキュリティの確保]

  • max-lock-time: max-lock-time までの有効期限を設定します。デッドロックが発生しないことを確認します [デッドロックの回避]

  • NX: キーが存在しない場合、キーが存在しない場合にのみ操作が実行されます;

  • EX: キーの有効期限を秒に設定します。具体的な時間は 5 番目のパラメータ

## によって決まります。ロック コード:

 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 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 スクリプトです。つまり、キーに従って取得された値が渡された値と同じ場合は、del を実行し、それ以外の場合は 0 を返します [セキュリティの保証]

jedis .eval(String,list,list); このコマンドは、lua スクリプトを実行するためのものです。 2 番目のパラメータ、ARGV のセットが 3 番目のパラメータです [確実にロックを解除するためのアトミック操作]

上記は Redis を使用して分散ロックを正しく実装する方法ですが、ロックの有効期限が切れるという小さな欠陥があります。時間は適切な値に設定する必要がありますが、実際にはビジネス シナリオに基づいて検討する必要があります。

以上がRedisをロックするにはどのような方法がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 Windows 11 10.0.22000.100 のインストール時の 0x80242008 エラーの解決策 May 08, 2024 pm 03:50 PM

1. [スタート]メニューを起動し、[cmd]と入力し、[コマンドプロンプト]を右クリックし、[管理者として実行]を選択します。 2. 次のコマンドを順番に入力します (注意してコピーして貼り付けてください): SCconfigwuauservstart=auto、Enter キーを押す SCconfigbitsstart=auto、Enter キーを押す SCconfigcryptsvcstart=auto、Enter キーを押す SCconfigtrustedinstallerstart=auto、Enter キーを押す SCconfigwuauservtype=share、Enter キーを押す netstopwuauserv 、enter netstopcryptS を押す

PHP機能のボトルネックを分析し、実行効率を向上 PHP機能のボトルネックを分析し、実行効率を向上 Apr 23, 2024 pm 03:42 PM

PHP 関数のボトルネックはパフォーマンスの低下につながります。これは、ボトルネック関数を特定し、パフォーマンス分析ツールを使用するという手順で解決できます。結果をキャッシュして再計算を減らします。タスクを並列処理して実行効率を向上させます。文字列の連結を最適化し、代わりに組み込み関数を使用します。カスタム関数の代わりに組み込み関数を使用します。

Golang API のキャッシュ戦略と最適化 Golang API のキャッシュ戦略と最適化 May 07, 2024 pm 02:12 PM

GolangAPI のキャッシュ戦略により、パフォーマンスが向上し、サーバーの負荷が軽減されます。一般的に使用される戦略は、LRU、LFU、FIFO、TTL です。最適化手法には、適切なキャッシュ ストレージの選択、階層型キャッシュ、無効化管理、監視とチューニングが含まれます。実際には、データベースからユーザー情報を取得する API を最適化するために LRU キャッシュが使用されます。それ以外の場合は、データベースからデータを取得した後にキャッシュを更新できます。

PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 PHP 開発におけるキャッシュ メカニズムとアプリケーションの実践 May 09, 2024 pm 01:30 PM

PHP 開発では、キャッシュ メカニズムにより、頻繁にアクセスされるデータがメモリまたはディスクに一時的に保存され、データベース アクセスの数が削減され、パフォーマンスが向上します。キャッシュの種類には主にメモリ、ファイル、データベース キャッシュが含まれます。キャッシュは、組み込み関数またはサードパーティのライブラリ (cache_get() や Memcache など) を使用して PHP に実装できます。一般的な実用的なアプリケーションには、データベース クエリ結果をキャッシュしてクエリ パフォーマンスを最適化したり、ページ出力をキャッシュしてレンダリングを高速化したりすることが含まれます。キャッシュ メカニズムにより、Web サイトの応答速度が効果的に向上し、ユーザー エクスペリエンスが向上し、サーバーの負荷が軽減されます。

Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法_Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法 Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法_Win11 英語 21996 を簡体字中国語 22000 にアップグレードする方法 May 08, 2024 pm 05:10 PM

まず、システム言語を簡体字中国語表示に設定して再起動する必要があります。もちろん、以前に表示言語を簡体字中国語に変更したことがある場合は、この手順をスキップできます。次に、レジストリ regedit.exe の操作を開始し、左側のナビゲーション バーまたは上部のアドレス バーで HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlNlsLanguage に直接移動し、InstallLanguage キーの値と Default キーの値を 0804 に変更します (英語に変更する場合)。まずシステムの表示言語を en-us に設定し、システムを再起動してから、すべてを 0409 に変更します) この時点でシステムを再起動する必要があります。

PHP 配列のページネーションで Redis キャッシュを使用するにはどうすればよいですか? PHP 配列のページネーションで Redis キャッシュを使用するにはどうすればよいですか? May 01, 2024 am 10:48 AM

Redis キャッシュを使用すると、PHP 配列ページングのパフォーマンスを大幅に最適化できます。これは、次の手順で実現できます。 Redis クライアントをインストールします。 Redisサーバーに接続します。キャッシュ データを作成し、データの各ページをキー「page:{page_number}」を持つ Redis ハッシュに保存します。キャッシュからデータを取得し、大規模な配列での高コストの操作を回避します。

navicat は redis に接続できますか? navicat は redis に接続できますか? Apr 23, 2024 pm 05:12 PM

はい、Navicat は Redis に接続できます。これにより、ユーザーはキーの管理、値の表示、コマンドの実行、アクティビティの監視、問題の診断が可能になります。 Redis に接続するには、Navicat で「Redis」接続タイプを選択し、サーバーの詳細を入力します。

Win11でダウンロードしたアップデートファイルの探し方_Win11でダウンロードしたアップデートファイルの場所を共有する Win11でダウンロードしたアップデートファイルの探し方_Win11でダウンロードしたアップデートファイルの場所を共有する May 08, 2024 am 10:34 AM

1. まず、デスクトップ上の[このPC]アイコンをダブルクリックして