SpringBoot 통합 Redis 파이프 의 예제 코드

1.Redis 의 파이프(pipeline)
Redis 명령 을 실행 하려 면 Redis 클 라 이언 트 와 Redis 서버 는 다음 절 차 를 실행 해 야 합 니 다.
클 라 이언 트 가 서버 에 명령 을 보 냅 니 다
  • 서버 가 명령 요청 을 받 고 명령 을 집행 하여 해당 하 는 결 과 를 얻 습 니 다
  • 서버 가 결 과 를 클 라 이언 트 에 게 되 돌려 줍 니 다
  • 클 라 이언 트 가 명령 을 받 은 실행 결 과 를 사용자 에 게 보 여 줍 니 다Redis 명령 이 소모 하 는 대부분의 시간 은 명령 요청 을 보 내 고 명령 결 과 를 받 는 데 사 용 됩 니 다.임의의 여러 개의 Redis 명령 요청 을 한데 묶 은 다음 한꺼번에 서버 에 보 냅 니 다.서버 는 모든 명령 요청 을 처리 한 후에 한꺼번에 실행 결 과 를 클 라 이언 트 에 게 되 돌려 줍 니 다.
    주의사항:
    Redis 서버 는 클 라 이언 트 가 파이프 에 포 함 된 명령 수량 을 제한 하지 않 지만 클 라 이언 트 의 입력 버퍼 에 기본 값 이 1GB 인 부피 상한 선 을 설정 합 니 다.클 라 이언 트 가 보 낸 데이터 양 이 이 제한 을 초과 하면 Redis 서버 는 클 라 이언 트 를 강제로 닫 습 니 다.따라서 한꺼번에 대량의 명령 이나 부피 가 매우 큰 명령 을 같은 파이프 에 넣 지 않 는 것 이 좋다.
    그 밖 에 많은 클 라 이언 트 자체 에 도 숨겨 진 버퍼 크기 제한 이 있 습 니 다.만약 에 흐름 선 특성 을 사용 하 는 과정 에서 일부 흐름 선 명령 이 실행 되 지 않 거나 흐름 선 이 돌아 오 는 결과 가 완전 하지 않 은 것 을 발견 하면 프로그램 이 클 라 이언 트 에 내 장 된 버퍼 크기 제한 에 부 딪 혔 을 가능성 이 높 습 니 다.
    2.SpringBoot 통합 Redis 파이프 인 스 턴 스
    SpringBoot 통합 redis 의 인 스 턴 스
    하나의 increment 명령 을 사용 하여 200 w key 를 처리 합 니 다:
    
    public class RedisPipelineStudy extends BaseTest {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        private static final String PREFIX = "test0:";
    
        @Test
        public void test() {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start("test0");
            for (int times = 0; times < 2; times++) {
                for (int i = 0; i < 1000000; i++) {
                    stringRedisTemplate.opsForValue().increment(PREFIX + i, 1L);
                }
            }
            stopWatch.stop();
            System.out.println(stopWatch.prettyPrint());
        }
    
    }
    
    소모 시간 은 다음 과 같다.
    在这里插入图片描述
    파이프 incrBy 를 사용 하여 200 w 개의 key 를 처리 하고 매번 300 개의 명령 을 포장 하여 서버 에 보 냅 니 다.다음 과 같 습 니 다.
    
    public class RedisPipelineStudy extends BaseTest {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        private static final String PREFIX = "test1:";
    
        @Test
        public void test() {
            StopWatch stopWatch = new StopWatch();
            stopWatch.start("test1");
            List<Integer> recordList = new ArrayList<>();
            for (int times = 0; times < 2; times++) {
                for (int i = 0; i < 1000000; i++) {
                    try {
                        recordList.add(i);
                        if (recordList.size() > 300) {
                            incrByPipeline(recordList);
                            recordList = new ArrayList<>();
                        }
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                }
                if (!CollectionUtils.isEmpty(recordList)) {
                    incrByPipeline(recordList);
                    recordList = new ArrayList<>();
                }
            }
            stopWatch.stop();
            System.out.println(stopWatch.prettyPrint());
        }
    
        private void incrByPipeline(List<Integer> recordList) {
            stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
                @Override
                public Object doInRedis(RedisConnection connection) throws DataAccessException {
                    try {
                        for (Integer record : recordList) {
                            byte[] key = (PREFIX + record).getBytes();
                            connection.incrBy(key, 1);
                        }
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                    return null;
                }
            });
        }
    }
    
    소모 시간:11 위,단위:ns,단일 명령 소모 시간의 1/6 입 니 다.
    在这里插入图片描述
    SpringBoot 통합 Redis 파이프 에 관 한 예제 코드 에 관 한 글 은 여기까지 입 니 다.더 많은 SpringBoot 통합 Redis 파이프 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기