aioredis-cluster


Nameaioredis-cluster JSON
Version 2.7.0 PyPI version JSON
download
home_page
SummaryRedis Cluster support extension for aioredis
upload_time2023-12-18 13:11:59
maintainer
docs_urlNone
author
requires_python>=3.8
license
keywords redis aioredis redis cluster asyncio
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            aioredis_cluster
================

[![PyPI version](https://img.shields.io/pypi/v/aioredis-cluster)](https://pypi.org/project/aioredis-cluster/) ![aioredis-cluster CI/CD](https://github.com/DriverX/aioredis-cluster/workflows/aioredis-cluster%20CI/CD/badge.svg)

Redis Cluster support for [aioredis](https://github.com/aio-libs/aioredis) (support only v1.x.x).

Many implementation features were inspired by [go-redis](https://github.com/go-redis/redis) project.

Requirements
------------

* [Python](https://www.python.org) 3.8+
* [async_timeout](https://pypi.org/project/async_timeout/) (only for Python < 3.11)

Features
--------

* commands execute failover (retry command on other node in cluster)
* support resharding replies ASK/MOVED
* restore cluster state from alive nodes
* one node is enough to know the topology and initialize client
* cluster state auto reload

Limitations
-----------

### Commands with limitations

* Keys in `mget`/`mset` must provide one key slot.
  ```python

  # works
  await redis.mget("key1:{foo}", "key2:{foo}")

  # throw RedisClusterError
  await redis.mget("key1", "key2")

  ```

### Commands are not supported

`Redis` methods below do not works and not supported in cluster mode implementation.
```
cluster_add_slots
cluster_count_failure_reports
cluster_count_key_in_slots
cluster_del_slots
cluster_failover
cluster_forget
cluster_get_keys_in_slots
cluster_meet
cluster_replicate
cluster_reset
cluster_save_config
cluster_set_config_epoch
cluster_setslot
cluster_readonly
cluster_readwrite
client_setname
shutdown
slaveof
script_kill
move
select
flushall
flushdb
script_load
script_flush
script_exists
scan
iscan
quit
swapdb
migrate
migrate_keys
wait
bgrewriteaof
bgsave
config_rewrite
config_set
config_resetstat
save
sync
pipeline
multi_exec
```

But you can always execute command you need on concrete node on cluster with usual `aioredis.RedisConnection`, `aioredis.ConnectionsPool` or high-level `aioredis.Redis` interfaces.


Installation
------------

```bash

pip install aioredis-cluster

```

Usage
-----

```python

import aioredis_cluster

redis = await aioredis_cluster.create_redis_cluster([
    "redis://redis-cluster-node1",
])

# or
redis = await aioredis_cluster.create_redis_cluster([
    "redis://redis-cluster-node1",
    "redis://redis-cluster-node2",
    "redis://redis-cluster-node3",
])

# or
redis = await aioredis_cluster.create_redis_cluster([
    ("redis-cluster-node1", 6379),
])

await redis.set("key", "value", expire=180)

redis.close()
await redis.wait_closed()

```

License
-------

The aioredis_cluster is offered under MIT license.

Changes
=======

2.7.0 (2023-12-18)
---------------------

Rework PubSub and fix race conditions ([#27](https://github.com/DriverX/aioredis-cluster/pull/27))

- add `aioredis_cluster.aioredis.stream` module
- rework PubSub command execution flow for prevent race conditions on spontaneously server channels unsubscribe push
- make fully dedicated `RedisConnection` implementation for cluster
- `RedisConnection` once entered in PubSub mode was never exit in them, because is too hard handle spontaneously unsubscribe events from Redis with simultaneously `(P|S)UNSUBSCRIBE` manually calls
- fully rewrite handling PUB/SUB replies/events
- for `Cluster`, `RedisConnection` and `ConnectionsPool` `in_pubsub` indicates flag when connector have in pubsub mode connections instead number of PUB/SUB channels
- add key slot handling for sharded PubSub channels in non-cluster dedicate `RedisConnection`
- fix and improve legacy `aioredis` tests
- improve support for py3.12
- improve support for Redis 7.2

2.6.0 (2023-11-02)
------------------

* fix stuck `aioredis.Connection` socket reader routine for sharded PUB/SUB when cluster reshard and Redis starts respond `MOVED` error on `SSUBSCRIBE` commands [#24](https://github.com/DriverX/aioredis-cluster/pull/24)

2.5.0 (2023-04-03)
------------------

* improve connection creation timeout
* do not lose connection in Pool while execute PING probe
* respect Pool.minsize in idle connections detector
* shuffle startup nodes for obtain cluster state

2.4.0 (2023-03-08)
------------------

* add support [Sharded PUB/SUB](https://redis.io/docs/manual/pubsub/#sharded-pubsub)
* new methods and properties `spublish`, `ssubscribe`, `sunsubscribe`, `pubsub_shardchannels`, `pubsub_shardnumsub`, `sharded_pubsub_channels`
* drop support Python 3.6, 3.7
* add support Python 3.11
* idle connections detection in connections pool
* change acquire connection behaviour from connection pool. Now connection acquire and release to pool by LIFO way for better idle connection detection
* deprecated `state_reload_frequency` option from `create_cluster` factory was removed

2.3.1 (2022-07-29)
------------------

* fix bypass `username` argument for pool creation

2.3.0 (2022-07-26)
------------------

* add support Redis 6 `AUTH` command with username
* factories `create_cluster`, `create_redis_cluster`, `aioredis_cluster.aioredis.create_connection` now support `username` argument
* add `auth_with_username` method for `AbcConnection`, `AbcPool` and impementations

2.2.2 (2022-07-19)
------------------

* fix problem when RedisConnection was GC collected after unhandled `asyncio.CancelledError`
* fix default `db` argument for pool/connection in cluster mode

2.2.1 (2022-07-18)
------------------

* (revert) apply cluster state only if cluster metadata is changed

2.2.0 (2022-07-18)
------------------

* fetch several cluster state candidates from cluster for choose best metadata for final local state
* apply cluster state only if cluster metadata is changed
* FIX: handle closed pubsub connection before gc its collected that trigger `Task was destroyed but it is pending!` message in log
* improve logging in state loader

2.1.0 (2022-07-10)
------------------

* fix bug when `ConnectionsPool.acquire()` is stuck because closed PUB/SUB connection is not cleanup from `used` set
* fix `ConnectionsPool.acquire()` incorrect wakeup order for connection waiters when connection is released
* `ConnectionsPool.execute()` now acquire dedicate connection for execution if command is blocking, ex. `BLPOP`
* `ConnectionsPool.execute()` now raises `ValueError` exception for PUB/SUB family command
* In `ConnectionsPool` PUB/SUB dedicated connections now is closing on `close()` call
* add `aioredis_cluster.abc.AbcConnection` abstract class
* add property `readonly` and method `set_readonly()` for `aioredis_cluster.abc.AbcConnection` and `aioredis_cluster.abc.AbcPool`
* `aioredis_cluster.Cluster` now require `pool_cls` implementation from `aioredis_cluster.abc.AbcPool`
* add `ssl` argument for factories `create_cluster`,  `create_redis_cluster` and `Cluster` constructor
* add 10% jitter for cluster state auto reload interval
* fix incorrect iterate free connections in `select()`, `auth()` methods for `ConnectionsPool`

2.0.0 (2022-06-20)
------------------

* include `aioredis==1.3.1` source code into `aioredis_cluster._aioredis` and introduce `aioredis_cluster.aioredis` but for compatible and migration period
* this release have not backward incompatible changes
* __DEPRECATION WARNING:__ you must migrate from `import aioredis` to `import aioredis_cluster.aioredis` because `aioredis_cluster` starts vendorize `aioredis` package and maintain it separately. Using `aioredis` package __will be removed in v3__
* fix reacquire connection in `aioredic.ConnectionsPool` after Redis node failure

1.8.0 (2022-05-20)
------------------

* Add `xadd_620` commands method for support `XADD` options for Redis 6.2+

1.7.1 (2021-12-15)
------------------

* add `ClusterState.slots_assigned`
* require reload cluster state for some cases with `UncoveredSlotError`

1.7.0 (2021-12-15)
------------------

* add `execute_timeout` for `Manager`
* improve cluster state reload logging
* reduce number of addresses to fetch cluster state
* acquire dedicate connection from pool to fetch cluster state
* extend `ClusterState` by new attributes: `state`, `state_from`, `current_epoch`

1.6.1 (2021-11-23)
------------------

* fix keys extraction for `XREAD` and `XREADGROUP` commands

1.6.0 (2021-11-20)
------------------

* make public `Address`, `ClusterNode` and `ClusterState` structs. Available by import `from aioredis_cluster import`
* `Cluster` provides some new helpful methods:
    * `get_master_node_by_keys(*keys)` - return master `ClusterNode` which contains keys `keys`
    * `create_pool_by_addr(addr, **kwargs)` - create connection pool by `addr` and return pool wrapped by `commands_factory` from `Cluster` constructor. By default is `aioredis_cluster.RedisCluster` instance.
    * `get_cluster_state()` - return `ClusterState` instance with recent known cluster state received from Redis cluster
    * `extract_keys(command_sequence)` - returns keys of command sequence
* drop `pytest-aiohttp` plugin for tests
* add `pytest-asyncio` dependency for tests
* switch `asynctest` -> `mock` library for aio tests
* drop `attrs` dependency. For Python 3.6 you need install `dataclasses`
* fix extract keys for `BLPOP`/`BRPOP` commands
* add support keys extraction for `ZUNION`, `ZINTER`, `ZDIFF`, `ZUNIONSTORE`, `ZINTERSTORE`, `ZDIFFSTORE` commands
* acquire dedicate connection from pool for potential blocking commands like `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BLMOVE`, `BLMPOP`, `BZPOPMIN`, `BZPOPMAX`, `XREAD`, `XREADGROUP`

1.5.2 (2020-12-14)
------------------

* README update

1.5.1 (2020-12-11)
------------------

* speedup crc16. Use implementation from python stdlib

1.5.0 (2020-12-10)
------------------

* remove `state_reload_frequency` from `ClusterManager`. `state_reload_interval` now is one relevant option for state auto reload
* default `state_reload_interval` increased and now is 300 seconds (5 minutes)
* commands registry loads only once, on cluster state initialize
* improve failover. First connection problem cause retry to random slot replica
* improve python3.9 support
* default `idle_connection_timeout` now is 10 minutes

1.4.0 (2020-09-08)
------------------

* fix `aioredis.locks.Lock` issue (https://github.com/aio-libs/aioredis/pull/802, [bpo32734](https://bugs.python.org/issue32734))
* now `aioredis_cluster.Cluster` do not acquire dedicate connection for every execute
* `aioredis_cluster` now requires `python>=3.6.5`

1.3.0 (2019-10-23)
------------------

* improve compatible with Python 3.8
* improve failover logic while command timed out
* read-only commands now retries if attempt_timeout is reached
* add required dependeny `async_timeout`
* `aioredis` dependency bound now is `aioredis >=1.1.0, <2.0.0`

1.2.0 (2019-09-10)
------------------

* add timeout for command execution (per execution try)
* add Cluster option `attempt_timeout` for configure command execution timeout, default timeout is 5 seconds
* Cluster.execute_pubsub() fixes

1.1.1 (2019-06-07)
------------------

* CHANGES fix

1.1.0 (2019-06-06)
------------------

* Cluster state auto reload
* new `state_reload_frequency` option to configure state reload frequency
* new `state_reload_interval` option to configure state auto reload interval
* `follow_cluster` option enable load cluster state from previous cluster state nodes
* establish connection only for master nodes after cluster state load
* change default commands_factory to aioredis_cluster.RedisCluster instead aioredis.Redis
* all cluster info commands always returns structs with str, not bytes
* `keys_master` and `all_masters` methods now try to ensure cluster state instead simply raise exception if connection lost to cluster node, for example
* `max_attempts` always defaults fix

1.0.0 (2019-05-29)
------------------

* Library full rewrite
* Cluster state auto reload
* Command failover if cluster node is down or key slot resharded

0.2.0 (2018-12-27)
------------------

* Pipeline and MULTI/EXEC cluster implementation with keys distribution limitation (because cluster)

0.1.1 (2018-12-26)
------------------

* Python 3.6+ only

0.1.0 (2018-12-24)
------------------

* Initial release based on aioredis PR (https://github.com/aio-libs/aioredis/pull/119)

Contributors
============

* [Anton Ilyushenkov](https://github.com/DriverX)
* [Vadim Pushtaev](https://github.com/VadimPushtaev)
* [erastov](https://github.com/erastov)
* [roman901](https://github.com/roman901)
* [Alexander Malev](https://github.com/aamalev)

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "aioredis-cluster",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "Anton Ilyushenkov <ilyushenkov@corp.mail.ru>",
    "keywords": "redis,aioredis,redis cluster,asyncio",
    "author": "",
    "author_email": "Anton Ilyushenkov <ilyushenkov@corp.mail.ru>",
    "download_url": "https://files.pythonhosted.org/packages/a5/3f/4d6e03480718265bff20ab343b16fe01b366697a422bda850a4b8d50b0c4/aioredis-cluster-2.7.0.tar.gz",
    "platform": "POSIX",
    "description": "aioredis_cluster\n================\n\n[![PyPI version](https://img.shields.io/pypi/v/aioredis-cluster)](https://pypi.org/project/aioredis-cluster/) ![aioredis-cluster CI/CD](https://github.com/DriverX/aioredis-cluster/workflows/aioredis-cluster%20CI/CD/badge.svg)\n\nRedis Cluster support for [aioredis](https://github.com/aio-libs/aioredis) (support only v1.x.x).\n\nMany implementation features were inspired by [go-redis](https://github.com/go-redis/redis) project.\n\nRequirements\n------------\n\n* [Python](https://www.python.org) 3.8+\n* [async_timeout](https://pypi.org/project/async_timeout/) (only for Python < 3.11)\n\nFeatures\n--------\n\n* commands execute failover (retry command on other node in cluster)\n* support resharding replies ASK/MOVED\n* restore cluster state from alive nodes\n* one node is enough to know the topology and initialize client\n* cluster state auto reload\n\nLimitations\n-----------\n\n### Commands with limitations\n\n* Keys in `mget`/`mset` must provide one key slot.\n  ```python\n\n  # works\n  await redis.mget(\"key1:{foo}\", \"key2:{foo}\")\n\n  # throw RedisClusterError\n  await redis.mget(\"key1\", \"key2\")\n\n  ```\n\n### Commands are not supported\n\n`Redis` methods below do not works and not supported in cluster mode implementation.\n```\ncluster_add_slots\ncluster_count_failure_reports\ncluster_count_key_in_slots\ncluster_del_slots\ncluster_failover\ncluster_forget\ncluster_get_keys_in_slots\ncluster_meet\ncluster_replicate\ncluster_reset\ncluster_save_config\ncluster_set_config_epoch\ncluster_setslot\ncluster_readonly\ncluster_readwrite\nclient_setname\nshutdown\nslaveof\nscript_kill\nmove\nselect\nflushall\nflushdb\nscript_load\nscript_flush\nscript_exists\nscan\niscan\nquit\nswapdb\nmigrate\nmigrate_keys\nwait\nbgrewriteaof\nbgsave\nconfig_rewrite\nconfig_set\nconfig_resetstat\nsave\nsync\npipeline\nmulti_exec\n```\n\nBut you can always execute command you need on concrete node on cluster with usual `aioredis.RedisConnection`, `aioredis.ConnectionsPool` or high-level `aioredis.Redis` interfaces.\n\n\nInstallation\n------------\n\n```bash\n\npip install aioredis-cluster\n\n```\n\nUsage\n-----\n\n```python\n\nimport aioredis_cluster\n\nredis = await aioredis_cluster.create_redis_cluster([\n    \"redis://redis-cluster-node1\",\n])\n\n# or\nredis = await aioredis_cluster.create_redis_cluster([\n    \"redis://redis-cluster-node1\",\n    \"redis://redis-cluster-node2\",\n    \"redis://redis-cluster-node3\",\n])\n\n# or\nredis = await aioredis_cluster.create_redis_cluster([\n    (\"redis-cluster-node1\", 6379),\n])\n\nawait redis.set(\"key\", \"value\", expire=180)\n\nredis.close()\nawait redis.wait_closed()\n\n```\n\nLicense\n-------\n\nThe aioredis_cluster is offered under MIT license.\n\nChanges\n=======\n\n2.7.0 (2023-12-18)\n---------------------\n\nRework PubSub and fix race conditions ([#27](https://github.com/DriverX/aioredis-cluster/pull/27))\n\n- add `aioredis_cluster.aioredis.stream` module\n- rework PubSub command execution flow for prevent race conditions on spontaneously server channels unsubscribe push\n- make fully dedicated `RedisConnection` implementation for cluster\n- `RedisConnection` once entered in PubSub mode was never exit in them, because is too hard handle spontaneously unsubscribe events from Redis with simultaneously `(P|S)UNSUBSCRIBE` manually calls\n- fully rewrite handling PUB/SUB replies/events\n- for `Cluster`, `RedisConnection` and `ConnectionsPool` `in_pubsub` indicates flag when connector have in pubsub mode connections instead number of PUB/SUB channels\n- add key slot handling for sharded PubSub channels in non-cluster dedicate `RedisConnection`\n- fix and improve legacy `aioredis` tests\n- improve support for py3.12\n- improve support for Redis 7.2\n\n2.6.0 (2023-11-02)\n------------------\n\n* fix stuck `aioredis.Connection` socket reader routine for sharded PUB/SUB when cluster reshard and Redis starts respond `MOVED` error on `SSUBSCRIBE` commands [#24](https://github.com/DriverX/aioredis-cluster/pull/24)\n\n2.5.0 (2023-04-03)\n------------------\n\n* improve connection creation timeout\n* do not lose connection in Pool while execute PING probe\n* respect Pool.minsize in idle connections detector\n* shuffle startup nodes for obtain cluster state\n\n2.4.0 (2023-03-08)\n------------------\n\n* add support [Sharded PUB/SUB](https://redis.io/docs/manual/pubsub/#sharded-pubsub)\n* new methods and properties `spublish`, `ssubscribe`, `sunsubscribe`, `pubsub_shardchannels`, `pubsub_shardnumsub`, `sharded_pubsub_channels`\n* drop support Python 3.6, 3.7\n* add support Python 3.11\n* idle connections detection in connections pool\n* change acquire connection behaviour from connection pool. Now connection acquire and release to pool by LIFO way for better idle connection detection\n* deprecated `state_reload_frequency` option from `create_cluster` factory was removed\n\n2.3.1 (2022-07-29)\n------------------\n\n* fix bypass `username` argument for pool creation\n\n2.3.0 (2022-07-26)\n------------------\n\n* add support Redis 6 `AUTH` command with username\n* factories `create_cluster`, `create_redis_cluster`, `aioredis_cluster.aioredis.create_connection` now support `username` argument\n* add `auth_with_username` method for `AbcConnection`, `AbcPool` and impementations\n\n2.2.2 (2022-07-19)\n------------------\n\n* fix problem when RedisConnection was GC collected after unhandled `asyncio.CancelledError`\n* fix default `db` argument for pool/connection in cluster mode\n\n2.2.1 (2022-07-18)\n------------------\n\n* (revert) apply cluster state only if cluster metadata is changed\n\n2.2.0 (2022-07-18)\n------------------\n\n* fetch several cluster state candidates from cluster for choose best metadata for final local state\n* apply cluster state only if cluster metadata is changed\n* FIX: handle closed pubsub connection before gc its collected that trigger `Task was destroyed but it is pending!` message in log\n* improve logging in state loader\n\n2.1.0 (2022-07-10)\n------------------\n\n* fix bug when `ConnectionsPool.acquire()` is stuck because closed PUB/SUB connection is not cleanup from `used` set\n* fix `ConnectionsPool.acquire()` incorrect wakeup order for connection waiters when connection is released\n* `ConnectionsPool.execute()` now acquire dedicate connection for execution if command is blocking, ex. `BLPOP`\n* `ConnectionsPool.execute()` now raises `ValueError` exception for PUB/SUB family command\n* In `ConnectionsPool` PUB/SUB dedicated connections now is closing on `close()` call\n* add `aioredis_cluster.abc.AbcConnection` abstract class\n* add property `readonly` and method `set_readonly()` for `aioredis_cluster.abc.AbcConnection` and `aioredis_cluster.abc.AbcPool`\n* `aioredis_cluster.Cluster` now require `pool_cls` implementation from `aioredis_cluster.abc.AbcPool`\n* add `ssl` argument for factories `create_cluster`,  `create_redis_cluster` and `Cluster` constructor\n* add 10% jitter for cluster state auto reload interval\n* fix incorrect iterate free connections in `select()`, `auth()` methods for `ConnectionsPool`\n\n2.0.0 (2022-06-20)\n------------------\n\n* include `aioredis==1.3.1` source code into `aioredis_cluster._aioredis` and introduce `aioredis_cluster.aioredis` but for compatible and migration period\n* this release have not backward incompatible changes\n* __DEPRECATION WARNING:__ you must migrate from `import aioredis` to `import aioredis_cluster.aioredis` because `aioredis_cluster` starts vendorize `aioredis` package and maintain it separately. Using `aioredis` package __will be removed in v3__\n* fix reacquire connection in `aioredic.ConnectionsPool` after Redis node failure\n\n1.8.0 (2022-05-20)\n------------------\n\n* Add `xadd_620` commands method for support `XADD` options for Redis 6.2+\n\n1.7.1 (2021-12-15)\n------------------\n\n* add `ClusterState.slots_assigned`\n* require reload cluster state for some cases with `UncoveredSlotError`\n\n1.7.0 (2021-12-15)\n------------------\n\n* add `execute_timeout` for `Manager`\n* improve cluster state reload logging\n* reduce number of addresses to fetch cluster state\n* acquire dedicate connection from pool to fetch cluster state\n* extend `ClusterState` by new attributes: `state`, `state_from`, `current_epoch`\n\n1.6.1 (2021-11-23)\n------------------\n\n* fix keys extraction for `XREAD` and `XREADGROUP` commands\n\n1.6.0 (2021-11-20)\n------------------\n\n* make public `Address`, `ClusterNode` and `ClusterState` structs. Available by import `from aioredis_cluster import`\n* `Cluster` provides some new helpful methods:\n    * `get_master_node_by_keys(*keys)` - return master `ClusterNode` which contains keys `keys`\n    * `create_pool_by_addr(addr, **kwargs)` - create connection pool by `addr` and return pool wrapped by `commands_factory` from `Cluster` constructor. By default is `aioredis_cluster.RedisCluster` instance.\n    * `get_cluster_state()` - return `ClusterState` instance with recent known cluster state received from Redis cluster\n    * `extract_keys(command_sequence)` - returns keys of command sequence\n* drop `pytest-aiohttp` plugin for tests\n* add `pytest-asyncio` dependency for tests\n* switch `asynctest` -> `mock` library for aio tests\n* drop `attrs` dependency. For Python 3.6 you need install `dataclasses`\n* fix extract keys for `BLPOP`/`BRPOP` commands\n* add support keys extraction for `ZUNION`, `ZINTER`, `ZDIFF`, `ZUNIONSTORE`, `ZINTERSTORE`, `ZDIFFSTORE` commands\n* acquire dedicate connection from pool for potential blocking commands like `BLPOP`, `BRPOP`, `BRPOPLPUSH`, `BLMOVE`, `BLMPOP`, `BZPOPMIN`, `BZPOPMAX`, `XREAD`, `XREADGROUP`\n\n1.5.2 (2020-12-14)\n------------------\n\n* README update\n\n1.5.1 (2020-12-11)\n------------------\n\n* speedup crc16. Use implementation from python stdlib\n\n1.5.0 (2020-12-10)\n------------------\n\n* remove `state_reload_frequency` from `ClusterManager`. `state_reload_interval` now is one relevant option for state auto reload\n* default `state_reload_interval` increased and now is 300 seconds (5 minutes)\n* commands registry loads only once, on cluster state initialize\n* improve failover. First connection problem cause retry to random slot replica\n* improve python3.9 support\n* default `idle_connection_timeout` now is 10 minutes\n\n1.4.0 (2020-09-08)\n------------------\n\n* fix `aioredis.locks.Lock` issue (https://github.com/aio-libs/aioredis/pull/802, [bpo32734](https://bugs.python.org/issue32734))\n* now `aioredis_cluster.Cluster` do not acquire dedicate connection for every execute\n* `aioredis_cluster` now requires `python>=3.6.5`\n\n1.3.0 (2019-10-23)\n------------------\n\n* improve compatible with Python 3.8\n* improve failover logic while command timed out\n* read-only commands now retries if attempt_timeout is reached\n* add required dependeny `async_timeout`\n* `aioredis` dependency bound now is `aioredis >=1.1.0, <2.0.0`\n\n1.2.0 (2019-09-10)\n------------------\n\n* add timeout for command execution (per execution try)\n* add Cluster option `attempt_timeout` for configure command execution timeout, default timeout is 5 seconds\n* Cluster.execute_pubsub() fixes\n\n1.1.1 (2019-06-07)\n------------------\n\n* CHANGES fix\n\n1.1.0 (2019-06-06)\n------------------\n\n* Cluster state auto reload\n* new `state_reload_frequency` option to configure state reload frequency\n* new `state_reload_interval` option to configure state auto reload interval\n* `follow_cluster` option enable load cluster state from previous cluster state nodes\n* establish connection only for master nodes after cluster state load\n* change default commands_factory to aioredis_cluster.RedisCluster instead aioredis.Redis\n* all cluster info commands always returns structs with str, not bytes\n* `keys_master` and `all_masters` methods now try to ensure cluster state instead simply raise exception if connection lost to cluster node, for example\n* `max_attempts` always defaults fix\n\n1.0.0 (2019-05-29)\n------------------\n\n* Library full rewrite\n* Cluster state auto reload\n* Command failover if cluster node is down or key slot resharded\n\n0.2.0 (2018-12-27)\n------------------\n\n* Pipeline and MULTI/EXEC cluster implementation with keys distribution limitation (because cluster)\n\n0.1.1 (2018-12-26)\n------------------\n\n* Python 3.6+ only\n\n0.1.0 (2018-12-24)\n------------------\n\n* Initial release based on aioredis PR (https://github.com/aio-libs/aioredis/pull/119)\n\nContributors\n============\n\n* [Anton Ilyushenkov](https://github.com/DriverX)\n* [Vadim Pushtaev](https://github.com/VadimPushtaev)\n* [erastov](https://github.com/erastov)\n* [roman901](https://github.com/roman901)\n* [Alexander Malev](https://github.com/aamalev)\n",
    "bugtrack_url": null,
    "license": "",
    "summary": "Redis Cluster support extension for aioredis",
    "version": "2.7.0",
    "project_urls": {
        "Repository": "https://github.com/DriverX/aioredis-cluster"
    },
    "split_keywords": [
        "redis",
        "aioredis",
        "redis cluster",
        "asyncio"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "319808f0ec788a4d7ce125d5325e1fe5429abcb0106e9529ec7c8f0546776ce9",
                "md5": "d5e242d4595969dd4478e5c4c651ae84",
                "sha256": "7a0b807e337fda9dcdfac22b4fee9b16a41b47a8b22a8358f68524de8827e925"
            },
            "downloads": -1,
            "filename": "aioredis_cluster-2.7.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d5e242d4595969dd4478e5c4c651ae84",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 120841,
            "upload_time": "2023-12-18T13:11:58",
            "upload_time_iso_8601": "2023-12-18T13:11:58.042540Z",
            "url": "https://files.pythonhosted.org/packages/31/98/08f0ec788a4d7ce125d5325e1fe5429abcb0106e9529ec7c8f0546776ce9/aioredis_cluster-2.7.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a53f4d6e03480718265bff20ab343b16fe01b366697a422bda850a4b8d50b0c4",
                "md5": "33352a49f745a73a53b5c6209592836d",
                "sha256": "9b1bf8e9c8186d2e68a032d8693a8a35b1141a9570db9b8179ef144a318f6dad"
            },
            "downloads": -1,
            "filename": "aioredis-cluster-2.7.0.tar.gz",
            "has_sig": false,
            "md5_digest": "33352a49f745a73a53b5c6209592836d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 169173,
            "upload_time": "2023-12-18T13:11:59",
            "upload_time_iso_8601": "2023-12-18T13:11:59.686285Z",
            "url": "https://files.pythonhosted.org/packages/a5/3f/4d6e03480718265bff20ab343b16fe01b366697a422bda850a4b8d50b0c4/aioredis-cluster-2.7.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-12-18 13:11:59",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "DriverX",
    "github_project": "aioredis-cluster",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "aioredis-cluster"
}
        
Elapsed time: 3.12790s