SpringBoot整合Redis使用同期ロック
1963 ワード
プロジェクトがキャッシュ技術を使用した場合、一般的なアクセス量は多くなりましたよね。先ほどの要請はキャッシュ処理をしただけです。高合併の条件の下で、少なくとも1 Wの人が同時に学生の情報を得るために訪問したとします。
同期機構:synchronizedはJava同期機構の実現であり、すなわち相互反発ロック機構であり、得られたロックは相互反発ロックと呼ばれている。相互反発ロック:各オブジェクトのロックは一回に1つのスレッドにしか割り当てられません。同じ時間は1つのスレッドだけで占有できます。作用:synchronizedは、同じ時間に1つのスレッドから臨界領域に入るだけでなく、共有変数の視認性、原子性、秩序性を保証するために使用されます。使用:スレッドが同期コード方法(ブロック)にアクセスしようとすると、まずロックが必要となり、終了またはドロップが異常となるとロックが解除されます。
List studentList = (List) redisTemplate.opsForValue().get("students");
では、studentListは空です。1 W人はアクセスデータベースに入ります。if (studentList == null) {
/* mysql */
studentList = studentService.getStudents();
/* redis */
redisTemplate.opsForValue().set("students", studentList);
}
高同時処理では、synchronized同期ロックを使用できます。同期機構:synchronizedはJava同期機構の実現であり、すなわち相互反発ロック機構であり、得られたロックは相互反発ロックと呼ばれている。相互反発ロック:各オブジェクトのロックは一回に1つのスレッドにしか割り当てられません。同じ時間は1つのスレッドだけで占有できます。作用:synchronizedは、同じ時間に1つのスレッドから臨界領域に入るだけでなく、共有変数の視認性、原子性、秩序性を保証するために使用されます。使用:スレッドが同期コード方法(ブロック)にアクセスしようとすると、まずロックが必要となり、終了またはドロップが異常となるとロックが解除されます。
@GetMapping(value = "/getStudents")
@ResponseBody
public /*synchronized*/ Object getStudents(){
/*redis */
RedisSerializer redisSerializer = new StringRedisSerializer();
/* redisTemplate */
redisTemplate.setKeySerializer(redisSerializer);
// , ,
/* redis */
List studentList = (List) redisTemplate.opsForValue().get("students");
//
if (studentList == null) {
synchronized (this) {
// redis
studentList = (List) redisTemplate.opsForValue().get("students");
if (studentList == null) {
/* mysql */
studentList = studentService.getStudents();
/* redis */
redisTemplate.opsForValue().set("students", studentList);
}
}
}
return studentList;
}
ロックを方法にかけることができますが、性能にはよくないので、コードブロックにロックをかけます。ダブルチェックロックは性能を向上させます。