[BUGFIX] Prevent race conditions in Redis backend
There is a theoretical possibility that inconsistent data will be stored
in the cache backend for remove() or freeze() since the code is not
fully transactional. Adding a WATCH command makes the transaction
conditionally by using optimistic locking.