2017-10-03 16 views
0

I 포함하는 다양한 숫자 (비는-반복) (목록, 소트 세트, 어쩌면 단순한 문자열이 될 수있다) 뭔가를해야하고 나는 예를 들어 일부레디 스 값을 전환 원자

을 전환 할 수 있어야합니다

LRANGE todo:20 0 -1 => "2" "5" "6" "7" 

내 스위치를 수행 : 목록과

:

MULTI 

LRANGE todo:20 0 1 => "2" "5" (store them) 
LSET todo:20 0 "5" 
LSET todo:20 1 "2" 

EXEC 

최종 결과를 즉

LRANGE todo:20 0 -1 => "5" "2" "6" "7" 

내가 더 간단하게 (또는 더 나은) 방식으로 이것을 수행 할 수있는 방법이 있습니까, 아니면 REDIS의 "제한 사항"입니까?

답변

1

SORT 명령을 사용할 수 있습니다.

SET에 해당 색인을 저장하고 각 색인에 대해 해당 점수/무게를 저장하고 정렬하십시오. 점수 키는 해시 일 수 있으며 여러 가지 점수 집합을 가질 수 있습니다.

예 : 매개 변수 3 개, 삽입 시간, 실행에 걸리는 시간 및 우선 순위가있는 할 일 목록. 당신이 해시 또는 동일한 레디 스의 DB에서 다른 키에 작업 자체 (또는 다른 데이터)를 저장하면 당신에게,

127.0.0.1:6379> SORT todos by todos:*->insertionTime 
1) "1" 
2) "2" 
3) "3" 
127.0.0.1:6379> SORT todos by todos:*->executionTime 
1) "3" 
2) "1" 
3) "2" 
127.0.0.1:6379> SORT todos by todos:*->priority 
1) "2" 
2) "1" 
3) "3" 

:

127.0.0.1:6379> SADD todos 1 2 3 
127.0.0.1:6379> HMSET todos:1 insertionTime 1 executionTime 10 priority 5 
127.0.0.1:6379> HMSET todos:2 insertionTime 2 executionTime 25 priority 1 
127.0.0.1:6379> HMSET todos:3 insertionTime 5 executionTime 4 priority 7 

목록은 각각으로 분류하려면 옵션 GET 인수와 같은 단일 통화에서 그것을 얻을 수 있습니다 : 여러 키를 액세스로 SORT 명령 레디 스 클러스터와 함께 작동하지 않습니다

127.0.0.1:6379> HSET todos:1 task "do something" 
127.0.0.1:6379> HSET todos:2 task "do something else" 
127.0.0.1:6379> HSET todos:3 task "do this other thing" 

127.0.0.1:6379> SORT todos by todos:*->priority get todos:*->task 
1) "do something else" 
2) "do something" 
3) "do this other thing" 

참고. 그리고이 명령 시간 복잡성은 매우 높을 수 있습니다. 특히 사용법과 설정 크기가 커질 때 조심해서 사용해야합니다.

0

당신은 그것을하는 Lua 스크립트를 작성한 다음 트랜잭션 대신에 호출 할 수 있습니다. 모듈을 사용할 수도 있지만 요청이 간단하면 잔인 할 수 있습니다.