--- title: Change log description: Changelog of all fakeredis releases tags: - changelog - release-notes toc_depth: 2 --- ## v2.40.0 - 2026-10-04 ### πŸš€ Features - feat(json): implement `JSON.NUMPOWBY` (#602) - feat: implement `DIGEST` and `DELEX` (Redis 8.4); digests need the new `digest` extra, `pip install "fakeredis[digest]"` (#600, #601) ## v2.39.0 - 2026-10-01 ### πŸš€ Features - feat: support Redis 8.10 commands `LMOVEM`, `BLMOVEM`, `SUNIONCARD`, `SDIFFCARD`, `TS.QUERYLABELS`, `TS.NRANGE`, `TS.NREVRANGE` and `TS.READ` (#597) - feat(kividb): add the `kividb` server type, matching KiviDB 1.0.4's command surface (#570, #571) - feat(streams): `XADD`/`XTRIM` accept the `KEEPREF`/`DELREF`/`ACKED` reference policies (#583) ### πŸ› Bug Fixes - fix: `MOVE`/`SMOVE` invalidate `WATCH` like Redis, add `SORT_RO`, sort unsorted `SORT` results in scripts/`STORE`, and fix `ZSCAN` while deleting (#595) - fix(bitmap): `BITOP` pads shorter operands and treats missing keys as empty (#593) - fix(geo): `*BYMEMBER`/`FROMMEMBER` searches on a missing member return Redis'/Valkey 9's error instead of crashing (#594) - fix(valkey): `from_url` works for `FakeValkey`, `FakeStrictValkey` and `FakeAsyncValkey` (#591) - fix(streams): approximate (`~`) trimming drops whole nodes and `XADD`/`XTRIM` options use Redis' errors (#583) - fix(streams): `XADD` never reuses deleted IDs and rejects invalid IDs like Redis (#583) - fix(streams): `XGROUP SETID`/`CREATE`, `entries-read` and `lag` follow Redis' rules (#583) - fix(streams): consumer-group commands on a missing key return Redis' errors (#584) - fix(streams): `XRANGE`/`XREVRANGE`/`XPENDING` treat an end ID without sequence as the whole millisecond (#584) - fix(tdigest): `TDIGEST.QUANTILE` on a single observation follows Redis 8.10 (#597) - fix(tcp-server): `TcpFakeServer` answers RESP2 clients in RESP2 (#580) - fix(model): `ExpiringMembersSet` keeps the member when clearing its TTL (#578) - fix(async): `FakeAsyncValkey` raises `valkey` exceptions and async connections report `addr`/`laddr`/`fd` (#589) - fix: each connection gets one client ID, and a new one on reconnect (#589) - fix: `FakeRedis(version=10)` no longer shares a server with `version=1` (#589) ### 🧰 Maintenance - perf: cache glob patterns, skip empty TTL scans, and stop polling in `get_message(timeout=...)` (#577) - refactor: layer internals into `fakeredis/_core`, `fakeredis/_clients` and `fakeredis/_socket` packages (#589, #590, #592) - test: run CI against Redis 8.10 and a real KiviDB (#570, #597) - test: drop stale TODOs and narrow Dragonfly zset test skips (#596) - test: drop `from __future__ import annotations` from test files (#586) - chore: update dependencies and the `setup-uv` action (#587) ## v2.38.0 - 2026-09-08 ### πŸš€ Features - feat: implement Dragonfly's `CL.THROTTLE` rate-limiting command, ported from Dragonfly's own code so the quirks match β€” millisecond-ceiling time fields, `remaining` truncating towards zero, and an over-sized request reporting `retry_after = -1` without writing the key (#536) - feat(dragonfly): match its errors, validation and limits β€” backticked unknown-command errors, unsigned `numkeys`/`COUNT`, `SCAN COUNT 0` falling back to the default batch size, `SMOVE` checking its destination type up front, no `LCS` at all, a relative expiry past `2**28-1` seconds clamped while an absolute one is rejected, hash-field TTLs capped at `2**26` seconds, and strings capped at 256MB rather than Redis' 512MB (#555, #556) - feat(dragonfly): match the replies it sends β€” doubles from `INCRBYFLOAT`/`HINCRBYFLOAT`, empty arrays from a timed-out blocking pop and from an `XREAD`/`XREADGROUP` that matched nothing, `ZPOPMIN`/ `ZPOPMAX` always paired under RESP3, flat `WITHSCORES` from `ZUNION`/`ZINTER`, a null `first-entry`/`last-entry` for an empty stream, `-1` as `XINFO GROUPS`' unknown-lag sentinel, `XPENDING` looking up the key before the group, and one namespace for shard and plain pub/sub channels (#557, #558, #559) - feat(dragonfly): match its command behaviour β€” `SORT` without `->` hash-field patterns and without Redis' weight tie-break, `COPY` without a `DB` option, `GEORADIUS`/`GEOSEARCH` in geohash order unless sorted, a watched key dirtied by any write, Lua 5.4 scripting (non-integral numbers as doubles, Redis 6-style error wrapping, admin commands refused inside scripts), and its own JSON quirks (legacy paths wrapped like JSONPath, no filter expressions) (#560, #561, #562, #563) ### πŸ› Bug Fixes - fix: `redis.call` in a Lua script now returns RESP2 shapes whatever protocol the client negotiated, matching real Redis, where a script must opt into RESP3. `redis.setresp(2)`/`redis.setresp(3)` are now supported and reset to RESP2 for each run. Dragonfly has no `redis.setresp`, so fakeredis does not expose one when emulating it, and a script returning `{double=...}` there answers with an empty array the way the real server does (#543) - fix: `XCLAIM`/`XAUTOCLAIM` now move an entry's pending count to the claiming consumer instead of leaving it on the previous owner, so a later `XACK` no longer drives that count negative (#548) - fix: `XACK` no longer raises a raw Python `KeyError` when a pending entry has no live consumer, and `XGROUP DELCONSUMER` now removes the entries that consumer owned, returning how many it dropped (#549) - fix: `XCLAIM` now honours `RETRYCOUNT`, and `XCLAIM`/`XAUTOCLAIM` honour `JUSTID`, when updating an entry's delivery counter. `RETRYCOUNT` takes precedence over `JUSTID`, and a negative `RETRYCOUNT` means "not given" (#544) - fix: cancelling a blocking async command (`BRPOP`, `BLPOP`, `XREAD BLOCK 0`, ...) no longer leaves the connection unusable β€” it went back to the pool with its socket still paused, so every later command on it hung (#471) - fix: `XAUTOCLAIM` now returns the cursor its next scan should start from, and `0-0` once the pending list is exhausted (#547) - fix: `SMOVE` no longer raises `WRONGTYPE` for a wrongly typed destination when the source key is missing, `BITCOUNT` reports the syntax error before decoding its range arguments on a pre-7.0 server, and `GEORADIUS` returns an unsorted reply in geohash order rather than insertion order (#553) - fix: reap `TcpFakeServer` handler threads when a client disconnects (#541) ### 🧰 Maintenance - docs: `docs/dragonfly-support.md` now writes up every Dragonfly divergence fakeredis emulates, and the handful it does not (#564) - test(hypothesis): the stateful machines now run against Dragonfly in CI, with the non-deterministic corners kept out (skiplist-encoded sorted sets, hash-order aggregation, `SAVE`, short-circuiting set intersections) (#564) ## v2.37.1 - 2026-08-18 ### πŸ› Bug Fixes - fix: honor the `FILTER-EF` (max filtering effort) option in `VSIM` β€” the value was previously parsed but ignored, so a low `FILTER-EF` could return filter matches that real Redis skips - fix: `ZPOPMIN`/`ZPOPMAX` in RESP3 now return a flat `[member, score]` pair when no count is given (an array of pairs is only returned when an explicit count is passed), matching real Redis - fix: `ZPOPMIN`/`ZPOPMAX` now reject a negative count with `value is out of range, must be positive` - fix: `ZPOPMIN`/`ZPOPMAX`/`BZPOPMIN`/`BZPOPMAX`/`ZMPOP`/`BZMPOP` now delete the sorted set key once its last member is popped - fix: `LTRIM` now signals the key as modified even when the trim is a no-op, so a `WATCH` on that key correctly aborts the following transaction, matching real Redis - fix: align stream group errors with Redis β€” `XPENDING` on a missing key or unknown group now raises `NOGROUP` instead of returning `0`/an empty array, and neither `XPENDING` nor `XINFO GROUPS` creates the key as a side effect (#532) ### 🧰 Maintenance - perf: `VADD`/`VSIM` keep a row-oriented matrix of the vector set resident and reuse it, instead of restacking every stored vector on each call; re-adding an existing member now replaces its row rather than leaving a stale one - perf: cache compiled `JSONPath` objects in the JSON stack mixin (#538) - build: drop Python 3.9, target Python 3.10+ (#534) - Update to redis-py 8.1 - refactor: modernize typing for Ruff 0.16 defaults (#533) - test: refactor hypothesis tests ## v2.37.0 - 2026-07-22 ### πŸš€ Features - feat: implement connection commands `RESET`, `CLIENT KILL`, `CLIENT UNBLOCK`, `CLIENT REPLY`, `CLIENT PAUSE`, `CLIENT UNPAUSE`, `CLIENT NO-EVICT` and `CLIENT NO-TOUCH`. `CLIENT PAUSE` validates and records its arguments but does not actually suspend command processing; the client-side caching commands (`CLIENT TRACKING`, `CLIENT TRACKINGINFO`, `CLIENT CACHING`, `CLIENT GETREDIR`) remain unsupported - feat: support `INCREX` command (redis 8.8) (#520) - feat: support `FPHA` argument in `JSON.SET` to force homogeneous numeric arrays to a floating-point type (redis 8.8) ( #523) - feat: support hash field subkey notifications (redis 8.8) (#525) - feat: support multiple aggregators in `TS.RANGE`/`TS.REVRANGE`/`TS.MRANGE`/`TS.MREVRANGE` (redis 8.8) (#524) - feat: support `COUNT` aggregator in `ZUNION`/`ZINTER`/`ZUNIONSTORE`/`ZINTERSTORE` (redis 8.8) (#522) - feat: support `CLAIM min-idle-time` option in `XREADGROUP` (redis 8.4) (#527) - feat(bitfield): support `#`-prefixed offsets in `BITFIELD` ### πŸ› Bug Fixes - fix: align `XNACK` with redis 8.8 semantics (#521) - fix: `HEXPIRE`/`HPEXPIRE` now raise an error on negative expiration time - fix: `GEOADD` now rejects longitude/latitude pairs outside the valid range - fix: validate command option values that real Redis rejects instead of silently acting on them β€” negative expirations in `HGETEX`/`HSETEX`, non-positive `COUNT`/`numkeys` in `LMPOP`/`BLMPOP`/`ZMPOP`/`BZMPOP` and `SINTERCARD`, negative `LPOS` `COUNT`/`MAXLEN`, out-of-range `COPY` `DB` index, negative blocking timeouts, non-positive `SCAN`/`SSCAN`/`HSCAN`/`ZSCAN` `COUNT`, and invalid `BITCOUNT`/`BITPOS` range arguments (#528) ### 🧰 Maintenance - Update to redis-py 8.0.1 - Update Valkey version used in CI to 8.1.8 - refactor: reorganize and clean up command classes in `_commands.py` and related mixins - test: skip subkey notification tests on redis-py below 5 (#526) - doc: fix link to implement command guide (#519) ## v2.36.2 - 2026-06-17 ### πŸ› Bug Fixes - fix: replace async `can_read` busy-poll with event-based wakeup (#506) - fix: enforce `GT`/`LT` conditions in `ZADD` with `INCR` (#507) - fix: reject negative `LIMIT` in `SINTERCARD` and `ZINTERCARD` (#508) - fix: EXPIRE GT/LT mishandle keys with no existing TTL (#509) - fix: restore missing `addr`/`laddr`/`fd` fields in `CLIENT LIST`/`CLIENT INFO` (#512) - fix: SORT/SORT_RO BY must keep natural order (#510) ## v2.36.1 - 2026-06-05 ### πŸ› Bug Fixes - fix: `TypeError` on import in Python 3.8 due to `list[Any]` annotation in `sort` command (#490) - fix: Using path in connection - fix(async): `_decode` recurses into `dict` so RESP3 `HGETALL` responses are decoded (#492) - fix: `Database` now uses stable identity-based `__hash__`/`__eq__` (previously returned an unstable hash) ### 🧰 Maintenance - Restored support for redis-py 4.6 #493 - Update the default server version to 8. - refactor: deduplicate sync and async client construction into a shared `build_client_kwds` helper - chore: remove dead code in connection/socket setup ## v2.36.0 - 2026-05-29 ### πŸš€ Features - Implement keyspace notifications @alexbthundiyil-spec (#463) - feat(lua): add server global alias for Valkey @przemub (#480) - feat(streams): implement `XACKDEL`, `XDELEX`, `XIDMPRECORD`, `XNACK` commands (#484) - feat: add `VISMEMBER` command to check element existence in vector set - feat: implement array commands (`ARSET`, `ARGET`, `ARLEN`, `ARGETRANGE`, `ARINSERT`, `ARDEL`, etc.) for Redis 8.8 ( #487) ### πŸ› Bug Fixes - fix: XREADGROUP with non-'>' ID returns consumer PEL @tomtom103 #470 - fix: similarity calculation in vector set `VSIM` command - fix: `CF.RESERVE` and `CF.SCANDUMP` should not create keys if they do not exist - fix: various issues in vector set commands `VSET` - fix(tcp_server): clean up handler threads on shutdown (#479) ### 🧰 Maintenance - Improved `CLIENT INFO` and `CLIENT GETNAME` commands - Better TDigest implementation - Update Redis 8 image used in CI to 8.8 - Update to redis-py 8.0.0 - perf(hash): make HSET O(1) by using len(h) instead of len(h.keys()) @invoker-bot (#473) - refactor: introduce `CommandsMixinBase` to centralise shared mixin attributes (#482) - refactor: VectorSet improvements (#476) - refactor: async Redis tests to use `AsyncClientType` for improved type safety ## v2.35.1 - 2026-04-09 ### πŸ› Bug Fixes - fix: Breaking change in 2.35.0: FakeConnection renamed without backward-compatible alias #468 ## v2.35.0 - 2026-04-09 ### πŸš€ Features - Support for idempotent message processing introduced in Redis 8.6 #461 - Support for vector set commands `VADD`, `VCARD`, `VDIM`, `VEMB`, `VGETATTR`, `VINFO`, `VLINKS`, `VRANDMEMBER`, `VRANGE`, `VREM`, `VSETATTR`, `VSIM` #451 ### πŸ› Bug Fixes - fix XREADGROUP on multiple streams only returns one message #460 - fix: XDEL sending ResponseError when stream ID is invalid #465 - Fix DeprecationWarning caused by mixing valkey and redis classes @kurtmckee #462 #464 - fix: bug referencing non existing variable #465 ### 🧰 Maintenance - Update typing-extensions version constraint to support newer versions #458 - Improved documentation with mermaidjs diagrams #467 - Move documentation dependencies to pyproject.toml ## v2.34.1 - 2026-02-24 ### πŸ› Bug Fixes - Fix handling of deprecated arguments in `FakeRedis` to support redis-py 7.2.0 #457 - Blocking `XREAD` with `block=0` works as expected #453 ## v2.34.0 - 2026-02-16 ### πŸš€ Features - TcpFakeServer supports RESP3 #437 ### πŸ› Bug Fixes - Add missing keys to `XINFO STREAM` #445 - Caching LuaRuntime to prevent memory leak in eval() @chrisguidry #449 #446 ### 🧰 Maintenance - Refactor models to use BaseModel with redis-type #454 ## v2.33.0 - 2025-12-16 ### πŸš€ Features - Implement `MSETEX` (From Redis 8.4) ### πŸ› Bug Fixes - fix[FakeAsyncRedis]: FakeAsyncRedis supports protocol=3 #442 - fix[TcpFakeServer]: TcpFakeServer supports pub/sub #431 - fix[TcpFakeServer]: preserve whitespace in bulk strings @oliverhaas #435 ### 🧰 Maintenance - Update tests to support redis-py 7.1.0 and Redis 8.4 - Async tests run on resp3 and resp2 ## v2.32.1 - 2025-11-03 ### πŸ› Bug Fixes - fix:support for py3.7 #423 - fix:`xpending_range` to return all 4 required fields per Redis spec @zzstoatzz #427 - fix[TcpFakeServer]: add exception prefix #432 ### 🧰 Maintenance - Update tests to support redis-py 7.0.1 - Update tests to support valkey 9.0.0 ## v2.32.0 - 2025-10-02 ### πŸš€ Features - add support for nx/xx/gt/lt options for expireat/pexpire/pexpireat @praboud-ant #421 ### πŸ› Bug Fixes - fix:removing use of self.protocol to support redis-py < 5 #419 - fix:race condition due to closing socket in TCPFakeRequestHandler:finish #420 ## v2.31.3 - 2025-09-21 ### πŸ› Bug Fixes - Fix checking valkey exceptions in async client #416 - Fix issue with `TS.MRANGE` filters with IN condition not working @ben-swid #414 #415 - Fix issue trying to import `valkey` when connection class is `FakeRedis` #417 ## v2.31.2 - 2025-09-08 ### πŸ› Bug Fixes - `TcpFakeServer` does not require lupa to be installed (only if Lock is used) #413 ## v2.31.1 - 2025-08-31 ### πŸ› Bug Fixes - Sending lib_name and lib_version only when relevant #408 - TcpFakeServer: Closing threads on server close #409 - TcpFakeServer: Register Lock scripts #406 ### 🧰 Maintenance - Improve documentation of using `TcpFakeServer` #409 - Support TcpFakeServer for Python 3.9 (#411) ## v2.31.0 - 2025-08-10 ### πŸš€ Features - Add native cjson support for lua redis scripts #399 @ItsDrike ### πŸ› Bug Fixes - version init argument typing #401 - include `lib_name` and `lib_version` in `FakeBaseConnectionMixin` - when using `FakeValkey`, raise `valkey.ResponseError` instead of `redis.ResponseError` #402 - fix issue with pytest-asyncio #404 @seifertm ## v2.30.3 - 2025-07-29 ### πŸ› Bug Fixes - Import `Callable` from `typing` to support python 3.8 #398 - FakeValkey init arguments #400 ## v2.30.2 - 2025-07-28 ### πŸ› Bug Fixes - Import `Callable` from `typing` to support python 3.8 #398 ### 🧰 Maintenance - Refactor tests - `FakeValkey` uses valkey-py instead of redis-py ## v2.30.1 - 2025-06-19 ### πŸ› Bug Fixes - Move `LICENSE` file to fakeredis/ on build #395 - Show warning for deprecated parameter only if the parameter is included in instantiation #384 ### 🧰 Maintenance - Replace deprecated event_loop fixture @mgorny #396 ## v2.30.0 - 2025-06-16 ### πŸš€ Features - Support for RESP3 #360 - Implement support for `COPY` @ajhetherington #383 ### πŸ› Bug Fixes - aio.FakeRedis: Using `inspect` to get `__init__` parameters #384 - Discrepancy when using xread with resp3 #393 ## v2.29.0 - 2025-05-06 ### πŸš€ Features - Implement support for `NOVALUES` for `HSCAN` - Implement support for `CLIENT LIST` #376 ### πŸ› Bug Fixes - Fix `json.set` nx arg behavior #372 - Fix issue with `hset` not resetting expiration over field - Fix inconsistent 'pending' field in return from XINFO GROUPS #374 - Fix `TDIGEST.QUANTILE` to match redis behavior on a TDigest with one value #377 - Fix `HINCRBY`/`hincrbyfloat` commands now don't remove ttl from hash key @M1ha-Shvn #381 ### 🧰 Maintenance - Running redis-stack tests on redis8 #382 ## v2.28.1 - 2025-04-02 ### πŸ› Bug Fixes - Open commands.json with encoding specified #367 - Fix `xadd` to use last timestamp if the current system timestamp is lower than the last timestamp #368 ## v2.28.0 - 2025-03-25 ### πŸš€ Features - implement support for `WITHSCORE` in `ZRANK` and `ZREVRANK` #357 - implement support for Connection commands `HELLO`, `CLIENT SETNAME`, `CLIENT GETNAME`, `CLIENT ID`, `CLIENT INFO` #361 - implement support for `HGETEX`, `HSETEX`, `HGETDEL` #365 ### πŸ› Bug Fixes - Fix `test_tcp_server_started` to close the connection @mgorny (#363) - [ACL] Always allow `AUTH` command @wakonig (#362) - [ACL] Provide `default` account acl on startup @wakonig (#362) ### 🧰 Maintenance - Refactor hypothesis tests (#366) ## v2.27.0 - 2025-02-10 ### πŸš€ Features - ACL commands support #338 - `ACL LOAD`, `ACL SAVE`, `ACL LIST`, `ACL USERS`, `ACL GETUSER`, `ACL SETUSER`, `ACL DELUSER`, `ACL CAT`, `ACL LOG`, `ACL HELP`, `ACL WHOAMI`, `ACL GENPASS`, `ACL AUTH`, `ACL LOG_RESET`, `ACL LOG_COUNT`, `ACL LOG_GET`, `ACL LOG_HELP`, `ACL LOG_RESET`, `ACL LOG_COUNT`, `ACL LOG_GET`, `ACL LOG_HELP` - Add support disable_decoding in async read_response #349 - Implement support for `SADDEX`, using a new set implementation with support for expiring members #350 ### 🧰 Maintenance - Remove end of life python 3.8 from test matrix - Add python 3.13 to test matrix - Improve documentation for Dragonfly/Valkey support ## v2.26.2 - 2024-12-15 ### πŸ› Bug Fixes - Fix bug in `xreadgroup` when stream length is less than COUNT with BLOCK #344 ### 🧰 Maintenance - Implement test for `SADDEX` (Dragonfly specific command) #348 - Update dependencies ## v2.26.1 - 2024-10-25 ### πŸ› Bug Fixes - Minor fix: using typing_extensions instead of typing for python 3.7 support #341/#343 ## v2.26.0 - 2024-10-24 ### πŸš€ Features - Support for server-type specific commands #340 - Support for Dragonfly `SADDEX` command #340 ### πŸ› Bug Fixes - Fix bug in bitpos function for the clear bit mode @Diskein #337 ## v2.25.1 - 2024-09-30 ### πŸ› Bug Fixes - Fix missing default values for version/server_type in `FakeBaseConnectionMixin` #334 ## v2.25.0 - 2024-09-27 ### πŸš€ Features - Implement support for hash expiration related commands @j00bar #328 - `HEXPIRE`, `HEXPIREAT`, `HEXPIRETIME`, `HPERSIST`, `HPEXPIRE`, `HPEXPIREAT`, `HPEXPIRETIME`, `HPTTL`, `HTTL`, - Implement support for `SORT_RO` #325, `EXPIRETIME` #323, and `PEXPIRETIME` #324 - Support for creating a tcp server listening to multiple clients - Testing against valkey 8.0 #333 - Improve documentation #332 ### πŸ› Bug Fixes - Replace `typing_extensions` dependency with `typing-extensions` #330 ## v2.24.1 - 2024-08-26 ### πŸ› Bug Fixes - Fix license file added to site-packages #320 ## v2.24.0 - 2024-08-24 ### πŸš€ Features - Support for TIME SERIES commands (no support for align arguments on some commands) #310 ### πŸ› Bug Fixes - fix:xrevrange to work with exclusive ranges @hurlenko #319 ### 🧰 Maintenance - Update all dependencies, particularly pytest to v8 - Add tests against Dragonfly server #318 - Implement decocator `unsupported_server_types` to enable excluding tests from running against certain server types #318 ## v2.23.5 - 2024-08-03 ### πŸ› Bug Fixes - fix:issue with async connection and blocking operations writing responses twice to socket #316 ## v2.23.4 - 2024-07-30 ### πŸ› Bug Fixes - fix:move random seed to HeavyKeeper to avoid issues #315 ### 🧰 Maintenance - Documented how to use fakeredis with FastAPI. @ sjjessop #292 - Using black for linting python code. ## v2.23.3 - 2024-06-29 ### 🧰 Maintenance - docs: Full code for FastAPI integration (#312) ### πŸ› Bug Fixes - Fix ttl for empty stream #313 ## v2.23.2 - 2024-05-14 ### πŸ› Bug Fixes - Fix reading multiple streams with blocking #309 ## v2.23.1 - 2024-05-10 ### πŸ› Bug Fixes - Fix `XREAD` behavior when `COUNT` is not provided but `BLOCKING` is provided #308 ## v2.23.0 - 2024-05-05 ### πŸš€ Features - Support for TDigest commands: `TDIGEST.ADD`,`TDIGEST.BYRANK`,`TDIGEST.BYREVRANK`,`TDIGEST.CDF`, `TDIGEST.CREATE`, `TDIGEST.INFO`, `TDIGEST.MAX`, `TDIGEST.MERGE`, `TDIGEST.MIN`, `TDIGEST.QUANTILE`, `TDIGEST.RANK`, `TDIGEST.RESET`, `TDIGEST.REVRANK`, `TDIGEST.TRIMMED_MEAN`. ### πŸ› Bug Fixes - Import `Self` from typing vs. typing_extension ### 🧰 Maintenance - Update dependencies - Add redis-py 5.0.4 to tests - Update lupa version constraint #306 @noamkush ## v2.22.0 - 2024-04-19 ### πŸš€ Features - Support for setting LUA version from environment variable `FAKEREDIS_LUA_VERSION` #287 - Support for loading LUA binary modules in fakeredis #304 ### πŸ› Bug Fixes - Fix the type hint for the version parameter in the async client #302 - Using LUA 5.1 like real redis #287 - fix: FakeRedisMixin.from_url() return type is really Self. @ben-xo #305 ## v2.21.3 - 2024-03-12 ### πŸ› Bug Fixes - Revert behavior of defaulting to share the same server data structure between connections @howamith #303 - Fix type hint for version #302 ## v2.21.2 - 2024-03-10 > Note: Since connection params are defaulted to be the same between async and sync connections, different FakeRedis > connections with the same connection params (or without connection parameters) will share the same server data > structure. ### πŸ› Bug Fixes - Connection params are defaulted to be the same between async and sync connections #297 - `xinfo_stream` raises exception when stream does not exist #296 ## v2.21.1 - 2024-02-15 ### πŸ› Bug Fixes - Support for float timeout values #289 ### 🧰 Maintenance - Fix django cache documentation #286 ## v2.21.0 - 2024-01-30 ### πŸš€ Features - Implement all TOP-K commands (`TOPK.INFO`, `TOPK.LIST`, `TOPK.RESERVE`, `TOPK.ADD`, `TOPK.COUNT`, `TOPK.QUERY`, `TOPK.INCRBY`) #278 - Implement all cuckoo filter commands #276 - Implement all Count-Min Sketch commands #277 ### πŸ› Bug Fixes - Fix XREAD blocking bug #274 #275 - EXAT option does not work #279 ### 🧰 Maintenance - Support for redis-py 5.1.0b3 - Improve `@testtools.run_test_if_redispy_ver` - Refactor bloom filter commands implementation to use [pyprobables](https://github.com/barrust/pyprobables) instead of pybloom_live ## v2.20.1 - 2023-12-13 ### πŸ› Bug Fixes - Fix `XREAD` bug #256 ### 🧰 Maintenance - Testing for python 3.12 - Dependencies update ## v2.20.0 - 2023-10-21 ### πŸš€ Features - Implement `BITFIELD` command #247 - Implement `COMMAND`, `COMMAND INFO`, `COMMAND COUNT` #248 ## v2.19.0 - 2023-09-25 ### πŸš€ Features - Implement Bloom filters commands #239 ### πŸ› Bug Fixes - Fix error on blocking XREADGROUP #237 ## v2.18.1 - 2023-09-08 ### πŸ› Bug Fixes - Fix stream type issue #233 ### 🧰 Maintenance - Add mypy hints to everything - Officially for redis-py 5.0.0, redis 7.2 ## v2.18.0 - 2023-08-14 ### πŸš€ Features - Implement `PUBSUB NUMPAT` #195, `SSUBSCRIBE` #199, `SPUBLISH` #198, `SUNSUBSCRIBE` #200, `PUBSUB SHARDCHANNELS` #196, `PUBSUB SHARDNUMSUB` #197 ### πŸ› Bug Fixes - Fix All aio.FakeRedis instances share the same server #218 ## v2.17.0 - 2023-07-18 ### πŸš€ Features - Implement `LPOS` #207, `LMPOP` #184, and `BLMPOP` #183 - Implement `ZMPOP` #191, `BZMPOP` #186 ### πŸ› Bug Fixes - Fix incorrect error msg for the group not found #210 - fix: use the same server_key within the pipeline when issued watch #213 - issue with ZRANGE and ZRANGESTORE with BYLEX #214 ### Contributors We'd like to thank all the contributors who worked on this release! @OlegZv, @sjjessop ## v2.16.0 - 2023-07-04 ### πŸš€ Features - Implemented support for `JSON.MSET` #174, `JSON.MERGE` #181 ### πŸ› Bug Fixes - Add support for `version` for async FakeRedis #205 ### 🧰 Maintenance - Updated how to test django_rq #204 ## v2.15.0 - 2023-06-19 ### πŸš€ Features - Implemented support for various stream groups commands: - `XGROUP CREATE` #161, `XGROUP DESTROY` #164, `XGROUP SETID` #165, `XGROUP DELCONSUMER` #162, `XGROUP CREATECONSUMER` #163, `XINFO GROUPS` #168, `XINFO CONSUMERS` #168, `XINFO STREAM` #169, `XREADGROUP` #171, `XACK` #157, `XPENDING` #170, `XCLAIM` #159, `XAUTOCLAIM` #158 - Implemented sorted set commands: - `ZRANDMEMBER` #192, `ZDIFF` #187, `ZINTER` #189, `ZUNION` #194, `ZDIFFSTORE` #188, `ZINTERCARD` #190, `ZRANGESTORE` #193 - Implemented list commands: - `BLMOVE` #182, ### 🧰 Maintenance - Improved documentation. ## v2.14.2 ### πŸ› Bug Fixes - Fix documentation link ## v2.14.1 - 2023-06-06 ### πŸ› Bug Fixes - Fix requirement for packaging.Version #177 ## v2.14.0 - 2023-06-05 ### πŸš€ Features - Implement `HRANDFIELD` #156 - Implement `JSON.MSET` ### 🧰 Maintenance - Improve streams code ## v2.13.0 - 2023-05-21 ### πŸ› Bug Fixes - Fixed xadd timestamp (fixes #151) (#152) - Implement XDEL #153 ### 🧰 Maintenance - Improve test code - Fix reported security issue ## v2.12.1 - 2023-05-09 ### πŸ› Bug Fixes - Add support for `Connection.read_response` arguments used in redis-py 4.5.5 and 5.0.0 - Adding state for scan commands (#99) ### 🧰 Maintenance - Improved documentation (added async sample, etc.) - Add redis-py 5.0.0b3 to GitHub workflow ## v2.12.0 - 2023-05-07 ### πŸš€ Features - Implement `XREAD` #147 ## v2.11.2 - 2023-04-27 ### πŸ› Bug Fixes - Unique FakeServer when no connection params are provided (#142) ## v2.11.1 - 2023-04-25 ### 🧰 Maintenance - Minor fixes supporting multiple connections - Update documentation ## v2.11.0 - 2023-04-22 ### πŸš€ Features - connection parameters awareness: Creating multiple clients with the same connection parameters will result in the same server data structure. ### πŸ› Bug Fixes - Fix creating fakeredis.aioredis using url with user/password (#139) ## v2.10.3 - 2023-04-03 ### 🧰 Maintenance - Support for redis-py 5.0.0b1 - Include tests in sdist (#133) ### πŸ› Bug Fixes - Fix import used in GenericCommandsMixin.randomkey (#135) ## v2.10.2 - 2023-03-21 ### πŸ› Bug Fixes - Fix async_timeout usage on py3.11 (#132) ## v2.10.1 - 2023-03-15 ### πŸ› Bug Fixes - Enable testing django-cache using `FakeConnection`. ## v2.10.0 - 2023-02-28 ### πŸš€ Features - All geo commands implemented ## v2.9.2 - 2023-02-20 ### πŸ› Bug Fixes - Fix bug for `xrange` ## v2.9.1 - 2023-02-19 ### πŸ› Bug Fixes - Fix bug for `xrevrange` ## v2.9.0 - 2023-02-14 ### πŸš€ Features - Implement `XTRIM` - Add support for `MAXLEN`, `MAXID`, `LIMIT` arguments for `XADD` command - Add support for `ZRANGE` arguments for `ZRANGE` command [#127](https://github.com/cunla/fakeredis-py/issues/127) ### 🧰 Maintenance - Relax python version requirement #128 ## v2.8.0 - 2023-02-10 ### πŸš€ Features - Support for redis-py 4.5.0 [#125](https://github.com/cunla/fakeredis-py/issues/125) ### πŸ› Bug Fixes - Fix import error for redis-py v3+ [#121](https://github.com/cunla/fakeredis-py/issues/121) ## v2.7.1 - 2023-02-04 ### πŸ› Bug Fixes - Fix import error for NoneType #527 ## v2.7.0 - 2023-02-03 ### πŸš€ Features - Implement `JSON.ARRINDEX`, `JSON.OBJLEN`, `JSON.OBJKEYS` , `JSON.ARRPOP`, `JSON.ARRTRIM`, `JSON.NUMINCRBY`, `JSON.NUMMULTBY`, `XADD`, `XLEN`, `XRANGE`, `XREVRANGE` ### 🧰 Maintenance - Improve json commands implementation. - Improve commands documentation. ## v2.6.0 - 2023-01-27 ### πŸš€ Features - Implement `JSON.TYPE`, `JSON.ARRLEN` and `JSON.ARRAPPEND` ### πŸ› Bug Fixes - Fix encoding of None (#118) ### 🧰 Maintenance - Start skeleton for streams commands in `streams_mixin.py` and `test_streams_commands.py` - Start migrating documentation to https://fakeredis.readthedocs.io/ **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.5.0...v2.6.0 ## v2.5.0 - 2023-01-21 #### πŸš€ Features - Implement support for `BITPOS` (bitmap command) (#112) #### πŸ› Bug Fixes - Fix json mget when dict is returned (#114) - fix: proper export (#116) #### 🧰 Maintenance - Extract param handling (#113) #### Contributors We'd like to thank all the contributors who worked on this release! @Meemaw, @Pichlerdom **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.4.0...v2.5.0 ## v2.4.0 - 2022-12-24 #### πŸš€ Features - Implement `LCS` (#111), `BITOP` (#110) #### πŸ› Bug Fixes - Fix a bug the checking type in scan\_iter (#109) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.3.0...v2.4.0 ## v2.3.0 - 2022-12-15 #### πŸš€ Features - Implement `GETEX` (#102) - Implement support for `JSON.STRAPPEND` (json command) (#98) - Implement `JSON.STRLEN`, `JSON.TOGGLE` and fix bugs with `JSON.DEL` (#96) - Implement `PUBSUB CHANNELS`, `PUBSUB NUMSUB` #### πŸ› Bug Fixes - ZADD with XX \& GT allows updates with lower scores (#105) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.2.0...v2.3.0 ## v2.2.0 - 2022-12-04 #### πŸš€ Features - Implement `JSON.CLEAR` (#87) - Support for [redis-py v4.4.0](https://github.com/redis/redis-py/releases/tag/v4.4.0) #### 🧰 Maintenance - Implement script to create issues for missing commands - Remove checking for deprecated redis-py versions in tests **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.1.0...v2.2.0 ## v2.1.0 - 2022-11-28 #### πŸš€ Features - Implement json.mget (#85) - Initial json module support - `JSON.GET`, `JSON.SET` and `JSON.DEL` (#80) #### πŸ› Bug Fixes - fix: add nowait for asyncio disconnect (#76) #### 🧰 Maintenance - Refactor how commands are registered (#79) - Refactor tests from redispy4\_plus (#77) #### Contributors We'd like to thank all the contributors who worked on this release! @hyeongguen-song, @the-wondersmith **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v2.0.0...v2.1.0 ## v2.0.0 - 2022-11-18 #### πŸš€ Breaking changes - Remove support for aioredis separate from redis-py (redis-py versions 4.1.2 and below). (#65) #### πŸš€ Features - Add support for redis-py v4.4rc4 (#73) - Add mypy support (#74) #### 🧰 Maintenance - Separate commands to mixins (#71) - Use release-drafter - Update GitHub workflows **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.10.1...v2.0.0 ## v1.10.1 - 2022-11-08 #### What's Changed * Implement support for `zmscore` by @the-wondersmith in #67 #### New Contributors * @the-wondersmith made their first contribution in #67 **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.10.0...v1.10.1 ## v1.10.0 - 2022-10-24 #### What's Changed * implement `GETDEL` and `SINTERCARD` support in #57 * Test get float-type behavior in #59 * Implement `BZPOPMIN`/`BZPOPMAX` support in #60 **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.9.4...v1.10.0 ## v1.9.4 - 2022-10-15 ### What's Changed * Separate LUA support to a different file in [#55](https://github.com/cunla/fakeredis-py/pull/55) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.9.3...v1.9.4 ## v1.9.3 - 2022-09-27 ### Changed * Removed python-six dependency **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.9.2...v1.9.3 ## v1.9.2 - 2022-09-27 #### What's Changed * zadd support for GT/LT in [#49](https://github.com/cunla/fakeredis-py/pull/49) * Remove `six` dependency in [#51](https://github.com/cunla/fakeredis-py/pull/51) * Add host to `conn_pool_args` in [#51](https://github.com/cunla/fakeredis-py/pull/51) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.9.1...v1.9.2 ## v1.9.1 - 2022-09-04 #### What's Changed * Zrange byscore in [#44](https://github.com/cunla/fakeredis-py/pull/44) * Expire options in [#46](https://github.com/cunla/fakeredis-py/pull/46) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.9.0...v1.9.1 ## v1.9.0 - 2022-07-30 #### What's Changed * Enable redis7 support in [#42](https://github.com/cunla/fakeredis-py/pull/42) **Full Changelog**: https://github.com/cunla/fakeredis-py/compare/v1.8.2...v1.9.0 ## v1.8.2 - 2022-07-23 #### What's Changed * Update the `publish` GitHub action to create an issue on failure by @terencehonles in [#33](https://github.com/dsoftwareinc/fakeredis-py/pull/33) * Add `release draft` job in [#37](https://github.com/dsoftwareinc/fakeredis-py/pull/37) * Fix input and output type of cursors for SCAN commands by @tohin in [#40](https://github.com/dsoftwareinc/fakeredis-py/pull/40) * Fix passing params in argsβ€”Fix #36 in [#41](https://github.com/dsoftwareinc/fakeredis-py/pull/41) #### New Contributors * @tohin made their first contribution in [#40](https://github.com/dsoftwareinc/fakeredis-py/pull/40) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/v1.8.1...v1.8.2 ## v1.8.1 - 2022-06-06 #### What's Changed * fix: allow redis 4.3.* by @terencehonles in [#30](https://github.com/dsoftwareinc/fakeredis-py/pull/30) #### New Contributors * @terencehonles made their first contribution in [#30](https://github.com/dsoftwareinc/fakeredis-py/pull/30) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/v1.8...v1.8.1 ## v1.8 - 2022-05-27 #### What's Changed * Fix handling url with username and password in [#27](https://github.com/dsoftwareinc/fakeredis-py/pull/27) * Refactor tests in [#28](https://github.com/dsoftwareinc/fakeredis-py/pull/28) * 23 - Re-add dependencies lost during switch to poetry by @xkortex in [#26](https://github.com/dsoftwareinc/fakeredis-py/pull/26) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/v1.7.6.1...v1.8 ## v1.7.6 - 2022-05-24 #### Added * add `IMOVE` operation by @BGroever in [#11](https://github.com/dsoftwareinc/fakeredis-py/pull/11) * Add `SMISMEMBER` command by @OlegZv in [#20](https://github.com/dsoftwareinc/fakeredis-py/pull/20) #### Removed * Remove Python 3.7 by @nzw0301 in [#8](https://github.com/dsoftwareinc/fakeredis-py/pull/8) #### What's Changed * fix: work with `redis.asyncio` by @zhongkechen in [#10](https://github.com/dsoftwareinc/fakeredis-py/pull/10) * Migrate to poetry in [#12](https://github.com/dsoftwareinc/fakeredis-py/pull/12) * Create annotation for redis4+ tests in [#14](https://github.com/dsoftwareinc/fakeredis-py/pull/14) * Make aioredis and lupa optional dependencies in [#16](https://github.com/dsoftwareinc/fakeredis-py/pull/16) * Remove aioredis requirement if redis-py 4.2+ by @ikornaselur in [#19](https://github.com/dsoftwareinc/fakeredis-py/pull/19) #### New Contributors * @nzw0301 made their first contribution in [#8](https://github.com/dsoftwareinc/fakeredis-py/pull/8) * @zhongkechen made their first contribution in [#10](https://github.com/dsoftwareinc/fakeredis-py/pull/10) * @BGroever made their first contribution in [#11](https://github.com/dsoftwareinc/fakeredis-py/pull/11) * @ikornaselur made their first contribution in [#19](https://github.com/dsoftwareinc/fakeredis-py/pull/19) * @OlegZv made their first contribution in [#20](https://github.com/dsoftwareinc/fakeredis-py/pull/20) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/v1.7.5...v1.7.6 #### Thanks to our sponsors this month - @beatgeek ## v1.7.5 - 2022-05-14 #### What's Changed * Fix python3.8 redis4.2+ issue in [#6](https://github.com/dsoftwareinc/fakeredis-py/pull/6) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/v1.7.4...v1.7.5 ## v1.7.4 - 2022-05-07 #### What's Changed * Support for python3.8 in [#1](https://github.com/dsoftwareinc/fakeredis-py/pull/1) * Feature/publish action in [#2](https://github.com/dsoftwareinc/fakeredis-py/pull/2) **Full Changelog**: https://github.com/dsoftwareinc/fakeredis-py/compare/1.7.1...v1.7.4