복붙노트

[REDIS] 레디 스 클러스터 : 루아 스크립트와 다른 노드에 키 업데이트

REDIS

레디 스 클러스터 : 루아 스크립트와 다른 노드에 키 업데이트

여러 개의 노드로 구성된 레디 스 클러스터가 있습니다. 나는 하나의 원자 작업으로 3 개의 다른 키를 업데이트 할. 내 루아 스크립트 같다 :

local u1 = redis.call('incrby', KEYS[1], ARGV[1])
local u2 = redis.call('incrby', KEYS[2], ARGV[1])
local u3 = redis.call('incrby', KEYS[3], ARGV[1])

그리고 나는 그것을 함께 발사 :

EVAL script 3 key1 key2 key3 arg

그러나 나는 (요청에 AppErr CROSSSLOT 키 동일한 슬롯에 해시를하지 않는) RESP 경고를 받았습니다. 위의 작업을 수행 할 수 없으며, 업데이트가 실패합니다. 내가 하나의 루아 스크립트를 사용하여 서로 다른 노드에있는 키를 수정할 수 없습니다 보인다. 그러나 문서에 따르면 :

내가만큼 내가 규칙을 통과하는 키를 따를 생각 그래서, 스크립트는 레디 스 클러스터와 호환되어야합니다. 여기 문제가 무엇을 궁금해 나는 하나의 스크립트에서 모든 키를 업데이트하려면 어떻게해야.

해결법

  1. ==============================

    1.난 당신이 문서를 오해 한 두려워. (그리고 나는 그것이 매우 명확하지 동의합니다.)

    난 당신이 문서를 오해 한 두려워. (그리고 나는 그것이 매우 명확하지 동의합니다.)

    레디 스 작업, 명령이나 루아 스크립트 여부, 할 수있는 모든 키가 같은 서버에있는 경우에만 작동합니다. 키 통과 규칙의 목적은 클러스터 서버가 스크립트를 전송하고 모든 키 (귀하의 경우에 무슨 일이 있었는지입니다) 동일한 서버에서 오지 않는 경우 빠른 실패 할 위치를 알아낼 수 있도록하는 것입니다.

    그래서 당신이에 조작하려는 모든 키가 같은 서버에있는 것을 확인하는 것은 귀하의 책임입니다. 그렇게하는 방법은 동일한 슬롯에 해시에 힘 키에 해시 태그를 사용하는 것입니다. 그에 대한 자세한 내용은 설명서를 참조하십시오.

  2. from https://stackoverflow.com/questions/38234507/redis-cluster-update-keys-in-different-node-with-lua-script by cc-by-sa and MIT license