저는 redis-py를 사용하여 python을 통한 redis 인터페이스를 사용하고 있습니다. 저는 해시 키를 원자 적으로 업데이트해야하지만, 업데이트하기 전에 먼저 해당 키의 값을 검색해야합니다. 설명서를 살펴보면 파이프 라인과 WATCH 명령을 사용하여 키가 변경된 시점을 확인할 수있는 것처럼 보입니다. 어쨌든 해시 내부의 키를 볼 수 있습니까? 아니면 단일 키에서만 작동합니까?redis-py 시계 해시 키
3
A
답변
0
1
해시 키를 직접 볼 수는 없지만 지금은 Redis에서 지원하지 않습니다. 하지만 당신은 추가를 사용하여 문자열 키를 "잠금"하고, 키 어떤 해시 K
은 아래 절차를 수행해야하는 사용자의 해시 값을 수정하는 사람에 의해 계약을 정의 할 수 있습니다 :
- 시계
lock:K
- HGET K를 , 현재 값 저장
- MULTI를 시작하십시오.
- SET
lock:K
"" - EXEC
이 updated_value
/**
* Concurrently updates Redis string and hash value under the specified key.
*
* @param redisCli Redis client.
* @param hashName Hash name.
* @param objId Object ID.
* @param transFun Cache object transformation function (i.e. a modification that we need to apply).
* @param cbFun Callback function, to which a modified object is passed in case of success.
*/
exports.redisUpdateHashConcurrently = function(redisCli, hashName, objId, transFun, cbFun) {
var lockKey = hashName + ':' + objId + ':lock';
redisCli.watch(lockKey); // Step 1.
redisCli.hget(hashName, objId, function(err, obj) { // Step 2.
if (err) {
redisCli.unwatch();
cbFun && cbFun(undefined, err);
return;
}
if (obj) {
var modObj = transFun(JSON.parse(obj));
var value = JSON.stringify(modObj);
redisCli.multi() // Step 3.
.set(lockKey, '') // Step 4.
.expire(lockKey, 3)
.hset(hashName, objId, value) // Step 5.
.exec(function(err, replies) { // Step 6.
if (!replies) { // Object was modified by someone else, retry.
exports.redisUpdateHashConcurrently(redisCli, hashName, objId, transFun, cbFun);
}
else { // We have succeeded.
cbFun && cbFun(modObj, undefined);
}
});
}
else {
redisCli.unwatch();
}
});
};
주 당신이 당신의 "잠금"키에 대한 TTL을 지정할 수 있습니다 : 이것은 파이썬 질문이지만
, 나는 (단지 아이디어를 보여주기 위해) 위 계약을 구현하는 NodeJS 기능을 제공 그래서 그들은 결국 제거됩니다.
관련 문제
- 1. 해시 맵 오브젝트 키
- 2. 루비 배열 해시 키
- 3. Perl 스레드와 해시 키
- 4. 해시 키 검색 방법
- 5. 해시 테이블 키 생성
- 6. PHP 해시 키 배열
- 7. 루비 성능 : 다중 키 해시
- 8. 버킷 인스턴스에 대한 해시 키
- 9. Facebook 앱 키 해시 사용
- 10. Perl의 임의/셔플 해시 키
- 11. 해시 키 URL 매개 변수?
- 12. 루비 : 삭제 여러 해시 키
- 13. 오브젝트에서 해시 맵 키 제거
- 14. 해시 키 및 값으로 작업하기
- 15. Facebook Android-sdk 키 해시
- 16. 자바 스크립트 해시 키 hasOwnProperty
- 17. 스칼라의 해시 맵 키 비교
- 18. (void *) 데이터의 해시 키 생성
- 19. 배열 대 해시 키 검색
- 20. TypeScript의 해시 테이블과 대시가있는 키
- 21. 시계
- 22. 해시 함수 : 해시 키 (데이터 개체의 이름)를 XY 좌표로
- 23. 해시 해시 정렬
- 24. 키 배열에 의해 중첩 된 해시 키 값을 얻기는
- 25. 배열에 의해 결정되는 Perl 해시 키
- 26. perl - 올바른 해시 키 찾기 조건 설정
- 27. 그림자에 대한 Python의 2y-blowfish 해시 키
- 28. 해시 테이블에서 값으로 키 가져 오기 C#
- 29. Perl : 해시 참조로 키 배열에 액세스
- 30. 해시 맵에서 키 목록을 반환하는 방법은 무엇입니까?
안녕하세요. 나는 또한 원자 해적으로 특정 해시 키의 값을 업데이 트해야합니다 ... 전체 해시 아마 지켜 볼 수 있지만 경쟁 조건은 매우 자주 발생합니다. – geronime
단수 키의 경우 WATCH 및 MULTI로 할 수 있습니다. 하지만 해시 키 내부에서 WATCH 키를 얻으려고합니다. –