2017-03-11 2 views
1

stackexhange.redis C#을 사용하여 각기 다른 만료 시간을 가진 N 개의 (독립적 인) 항목을 자주 redis 캐시에 추가해야 클라이언트 측에서 최소 시간이 있고 서버 측에서 최소 & 블로킹이 발생합니다. Redis 서버는 초당 수백 건의 요청을받을 것이므로 시간을 낭비하고 싶지는 않습니다.stackexchange redis 캐시 성능

나는 here 문서를 읽고 대답은 here입니다. 이 작업을 수행하는 단일 메서드를 찾을 수 없습니다. 다른 옵션 고려 :

  1. 트랜잭션 사용 - 서버 측에서 모든 작업을 차단합니다. 따라서 올바른 해결책이 아니어야합니다.
  2. 일괄 처리 사용 - 모든 일괄 작업이 완료 될 때까지 클라이언트 쪽에서 모든 작업을 차단합니다. 이것은 올바른 해결책이되어서는 안됩니다.
  3. 파이프 라이닝 사용 - 클라이언트 측과 서버 측에서 어떤 작업도 차단하지 않습니다. 그러나 다중 요청 (N 미만의 패킷)은 더 많은 네트워크를 소비하지만 클라이언트 측에서 메모리 소비를 증가시켜 대기 시간을 유발할 수 있습니다.
  4. Fire and forget 사용 - 클라이언트 측과 서버 측에서 어떤 작업도 차단하지 않습니다. 그러나 더 많은 네트워크 대역폭을 소비하지만 클라이언트 쪽에서는 메모리 소비가없는 여러 요청 (파이프 라이닝보다 많은 패킷)을 보냅니다.

어떤 접근 방식이 가장 좋을까요? 경쟁 오퍼레이션은 2 개의 삽입을 의미하고 하나의 삽입과 삽입은 서로 다른 키에 액세스 할 수 있지만 함께 갈 수 없다고 가정했습니다. 나는이 점을 바르게 알고 있습니까? 그렇지 않다면 무엇을 의미합니까?

답변

0

Redis는 데이터베이스에서 읽기 또는 쓰기 중일 때 단일 스레드입니다.

귀하의 사례에서 가장 좋은 해결책은 무엇입니까? 누구도 알다시피, 많은 변수에 의존 할 수 있으며 올바른 솔루션을 구현하기 위해 각 유스 케이스를 개별적으로 분석해야합니다.

응용 프로그램 계층에서 문제가 발생하면 데이터를 손상시키지 않으려면 Redis MULTI을 피할 수 없습니다. 실제로 Redis에 대한 많은 요청을 피하려면 Lua scripts을 사용해야합니다.

반면에 Redis의 요점은 많은 작업을 수행하려고하지만 Redis 단일 스레드 특성으로 인해 가능한 작게 만들어야한다는 것입니다. 네가 너무 오랜 시간이 걸리는 작업을 수행하지 않는다면 빠르다.

요약하면 많은 요청을 메모리 내 데이터베이스로 보내고 광속에서 작동하는 것에 대해서는별로 신경 쓰지 않습니다. 또한 시나리오를 최적화하려면 Redis Cluster (샤딩)의 경이로움을 고려하십시오.

마지막으로, 나는이 레디 스 튜토리얼에서 살펴 것입니다 : 당신은 옵션 목록, 루아 스크립트에 추가해야합니다 Redis latency problems troubleshooting

0

. EVAL을 참조하십시오.

또한 사용할 데이터 구조를 고려하십시오. 예를 들어, MSET를 사용하여 한 번의 홉으로 Redis에서 여러 값을 보낼 수 있습니다.