2016-10-22 4 views
0

Redis 캐시를 사용하여 페이지 데이터를 저장하고 있습니다. 내 페이지에서 페이지가 매겨진 데이터 (게으른로드)를 표시해야합니다. 레코드 수가 적 으면 모든 것이 잘 작동합니다. 그러나 60k가 넘는 레코드가로드되면 엄청나게 느려집니다.redis 개체에 직접 페이징 및 정렬 적용

List<MyEntity> lstMyData = cont.Cache.GetObject<List<MyEntity>>("RedisKeyName") 
           .Where(x => x.Id == Id || x.Id == 0) 
           .OrderByDescending(x => x.TotalCount) 
           .Skip((page != 0 ? page - 1 : 0) * limit) 
           .Take(limit) 
           .ToList(); 

내가 레디 스 객체에 쿼리하지 않고 직접 전체 목록마다 시간을 가져 오기 위해 필요하지만 적절한 아무것도 찾을 수 없습니다 : 나는 데이터를 가져 오기 위해 다음 코드를 사용하고 있습니다. 도와 주시고 미리 감사드립니다.

+0

이 레코드를 Redis'LIST'에 저장 하시겠습니까? –

+0

아니요, Redis 개체에 저장합니다. –

답변

0

코드가 너무 효과적입니다. 주어진 id (O(N))를 가진 모든 레코드를 얻기 위해리스트를 반복하고, 결과리스트를 정렬하고 (O(Nlog(N))), 페이지 매김 작업 (평균적으로 O(N/2))을 수행한다. 레코드가 너무 많으면 매우 느려야합니다. 데이터 저장 방법을 다시 설계해야합니다.

성능 향상을 위해 Redis 'SORTED SET을 사용하십시오. 점수로 레코드의 TotalCountSORTED SET 주어진 Id의 모든 기록을 저장

. 당신이 데이터를 가져해야하는 경우

, 당신은 O(log(N) + limit)의 페이지 매김 작업을 수행 할 ZREVRANGE 명령을 사용할 수 있습니다, N는 주어진 Id에 대한 기록의 수입니다. 훨씬 빨라야합니다.

// add records for Id1 
zadd Id1 TotalCount1 record1 
zadd Id1 TotalCount2 record2 
// ... 
zadd Id1 TotalCountN recordN 
// pagination for the given Id, page (beginning from 1) and limit 
zrevrange Id1 (page-1)*limit page*limit-1 
+0

답변 해 주셔서 감사합니다. 나는 정렬 된 세트를 검색했다, 그들은 페이징에 좋지만, 정렬 된 세트를 사용하여 여러 필드를 정렬 할 수 있습니까? –

+1

@AhmedHassan 점수에 따라 정렬되기 때문에 (사실 모든 요소의 점수가 같으면'zrangebylex'와 같이 사전 순으로 정렬 할 수 있습니다.), 여러 필드를 정렬하려면 몇 가지 작업을해야합니다 트릭, 즉 여러 필드로 점수를 생성하십시오. 예를 들어'A'와'B'를 모두 정렬하고'B'가'[0-9]'의 범위에 있다고 가정하면 다음과 같이 점수를 생성 할 수 있습니다 :'A * 10 + B' . 이러한 점수를 생성 할 수없는 경우 여러 필드를 정렬 할 수 없습니다. –