キャッシュの内訳:
特定のキャッシュについて、同時実行性が高い条件下でアクセス量が特に膨大な場合、キャッシュの有効時間制限が切れる到着時に、キャッシュの再構築を必要とするアクセスが多数発生する可能性があります。つまり、これらのアクセス要求により、キャッシュが壊れていることがわかります。そのようなデータがない場合、クエリは DBMS で即時に実行され、 DBMS で問題が発生する可能性があります。同時実行クエリが多くなり、 DBMSの崩壊につながります 。この状況はキャッシュの故障と呼ばれ、キャッシュ番号はホットデータと言われています。
次のように進めます。
- まずリードにデータがあるかどうかを確認します
- Redis にデータがない場合は、ロックに synchronized を使用します
- リードにデータがあるかどうかを再度クエリします。
- ステップ 3 のクエリにデータがまだない場合は、この時点でデータベースを再度確認します。
- データベース内のデータをクエリした後、データを Redis に書き込みます
public Double findTurnover() {
// 获取Redis操作对象
BoundValueOperations<Object, Object> ops = template.boundValueOps("turnover");
// 从缓存获取turnover
Object turnover = ops.get();
//取不到加锁
if (turnover == null) {
synchronized (this) {
turnover = ops.get();
// 若缓存中没有,则从DB中查询
if (turnover == null) {
Date date = new Date();
//根据当前时间获取交易额
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
turnover = dao.selectTurnover(sdf.format(date));
// 将从DB中查询的结果写入到缓存,并指定过期时间
ops.set(turnover, 10, TimeUnit.SECONDS);
}
}
}
return (Double) turnover;
}
二重チェック ロック方式を使用すると、同時実行性が高い状況ですべてのリクエストがデータベースに直接送信されることを回避できます。