redis 의 대폭 적 인 성능 향상 을 위 한 파이프(PipeLine)와 대량(Batch)작업
static void Main(string[] args)
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("192.168.23.151:6379");
var db = redis.GetDatabase();
var productID = string.Format("productID_{0}", 1);
for (int i = 0; i < 10; i++)
{
var customerID = i;
db.SetAdd(productID, customerID);
}
}
질문그러나 위의 이 코드 에 큰 문제 가 존재 합 니 다.Redis 자체 가 tcp 를 기반 으로 하 는 Request/Response protocol 모드 입 니 다.믿 지 않 으 면 wireshark 로 감시 할 수 있 습 니 다.
그림 에서 볼 수 있 듯 이 192.168.23.1=>192.168.23.151 간 의 데이터 가 왕복 되 고 전송 내용 에서 도 productid 라 는 것 을 볼 수 있다.xxx 의 접두사,
만약 에 백만 번 의 랜 과 같은 round trip 이 있다 면 이 지연 성 은 우리 가 예상 한 고성능 에 이 르 지 못 할 것 이다.
2.해결 방안[Batch]
마침 기 존의 업 무 를 바탕 으로 저 는 정기 적 으로 대량의 productid 와 customerid 를 그룹 별로 통합 시 킨 다음 에 batch 형식 으로 특정한 produt 의 set 에 삽입 할 수 있 습 니 다.그 다음 에 저 는 위의 코드 를 다음 과 같이 바 꿀 수 있 습 니 다.
static void Main(string[] args)
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("...:");
var db = redis.GetDatabase();
var productID = string.Format("productID_{}", );
var list = new List<int>();
for (int i = ; i < ; i++)
{
list.Add(i);
}
db.SetAdd(productID, list.Select(i => (RedisValue)i).ToArray());
}
캡 처 에서 전 송 된 request,response 를 통 해 알 수 있 듯 이 이번 에는 우리 가 한꺼번에 과거 에 제출 하면 인터넷 전송 에 있어 서 가 져 온 어색 함 이 매우 적다.
질문
product 차원 의 초상 화 는 우리 가 해결 할 수 있 지만 우 리 는 customerid 의 차원 이 있다.즉,나 는 customerid 를 key 로 하 는 set 집합 을 유지 해 야 한다.그 중에서 value 의 값 은 이 customerid 의 각종 평균 값 이다.예 를 들 어'총 거래 횟수','총 거래 금액'이다.등등 이러한 취 합 정 보 를 보 내 고 보 내 온 것 은 대량의 customerid 입 니 다.즉,당신 은 정기 적 으로 작은 흡입 set 집합 을 유지 해 야 합 니 다.이런 상황 에서 어떤 set 의 대량 작업 은 정 해 지지 않 습 니 다.원본 코드 는 다음 과 같 습 니 다:
static void Main(string[] args)
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("...:");
var db = redis.GetDatabase();
// : customeridlist, ordertotalprice,
var orderTotalPrice = ;
var customerIDList = new List<int>();
for (int i = ; i < ; i++)
{
customerIDList.Add(i);
}
//foreach redis set
foreach (var item in customerIDList)
{
var customerID = string.Format("customerid_{}", item);
db.SetAdd(customerID, orderTotalPrice);
}
}
4.해결 방안[PipeLine]=위의 코드 는 생산 에 있어 서 당연히 통 하지 않 습 니 다.그러나 이런 문제 에 대해 redis 는 관련 해결 방안 을 제 시 했 습 니 다.그것 이 바로 pipeline 체제 입 니 다.원 리 는 똑 같 습 니 다.명령 집합 을 통합 시 켜 하나의 request 요청 을 통 해 함께 보 내 고 redis 내부 fake 에서 client 를 내 어 대량으로 실행 합 니 다.코드 는 다음 과 같 습 니 다.
static void Main(string[] args)
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("...:");
var db = redis.GetDatabase();
// : customeridlist, ordertotalprice,
var orderTotalPrice = ;
var customerIDList = new List<int>();
for (int i = ; i < ; i++)
{
customerIDList.Add(i);
}
var batch = db.CreateBatch();
foreach (var item in customerIDList)
{
var customerID = string.Format("customerid_{}", item);
batch.SetAddAsync(customerID, orderTotalPrice);
}
batch.Execute();
}
그리고 아래 와 이 어 샤 크 캡 처 를 보면 SADD 라 는 작은 명령 이 많이 있 습 니 다.이 는 많은 명령 이 함께 지나 가 고 성능 을 크게 향상 시 켰 다 는 뜻 입 니 다.마지막 으로 redis 를 다시 볼 수 있 습 니 다.데이터 도 있 습 니 다.시원 하 죠?
192.168.23.151:6379> keys *
1) "customerid_0"
2) "customerid_9"
3) "customerid_1"
4) "customerid_3"
5) "customerid_8"
6) "customerid_2"
7) "customerid_7"
8) "customerid_5"
9) "customerid_6"
10) "customerid_4"
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redis 해시에 대한 완벽한 가이드변경 가능하므로 필요에 따라 쉽게 변경하고 업데이트할 수 있습니다. Redis 해시는 구조가 평평하므로 JSON에서와 같이 여러 수준을 가질 수 없습니다. redis 해시의 명명 규칙은 hash:key 로 입력되므로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.