Redis
Esta extensão provê suporte para conectar a servidores Redis. Ela registra o serviço
redis.asyncio.Redis
.
Utilização
Primeiro instale o extra redis
:
Defina as propriedades de configuração:
Injete o serviço Redis
:
from typing import Annotated
from redis.asyncio import Redis
from selva.di import service, Inject
@service
class MyService:
# default service
redis: Annotated[Redis, Inject]
# named service
other_redis: Annotated[Redis, Inject(name="other")]
Conexões Redis também podem ser definidas com nome de usuário e senha separados da url, ou até como componentes individuais:
Utilizando variáveis de ambiente
data:
redis:
default:
url: "${REDIS_URL}" # (1)
other: # (2)
url: "${REDIS_URL}"
username: "${REDIS_USERNAME}"
password: "${REDIS_PASSWORD}"
another: # (3)
host: "${REDIS_HOST}"
port: ${REDIS_PORT}
db: "${REDIS_DB}"
username: "${REDIS_USERNAME}"
password: "${REDIS_PASSWORD}"
- Pode ser definido com a variável de ambiente
SELVA__DATA__REDIS__DEFAULT__URL
- Pode ser definido com as variáveis de ambiente:
SELVA__DATA__REDIS__OTHER__URL
SELVA__DATA__REDIS__OTHER__USERNAME
SELVA__DATA__REDIS__OTHER__PASSWORD
- Pode ser definido com as variáveis de ambiente:
SELVA__DATA__REDIS__ANOTHER__HOST
SELVA__DATA__REDIS__ANOTHER__PORT
SELVA__DATA__REDIS__ANOTHER__DB
SELVA__DATA__REDIS__ANOTHER__USERNAME
SELVA__DATA__REDIS__ANOTHER__PASSWORD
Exemplo
from typing import Annotated
from redis.asyncio import Redis
from asgikit.responses import respond_json
from selva.di import Inject
from selva.web import get
@get
async def index(request, redis: Annotated[Redis, Inject]):
number = await redis.incr("number")
await respond_json(request.response, {"number": number})
Opções de configuração
Selva ofecere várias opções para configura o Redis. Se você precisar de mais controle
sobre o serviço Redis, você pode criar o seu próprio serviço redis.asyncio.Redis
.
As opções disponíveis são mostradas abaixo:
data:
redis:
default:
url: ""
host: ""
port: 6379
db: 0
username: ""
password: ""
options: # (1)
socket_timeout: 1.0
socket_connect_timeout: 1.0
socket_keepalive: false
socket_keepalive_options:
TCP_KEEPIDLE: 100,
TCP_KEEPCNT: 100,
TCP_KEEPINTVL: 100,
unix_socket_path: ""
encoding: ""
encoding_errors: "strict" # ou "ignore", "replace"
decode_responses: false
retry_on_timeout: false
retry_on_error: []
ssl: false
ssl_keyfile: ""
ssl_certfile: ""
ssl_cert_reqs: ""
ssl_ca_certs: ""
ssl_ca_data: ""
ssl_check_hostname: false
max_connections: 1
single_connection_client: false
health_check_interval: 1
client_name: ""
lib_name: ""
lib_version: ""
auto_close_connection_pool: false
protocol: 3
retry:
retries: 1
supported_errors: # (2)
- package.module.Class
backoff: # (3)
no_backoff:
constant:
backoff: 1
exponential:
cap: 1
base: 1
full_jitter:
cap: 1
base: 1
equal_jitter:
cap: 1
base: 1
decorrelated_jitter:
cap: 1
base: 1
- Valores de
options
são descritos emredis.asyncio.Redis
. - Caminho para classes python.
- Apenas uma opção em
backoff
deve ser definida.