2014-07-14 6 views
1

특정 패턴을 따르는 문자열 목록이 있습니다. 여기에 내가 미리의 첫 두 필드를 알고 다음문자열 목록을 단일 패턴으로 변환

'ratelimiter:foobar:201401011* 

같은이 목록을 표현하는 BLOB 패턴으로 끝낼려고

['ratelimiter:foobar:201401011157', 
'ratelimiter:foobar:201401011158', 
'ratelimiter:foobar:201401011159', 
'ratelimiter:foobar:201401011200'] 

예입니다. 세 번째 필드는 타임 스탬프이며 다른 열의 값과 다른 값을 갖기 시작하는 열을 찾고 싶습니다.

주어진 예제에서 타임 스탬프의 범위는 2014-01-01-11 : 57에서 2014-01-01-12 : 00이고 다른 열은 마지막 열에서 세 번째로 1이 2로 변경됩니다. 그 다음 찾을 수 있습니다 문자열을 [:-3] += '*' (이 예제의 경우)

때마다 나는이 문제를 해결하기 위해 노력할 때마다 루프를 끝내고 찾을 수 있습니다. 나는 이것을하는 더 좋은 방법이있는 것처럼 느낍니다.

아니면 누군가가 redis으로 이것을하는 더 좋은 방법을 알고 있습니다. 나는 redis 키를 얻으려고하기 때문에 모든 키에 대한 요청을 만들고 싶지 않고 패턴 매개 변수를 사용하여 일괄 요청을합니다. 아마 이것을하는 더 좋은 방법이 있지만 아직 아무것도 발견하지 못했을 것입니다.

감사

답변

2

패턴을 알고 (타임 스탬프로 변환에게 아마 최고의하지만) 나는 가장 긴 접두사를 찾기 위해 그렇게 할 것 :

items = ['ratelimiter:foobar:201401011157', 
'ratelimiter:foobar:201401011158', 
'ratelimiter:foobar:201401011159', 
'ratelimiter:foobar:201401011200'] 

print items[0][:[len(set(x)) == 1 for x in zip(*items)].index(False)] + '*' 
# ratelimiter:foobar:201401011* 

로 읽 첫 번째 요소를 잘라을 여기서 items의 모든 n 번째 요소는 더 이상 동일하지 않습니다. 나는 모든 요소 items

2

이 내가 무엇을 할 것입니다 : (목록이 정렬되지 않은 경우)

  1. 가 최대와 최소를 찾을 수에 타임 스탬프를 변환은
  2. 사이의 차이를 가지고 최대 및 최소 및 패턴으로 다시 변환하십시오.

예를 들어, 귀하의 경우 최대 값과 최소값의 차이는 43입니다. 그리고 최소값은 이미 57입니다. 최소값이 *** 157로 끝나면 최대 값은 **이어야합니다 * 200. 그리고 당신은 패턴 일에 머무는

1

에서 동일한 경우

[len(set(x)) == 1 for x in zip(*items)]은 매우 slow--이기 때문에 거의 생산 레디 스에서 '*'매개 변수를 사용하고 싶지는 않을 난에 대한 진실되고 부울의 목록을 반환합니다 대다수의 경우 개별적으로 각 키를 요청하는 것보다 훨씬 느립니다. 네트워크를 통해 전송하는 데이터의 양이 병목 현상이 많은 많은 키를 요청하지 않는 한 (실제로 컨텍스트를 Lua으로 변환하고 논리 서버 측을 실행해야 함) pipeline은 필요.

파이프 라인을 원하는 이유는 현재 별도의 홉 (hop)에있는 Redis 서버간에 데이터를주고받는 비용이 많이 듭니다.이와는 대조적으로 파이프 라인은 Redis에 대비하여 실행하기 위해 많은 명령을 대기열에 넣은 다음 준비가되면 즉시 실행합니다. 당신이 (당신이하지 않으면, 당신이 정말로해야한다) redis-py를 사용하는 가정 및 r 것은 당신의 레디 스 서버에 연결, 당신은과 같이이 작업을 수행 할 수 있습니다

r = redis.Redis(...) 
pipe = r.pipeline() 
items = ['ratelimiter:foobar:201401011157', 
'ratelimiter:foobar:201401011158', 
'ratelimiter:foobar:201401011159', 
'ratelimiter:foobar:201401011200'] 
for item in items: 
    pipe.get(item) 
#all the values for each item you're getting from Redis will be here. 
item_values = pipe.execute() 

를이는 것 Redis를 한 번 호출하면 각 값을 개별적으로 얻거나 패턴 선택을 실행하는 것보다 훨씬 빠릅니다.

다른 모든 답변은 좋은 파이썬 답이지만, 당신은 레디 스 문제를 다루고 있습니다. Redis 응답이 필요합니다.

관련 문제