New Features:
* Multiple job executions: a job can now have multiple executions running simultaneously. This will enable future support for long running scheduled jobs. Thanks selwin!
* `Worker(default_worker_ttl=10)` is deprecated in favor of `Worker(worker_ttl=10)`. Thanks stv8!
* Added a `cleanup` parameter to `registry.get_job_ids()` and `registry.get_job_count()`. Thanks anton-daneyko-ultramarin!
* Added support for AWS Elasticache Serverless Redis. Thanks bobbywatson3!
* You can now specify TTL for deferred jobs. Thanks hberntsen!
* RQ's code base is now typed (mostly). Thanks terencehonles!
* Other minor fixes and improvements. Thanks hongquan, rbange, jackkinsella, terencehonles, wckao, sim6!
Breaking Changes:
* Dropped support for Redis server < 4
* `RoundRobinWorker` and `RandomWorker` are deprecated. Use `--dequeue-strategy <round-robin/random>` instead.
* `Job.__init__` requires both `id` and `connection` to be passed in.
* `Job.exists()` requires `connection` argument to be passed in.
* `Queue.all()` requires `connection` argument.
* `job` decorator now requires `connection` argument.
* Built in Sentry integration has been removed. To use Sentry with RQ, please refer to [Sentry's docs](https://docs.sentry.io/platforms/python/integrations/rq/).
Bug Fixes:
* Fixed an issue where abandoned jobs are sometimes not enqueued. Thanks Marishka17!
* Fixes an issue where Redis connection does not expose `name` attribute. Thanks wckao!
* `job.get_status()` will now always return `JobStatus` enum. Thanks indepndnt!
* Queue key should always be created even if jobs are deferred. Thanks sim6!
* RQ's pubsub thread will now attempt to reconnect on Redis connection errors. Thanks fcharlier!