キャッシュを使用しているため、データの不整合の問題を許容する必要があります つまり、ある時点で、キャッシュ内のデータはデータベース内のデータとは異なります。
値が変更されたときはいつでも、キャッシュ内の値を更新する必要はありません。そうしないと、キャッシュシステム全体が非常に複雑になり(たとえば、キャッシュされたキーのリストを維持する必要があります)、それを行う必要がない場合もあります(たとえば、キー値が1回だけ使用され、必要がない場合があります)。これ以上更新します。
キャッシュ内のデータを更新し、キャッシュシステムをシンプルに保つにはどうすればよいですか?
通常、キャッシュ内のキーと値のペアを設定または更新するだけでなく、 TIMEOUT
も設定します。 キーごとに 。その後、クライアントはキャッシュからキーと値のペアを取得できます。ただし、キーがタイムアウトに達すると、キャッシュシステムはキーと値のペアをキャッシュから削除します。これはTHE KEY HAS BEEN EXPIRED
と呼ばれます 。次回、キャッシュからそのキーを取得しようとするクライアントは、何も取得しません。これはCACHE MISS
と呼ばれます 。この場合、クライアントはデータベースからキーと値のペアを取得し、新しいタイムアウトでキャッシュするように更新する必要があります。
キーがキャッシュで期限切れになっていないときにデータベースでデータが更新されている場合、クライアントは一貫性のないデータを取得します。ただし、キーの有効期限が切れると、その値はデータベースから取得され、一部のクライアントによってキャッシュに挿入されます。その後、データが再度変更されるまで、他のクライアントは更新されたデータを取得します。
タイムアウトを設定するにはどうすればよいですか?
通常、有効期限ポリシーには2種類あります。
-
N
で期限切れ 秒/分/時間... - 将来のある時点で期限切れになります。 2017/7/3000:00:00に期限切れ
タイムアウトを大きくすると、データベースの負荷を大幅に減らすことができますが、データは長期間古くなる可能性があります。タイムアウトを短くすると、データベースの負荷が高くなりますが、データを可能な限り最新の状態に保つことができます。したがって、タイムアウトを設計するときはトレードオフのバランスを取る必要があります 。
Redisはどのようにキーを期限切れにしますか?
Redisには、キーを期限切れにする2つの方法があります。
- クライアントがキーを操作しようとすると、Redisはキーがタイムアウトに達したかどうかを確認します。存在する場合、Redisはキーを削除し、キーが存在しないかのように動作します。このようにして、Redisはクライアントが期限切れのデータを取得しないようにします。
- Redisには、設定された頻度でキーをサンプリングする有効期限スレッドもあります。キーがタイムアウトに達すると、Redisはこれらのキーを削除します。このようにして、Redisはキーの有効期限プロセスを加速できます。