redis에서 하나의 키를 삭제하고 동시에 값을 가져오고 대부분의 가져 오기를 한 명령에서 어떻게 실행합니까? 그래서 스레드로부터 안전합니다. redis에서 하나의 키를 삭제하고 동시에 해당 값을 얻는 방법
답변
단일 명령이 없습니다. Lua 스크립트를 작성하거나 트랜잭션을 실행할 수있다. 트랜잭션처럼 간단하게 보일 것이다
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> GET foo
QUEUED
127.0.0.1:6379> DEL foo
QUEUED
127.0.0.1:6379> EXEC
1) "bar"
2) (integer) 1
는 루아 스크립트
127.0.0.1:6379> SET foo bar
OK
127.0.0.1:6379> EVAL "local x = redis.call('GET', KEYS[1]); redis.call('DEL', KEYS[1]); return x" 1 foo
"bar"
127.0.0.1:6379> GET foo
(nil)
모두 같은 동작을 사용하지만, 루아 스크립트, 스크립트는 캐시 할 수있는 전체 코드를 반복 할 필요가없는 다음에 전화하고 싶을 때. 스크립트를 캐시하고 후속 호출의 함수 이름으로 사용할 고유 ID를 반환하는 SCRIPT LOAD를 사용할 수 있습니다 (대부분의 클라이언트는 이것을 투명하게 추상화합니다).
127.0.0.1:6379> SCRIPT LOAD "local x = redis.call('GET', KEYS[1]); redis.call('DEL', KEYS[1]); return x"
"89d675c84cf3bd6b3b38ab96fec7c7fb2386e4b7"
127.0.0.1:6379> SET foo bar
OK
# Now we use the returned SHA of the script to call it without parsing it again:
127.0.0.1:6379> EVALSHA 89d675c84cf3bd6b3b38ab96fec7c7fb2386e4b7 1 foo
"bar"
다른 방법으로, 그 모듈을 개발할 수도 있습니다;) (upvoted oc). –
트랜잭션에서 GET과 DEL 명령 사이에서 decr과 같은 다른 명령이 실행됩니까? – FridayLi
@FridayLi 트랜잭션을 버퍼링하는 동안에 만 트랜잭션 실행 중에 발생할 수 없습니다. –
나는 당신이 뭔가를 구현해야 할 것 같아. http://www.rediscookbook.org/get_and_delete.html –