Redis 목록을 사용하여 리미터를 만들고 있는데 대부분 예상대로 작동하지만 최근에 만료 시간이 없는 일부 키가 있다는 것을 발견했습니다. 이상적으로는 값을 목록에 "rpush"하고 트랜잭션의 만료 시간을 설정하고 트랜잭션이 시작되기 전에 "watch"도 사용합니다.
jmeter를 사용하여 1초에 500개 요청과 같은 관련 API를 일괄 요청해도 이 버그는 내 로컬 환경에서 재현되지 않습니다
예측: v2.1.2 PHP 7.4 Redis 서버 5.0.10
이것은 내 로컬 Redis 서버에서 예상되는 작업입니다
Redis 트랜잭션은 원자적입니다. 원자성은 모든 명령이 처리되거나 명령이 처리되지 않음을 의미합니다. 따라서 내 경우에는 키에 만료 날짜가 있어야 합니다.
Redis 트랜잭션은 원자 트랜잭션이 아닙니다. 명령의 트랜잭션이 실행되는 동안 다른 프로세스가 키 공간에 액세스할 수 없기 때문에 원자적입니다. 트랜잭션 내의 명령이 실패하면 후속 명령이 실행되고 롤백되지 않습니다.
예를 들어 잘못된 명령이 포함된 트랜잭션을 실행해 보겠습니다.
으아아아여기서 목록이 존재하는지 확인하고 목록에 몇 가지 초기 항목을 추가합니다. 그런 다음 트랜잭션 내에서 목록에서 항목을 꺼내고 실수로 키를 생각하여 새 항목을 추가하려고 합니다.
mylist
拥有一个集合,然后设置键mylist。第一个和第三个命令成功,最后,
mylist
设置了生存时间。第二个命令失败。为此,Redis 中没有内置回滚功能 - 您的应用程序需要通过watch
명령은 낙관적 잠금을 사용합니다... 이는 트랜잭션이 트랜잭션이 원하는 것을 얻기 전에 다른 프로세스의 변경 사항을 감지하는 것입니다. 변경된 키 서버에 독점적으로 접근할 수 있습니다. 롤백 메커니즘이 아닙니다.세부정보: https://redis.io/docs/interact/transactions/