Considere duas transações simultâneas ocorrendo à meia-noite. Ambos podem executar get(dt_key), mas um executará primeiro o bloco MULTI/EXEC. Ele irá redefinir o contador, definir a nova data, incrementar o contador. O segundo entrará também em seu bloco MULTI/EXEC, mas como o valor de 'dt' mudou, a execução falhará e incr_daily_number será chamado novamente. Desta vez get(dt_key) retornará a nova data, então quando o bloco MULTI/EXEC for executado, o contador será incrementado sem nenhum reset. As duas transações retornarão a nova data com valores de contador diferentes.
Então, acredito que não há condição de raça aqui, e que os casais (data, número) serão únicos.
Você também poderia ter implementado isso usando um script Lua do lado do servidor (cuja execução é sempre atômica). Geralmente é mais conveniente.
Observe que, na verdade, não existe um bloqueio Redis. O mecanismo de bloqueio disponível na API é fornecido pelo cliente Python - não pelo servidor Redis. Se você observar sua implementação, perceberá que também é baseado em blocos SETNX + WATCH/MULTI/EXEC ou scripts Lua.