Redis is not a reliable database by design. In case of problems on the server side, partial or complete loss of data is possible. When a master migrates, the entire Redis cluster may become unavailable for several tens of seconds. The specific latency value should be determined for each Redis configuration separately (depending on the size of the database, server location, etc.).
Every command that is sent to the server has the potential to fail. Moreover, the client may receive error information (for example, a timeout), but the command on the server may succeed. Therefore, Redis commands should be idemponent. If this is not possible for some reason, then care should be taken to ensure that incomplete groups of commands/resent commands do not leave the database in an inconsistent state.
Redis command has a timeout, number of replays, and a global timeout. If a response is not received from the server within the timeout, then the same command is sent to another server in the cluster, and so on either until the limit on the number of repetitions is reached, or when the global timeout is reached. These settings can be changed via redis::CommandControl.
Warning
For the above reasons, it is recommended to prefer PostgreSQL database over Redis. However it is fine to use Redis as a distributed cache.
To use Redis you must add the component components::Redis and configure it according to the documentation. After that you can make requests via storages::redis::Client:
// Throws redis::RequestCancelledException if Redis was not
// fast enough to answer
return result.Get();
}
Redis driver does not guarantee that the cancelled request was not executed by the server.
Redis Cluster Autotopology
Cluster autotopology makes it possible to do resharding of the cluster without Secdist changes and service restart.
With this feature entries in the Secdist are now treated not as a list of all the cluster hosts, but only as input points through which the service discowers the configuration of the entire cluster. Therefore, it is not recommended to delete instances that are listed in secdist from the cluster.
The cluster configuration is checked
at the start of the service
and periodically
and if a MOVED response is received from Redis
If a change in the cluster topology was detected during the check (hashslot distribution change, master change, or new replicas discowered), then the internal representation of the topology is recreated, the new topology is gets ready (new connections may appear in it), and after that the active topology is replaced.
Enabling/Disabling Redis Cluster Autotopology
At the moment aotopology could be nables via an experiment in static config of a service:
#yaml
userver_experiments:
- redis-cluster-autotopology
The autotopology could be disabled by the dynamic config option REDIS_CLUSTER_AUTOTOPOLOGY_ENABLED_V2.