SpringBoot整合Redis使用同期ロック

1963 ワード

プロジェクトがキャッシュ技術を使用した場合、一般的なアクセス量は多くなりましたよね。先ほどの要請はキャッシュ処理をしただけです。高合併の条件の下で、少なくとも1 Wの人が同時に学生の情報を得るために訪問したとします。
 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;
    }
ロックを方法にかけることができますが、性能にはよくないので、コードブロックにロックをかけます。ダブルチェックロックは性能を向上させます。