{"id":1169,"name":"github.com/redis/go-redis/v9","ecosystem":"go","repository_url":"https://github.com/redis/go-redis","issues_count":2809,"created_at":"2025-06-06T15:01:41.225Z","updated_at":"2025-06-06T15:01:41.225Z","purl":"pkg:golang/github.com/redis/go-redis/v9","metadata":{"id":5954556,"name":"github.com/redis/go-redis/v9","ecosystem":"go","description":"Package redis implements a Redis client.","homepage":"https://github.com/redis/go-redis","licenses":"BSD-2-Clause","normalized_licenses":["BSD-2-Clause"],"repository_url":"https://github.com/redis/go-redis","keywords_array":[],"namespace":"github.com/redis/go-redis","versions_count":37,"first_release_published_at":"2022-06-04T15:19:49.000Z","latest_release_published_at":"2025-05-27T16:00:07.000Z","latest_release_number":"v9.9.0","last_synced_at":"2025-06-06T12:01:00.562Z","created_at":"2023-01-25T00:39:09.243Z","updated_at":"2025-06-06T12:01:00.562Z","registry_url":"https://pkg.go.dev/github.com/redis/go-redis/v9","install_command":"go get github.com/redis/go-redis/v9","documentation_url":"https://pkg.go.dev/github.com/redis/go-redis/v9#section-documentation","metadata":{},"repo_metadata":{"uuid":"5179099","full_name":"redis/go-redis","owner":"redis","description":"Redis Go client","archived":false,"fork":false,"pushed_at":"2023-04-25T15:06:09.000Z","size":4501,"stargazers_count":17085,"open_issues_count":185,"forks_count":2061,"subscribers_count":252,"default_branch":"master","last_synced_at":"2023-04-25T15:16:27.986Z","etag":null,"topics":["go","golang","redis","redis-client","redis-cluster"],"latest_commit_sha":null,"homepage":"https://redis.uptrace.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/redis.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"custom":["https://uptrace.dev/sponsor"]}},"created_at":"2012-07-25T13:01:39.000Z","updated_at":"2023-04-25T14:34:48.000Z","dependencies_parsed_at":"2023-01-13T12:55:41.476Z","dependency_job_id":null,"html_url":"https://github.com/redis/go-redis","commit_stats":null,"repository_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fgo-redis","tags_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fgo-redis/tags","manifests_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redis%2Fgo-redis/manifests","owner_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redis","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":119425736,"owners_count":6005042,"icon_url":"https://github.com/github.png","host_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"},"owner_record":{"login":"redis","name":"Redis","uuid":"1529926","kind":"organization","description":"","email":"redis@redis.io","website":"https://redis.io","location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/1529926?v=4","repositories_count":28,"last_synced_at":"2023-04-09T03:48:46.734Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/redis","created_at":"2022-11-02T16:17:24.653Z","updated_at":"2023-04-09T03:48:47.121Z","owner_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redis","repositories_url":"http://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redis/repositories"},"tags":[{"name":"v5.2.5","sha":"135cb12c7689ffe92338baf677a1e0d2086144dc","kind":"commit","published_at":"2017-02-19T07:48:52.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.5","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.5"},{"name":"v5.2.4","sha":"2fe9c5cc0a8da9faeba3a45511a4ece8f7e37dc2","kind":"commit","published_at":"2017-02-08T12:28:34.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.4","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.4"},{"name":"v5.2.3","sha":"9cd49656897843b8f2bf3d9639230cb7aec90d6c","kind":"commit","published_at":"2017-01-26T14:42:46.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.3","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.3"},{"name":"v5.2.2","sha":"8829ddcd8bdb333e477cc845946c4b9b2ef66280","kind":"commit","published_at":"2017-01-16T08:01:07.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.2","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.2"},{"name":"v5.2.1","sha":"6da05abbaa03e90e5878f0ab711478698609fe96","kind":"commit","published_at":"2017-01-13T11:52:40.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.1","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.1"},{"name":"v5.2.0","sha":"b9cc17bae020d9c1f467ca0f27d7706c1683c370","kind":"commit","published_at":"2017-01-03T11:06:30.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.2.0","html_url":"https://github.com/redis/go-redis/releases/tag/v5.2.0"},{"name":"v5.1.7","sha":"8fcba2ea878201b70c5a63dd416141d4ddbc601a","kind":"commit","published_at":"2016-12-30T11:17:27.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.7","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.7"},{"name":"v5.1.6","sha":"b7bae3a78050e2e7ec2130a05cde296a9ff2e9c0","kind":"commit","published_at":"2016-12-22T12:50:47.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.6","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.6"},{"name":"v5.1.5","sha":"5e76db680467ebce5495cc2159a9289a6851d773","kind":"commit","published_at":"2016-12-20T16:08:51.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.5","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.5"},{"name":"v5.1.4","sha":"5e76db680467ebce5495cc2159a9289a6851d773","kind":"commit","published_at":"2016-12-20T16:08:51.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.4","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.4"},{"name":"v4.2.4","sha":"c938162545c57136fa59879746bc65d0f1db3d1e","kind":"commit","published_at":"2016-12-20T10:13:33.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.2.4","html_url":"https://github.com/redis/go-redis/releases/tag/v4.2.4"},{"name":"v5.1.3","sha":"c6acf2ed159b22defbd9f077686cff03eba1e9b3","kind":"commit","published_at":"2016-12-12T15:42:18.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.3","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.3"},{"name":"v5.1.2","sha":"854c88a72c8bb9c09936145aef886b7697d6b995","kind":"commit","published_at":"2016-12-03T15:45:52.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.2","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.2"},{"name":"v5.1.1","sha":"e7f23a300bf5f75d2a658cc07233f025362a24f6","kind":"commit","published_at":"2016-11-30T11:06:44.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.1","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.1"},{"name":"v5.1.0","sha":"c9856861674f102a5f51104c36401a3cf691739c","kind":"commit","published_at":"2016-11-19T12:14:48.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.1.0","html_url":"https://github.com/redis/go-redis/releases/tag/v5.1.0"},{"name":"v5.0.2","sha":"b6bfe529a846fbb9a58c832ce71c61b6fde12c15","kind":"commit","published_at":"2016-11-08T10:04:23.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.0.2","html_url":"https://github.com/redis/go-redis/releases/tag/v5.0.2"},{"name":"v5.0.1","sha":"80cf5d1652d5590c35edc6c2dc1aa354790e3010","kind":"commit","published_at":"2016-10-24T09:52:32.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.0.1","html_url":"https://github.com/redis/go-redis/releases/tag/v5.0.1"},{"name":"v4.2.3","sha":"8a8d997ad58dc600d2ff0f64914102192f3b51ac","kind":"commit","published_at":"2016-10-14T12:43:29.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.2.3","html_url":"https://github.com/redis/go-redis/releases/tag/v4.2.3"},{"name":"v5.0.0","sha":"6f8957c5b7dece15d1ea5f592ec88f46ee2deffa","kind":"commit","published_at":"2016-10-14T11:21:25.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v5.0.0","html_url":"https://github.com/redis/go-redis/releases/tag/v5.0.0"},{"name":"v4.2.2","sha":"1579a9df5f42def33a507a1b4174e128d437a0ba","kind":"commit","published_at":"2016-10-14T07:48:01.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.2.2","html_url":"https://github.com/redis/go-redis/releases/tag/v4.2.2"},{"name":"v4.2.1","sha":"5a272d03b960a72c61e5025a7d6e8da5d8815442","kind":"commit","published_at":"2016-10-02T13:00:31.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.2.1","html_url":"https://github.com/redis/go-redis/releases/tag/v4.2.1"},{"name":"v4.2.0","sha":"a7d1d0b9ac18e46d986729d8b71ad25d6a23986b","kind":"commit","published_at":"2016-09-29T12:51:14.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.2.0","html_url":"https://github.com/redis/go-redis/releases/tag/v4.2.0"},{"name":"v4.1.12","sha":"bb84d84aeaa98b3c5c887264031b294cc7ca860c","kind":"commit","published_at":"2016-09-27T09:38:15.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.12","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.12"},{"name":"v4.1.11","sha":"ea5960170faa157952a4d49d277fd5a8b10e52eb","kind":"commit","published_at":"2016-09-27T09:36:54.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.11","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.11"},{"name":"v4.1.10","sha":"938235994ea88a05678f8060741d5f34ed6a5ff3","kind":"commit","published_at":"2016-09-14T11:04:51.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.10","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.10"},{"name":"v4.1.9","sha":"1a0bda80bfc37ac0c4dcdf82dd4844fd5352f0b2","kind":"commit","published_at":"2016-09-14T10:09:16.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.9","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.9"},{"name":"v4.1.8","sha":"60d35dfc25b19100aeb564a98f74700efb9ab92e","kind":"commit","published_at":"2016-09-13T15:06:04.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.8","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.8"},{"name":"v4.1.7","sha":"4b0862b5fd0a5ae4e63c76476a64655752d6031b","kind":"commit","published_at":"2016-09-10T14:09:39.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.7","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.7"},{"name":"v4.1.6","sha":"788a36eee7796dbad237c33f9f73873a7feee292","kind":"commit","published_at":"2016-09-08T13:48:19.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.6","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.6"},{"name":"v4.1.5","sha":"49f197e6d11de35192fce19b2b9fd2f9b8b13c4a","kind":"commit","published_at":"2016-08-23T11:40:42.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.5","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.5"},{"name":"v4.1.4","sha":"342961af9ec580f6cab8f29d8782905c71dd9f5c","kind":"commit","published_at":"2016-08-22T10:01:02.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.4","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.4"},{"name":"v4.1.3","sha":"909c26e76cb93c5fc81469418ab6d05e7725ba53","kind":"commit","published_at":"2016-08-17T09:43:40.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.3","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.3"},{"name":"v4.1.2","sha":"0b8675fa4582105c8f54e08d3e0e6ad8f7df0546","kind":"commit","published_at":"2016-08-09T14:17:51.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.2","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.2"},{"name":"v4.1.1","sha":"1324657ba9910bf5ebed1435519e2e913802cfbe","kind":"commit","published_at":"2016-08-04T14:44:18.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.1","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.1"},{"name":"v4.1.0","sha":"bc66ed0ebaa2b2a5f55935d45265b6885e2b22ff","kind":"commit","published_at":"2016-07-21T13:38:01.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.1.0","html_url":"https://github.com/redis/go-redis/releases/tag/v4.1.0"},{"name":"v4.0.2","sha":"eca5d02f24a99706525f77f544deee8e7894f26c","kind":"commit","published_at":"2016-07-08T09:44:48.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.0.2","html_url":"https://github.com/redis/go-redis/releases/tag/v4.0.2"},{"name":"v4.0.1","sha":"65a64fe7aac20b56d8da4a8fd40d7c4bcffcc432","kind":"commit","published_at":"2016-07-08T09:24:02.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.0.1","html_url":"https://github.com/redis/go-redis/releases/tag/v4.0.1"},{"name":"v4.0.0","sha":"1bf10a61e2698abfa27266cb94573045bee7dc87","kind":"commit","published_at":"2016-06-27T10:13:52.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v4.0.0","html_url":"https://github.com/redis/go-redis/releases/tag/v4.0.0"},{"name":"v3.6.4","sha":"b5e368500d0a508ef8f16e9c2d4025a8a46bcc29","kind":"commit","published_at":"2016-06-27T09:56:34.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.6.4","html_url":"https://github.com/redis/go-redis/releases/tag/v3.6.4"},{"name":"v3.6.3","sha":"a905127dc89ca51a241eacf70757a40423ab93d0","kind":"commit","published_at":"2016-06-10T12:15:24.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.6.3","html_url":"https://github.com/redis/go-redis/releases/tag/v3.6.3"},{"name":"v3.6.2","sha":"5183f8dcde9737db7583dbfa9881800dba26e3fa","kind":"commit","published_at":"2016-05-02T11:39:45.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.6.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.6.2"},{"name":"v3.6.1","sha":"b3514029955f38f2a1120b5c3ad59f241d9eecca","kind":"commit","published_at":"2016-04-06T11:07:28.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.6.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.6.1"},{"name":"v3.6.0","sha":"d2ae7d870764d131887fa31a743bb50abbcf9384","kind":"commit","published_at":"2016-03-19T13:51:02.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.6.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.6.0"},{"name":"v3.5.4","sha":"998148be400d1e4d8928a746f3bd3bc147d7cbf5","kind":"commit","published_at":"2016-03-17T06:46:52.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.5.4","html_url":"https://github.com/redis/go-redis/releases/tag/v3.5.4"},{"name":"v3.5.3","sha":"9d394cc7fb0e4c1d768c3b1e1af0852f65e2c9b0","kind":"commit","published_at":"2016-03-15T13:16:38.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.5.3","html_url":"https://github.com/redis/go-redis/releases/tag/v3.5.3"},{"name":"v3.5.2","sha":"7f594cdbe1afe86429ab542f76cf4539557b4dfa","kind":"commit","published_at":"2016-03-14T18:08:06.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.5.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.5.2"},{"name":"v3.5.1","sha":"50b2689809691f3f2aa01534ae2348d5e75289cc","kind":"commit","published_at":"2016-03-14T10:46:01.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.5.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.5.1"},{"name":"v3.5.0","sha":"4665ad860f6aa4cfbf83bf8f18da9db8dde1adb5","kind":"commit","published_at":"2016-03-12T13:21:05.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.5.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.5.0"},{"name":"v3.4.0","sha":"eb78eedafec136fb90325a094fb4717f642734ab","kind":"commit","published_at":"2016-03-09T13:28:25.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.4.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.4.0"},{"name":"v3.3.2","sha":"f7d4933032ef7d641fcea89be8a7c27c83a6f011","kind":"commit","published_at":"2016-03-04T12:56:54.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.3.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.3.2"},{"name":"v3.3.1","sha":"7116858f6796e0e82dd41581e8fe2988dddc1d4c","kind":"commit","published_at":"2016-03-02T12:46:27.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.3.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.3.1"},{"name":"v3.3.0","sha":"a4e4d1da06952ce90d8ec6604261c8a74432b282","kind":"commit","published_at":"2016-03-01T15:12:48.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.3.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.3.0"},{"name":"v3.2.30","sha":"0382d1e980729491f4b0909b5a3309a98d49f718","kind":"commit","published_at":"2016-02-18T10:55:49.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.30","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.30"},{"name":"v3.2.29","sha":"298fdec44579d427ee4c50483e5ccda1ebdcc204","kind":"commit","published_at":"2016-02-06T10:27:35.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.29","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.29"},{"name":"v3.2.28","sha":"3f059e5c53cd635382697546e6225f1437e3c5a2","kind":"commit","published_at":"2016-01-22T10:45:54.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.28","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.28"},{"name":"v3.2.27","sha":"dd1ac33826064181d7abaa20d976eab31ec12b58","kind":"commit","published_at":"2016-01-08T13:20:08.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.27","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.27"},{"name":"v3.2.26","sha":"aa0a9697d83d57be721f4ef8176d367c63873855","kind":"commit","published_at":"2015-12-31T09:45:00.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.26","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.26"},{"name":"v3.2.25","sha":"8319126d93f821c1a3c4abdd773c2ffb03c9245d","kind":"commit","published_at":"2015-12-24T09:03:48.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.25","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.25"},{"name":"v3.2.24","sha":"f6d6826d82cbb2b772de2387493d9520168e1893","kind":"commit","published_at":"2015-12-22T10:21:49.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.24","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.24"},{"name":"v3.2.23","sha":"ba44d4d158d4f08b4271966798f81e1d1d9b3ba3","kind":"commit","published_at":"2015-12-17T13:52:04.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.23","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.23"},{"name":"v3.2.22","sha":"745d73395e0b3fc51dcde381ae93902822ceca44","kind":"commit","published_at":"2015-12-14T16:00:32.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.22","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.22"},{"name":"v3.2.21","sha":"781f7f803d85b0281ab7bc4ea1173554c33c6f81","kind":"commit","published_at":"2015-12-10T08:01:35.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.21","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.21"},{"name":"v3.2.20","sha":"fb4fc5e880bbbb06627505b560425c0104dc1f65","kind":"commit","published_at":"2015-12-10T07:24:44.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.20","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.20"},{"name":"v3.2.19","sha":"ba9dda7567ee6939c265e36f734e6ae3e014779a","kind":"commit","published_at":"2015-12-02T14:23:50.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.19","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.19"},{"name":"v3.2.18","sha":"5efe0cceb68267bdf055bcee062aa745aebd3e1c","kind":"commit","published_at":"2015-12-01T14:46:53.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.18","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.18"},{"name":"v3.2.17","sha":"54a9acc11fe8e6aa91905e3c032aa8b4f871bc9b","kind":"commit","published_at":"2015-11-27T12:10:24.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.17","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.17"},{"name":"v3.2.16","sha":"7ea220f54db94ef0b305499d409e9887feaf536e","kind":"commit","published_at":"2015-11-15T09:12:49.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.16","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.16"},{"name":"v3.2.15","sha":"c72da86e4e66351bb4c564bbbe30daaa33756585","kind":"commit","published_at":"2015-11-15T09:11:02.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.15","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.15"},{"name":"v3.2.14","sha":"d1e774fa21682d9dc5dafec400d13a6f5eb8827d","kind":"commit","published_at":"2015-11-14T14:50:33.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.14","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.14"},{"name":"v3.2.13","sha":"96fcac6a430e74927b638b73f373ad4d99de005b","kind":"commit","published_at":"2015-10-22T11:24:32.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.13","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.13"},{"name":"v3.2.12","sha":"0880b0b20c4d37f3ef05a561dbd66d138c795d6b","kind":"commit","published_at":"2015-10-13T10:27:14.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.12","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.12"},{"name":"v3.2.11","sha":"5d95a32e251b7a05692d61aa8648231e1b7b906f","kind":"commit","published_at":"2015-10-07T14:16:35.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.11","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.11"},{"name":"v3.2.10","sha":"eef3fd78ef0f78e8406339c27fd46c6af93f24ba","kind":"commit","published_at":"2015-09-12T06:45:37.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.10","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.10"},{"name":"v3.2.9","sha":"02154c3b3a1dfb783d9ceb94e10f0fc8451bddfc","kind":"commit","published_at":"2015-09-10T10:07:36.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.9","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.9"},{"name":"v3.2.8","sha":"1e9f53a8e7fe1a37ee5adb04fd0f9cc04bce378f","kind":"commit","published_at":"2015-09-04T11:02:29.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.8","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.8"},{"name":"v3.2.7","sha":"dace69da84434086a7a1268b621963f57ca03743","kind":"commit","published_at":"2015-09-03T14:23:59.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.7","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.7"},{"name":"v3.2.6","sha":"152c38c687bfd75a1e6faa05944415cfe69c5c7b","kind":"commit","published_at":"2015-08-26T06:55:43.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.6","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.6"},{"name":"v3.2.5","sha":"73e1e9f501e946d35387e30f49ef58adda82b4ee","kind":"commit","published_at":"2015-08-24T15:52:59.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.5","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.5"},{"name":"v3.2.4","sha":"5710d6885258fd4e6e39a05f4347287c7db77382","kind":"commit","published_at":"2015-08-21T08:54:55.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.4","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.4"},{"name":"v3.2.3","sha":"fc28d0fa245616be3aa97e162086e71c75c92f6b","kind":"commit","published_at":"2015-07-25T06:29:23.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.3","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.3"},{"name":"v3.2.2","sha":"2e21f6b3e7f1619919f674a3f92fd0e9a6d8a10d","kind":"commit","published_at":"2015-07-18T06:57:33.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.2"},{"name":"v3.2.1","sha":"0c19d0be411de22fa3b1ec78319b668ea59e8335","kind":"commit","published_at":"2015-07-13T10:51:23.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.1"},{"name":"v3.2.0","sha":"7baacea8fb3cb99899582abb6fa2b5c280ce015d","kind":"commit","published_at":"2015-07-11T10:54:01.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.2.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.2.0"},{"name":"v3.1.5","sha":"2cfe5df7d2593e20161594e4c02ebb305c9ccd8e","kind":"commit","published_at":"2015-06-24T12:46:13.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.5","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.5"},{"name":"v3.1.4","sha":"d36559f9ce085e75cccdb58e9a54e36621bfd4c1","kind":"commit","published_at":"2015-06-16T09:27:51.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.4","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.4"},{"name":"v3.1.3","sha":"651d0b06620784b860d84eb3ecf435985afd25b1","kind":"commit","published_at":"2015-06-11T14:47:30.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.3","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.3"},{"name":"v3.1.2","sha":"faa7ed46bd55be18d606f9a2542d318fb1a47356","kind":"commit","published_at":"2015-06-05T12:02:57.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.2"},{"name":"v3.1.1","sha":"a9724894162e809eda1031fbc1bb4f2e154f9f2d","kind":"commit","published_at":"2015-06-04T09:12:24.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.1"},{"name":"v3.1.0","sha":"7ce4387ff8f4bb39bd0446cd14e8c89bc40d2fcc","kind":"commit","published_at":"2015-06-04T07:12:04.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.1.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.1.0"},{"name":"v3.0.3","sha":"b1946ee532efdd01f4651214002abbf7e740bd99","kind":"commit","published_at":"2015-05-23T15:17:45.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.0.3","html_url":"https://github.com/redis/go-redis/releases/tag/v3.0.3"},{"name":"v3.0.2","sha":"7b1eeda9c18cf02aca975a91c8bcd5604d59fa61","kind":"commit","published_at":"2015-05-23T15:01:57.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.0.2","html_url":"https://github.com/redis/go-redis/releases/tag/v3.0.2"},{"name":"v3.0.1","sha":"cdfab22180f116c19fe0575451683bc800e4c2d9","kind":"commit","published_at":"2015-05-18T12:18:55.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.0.1","html_url":"https://github.com/redis/go-redis/releases/tag/v3.0.1"},{"name":"v3.0","sha":"44a58ef06786c0f383a22ddc363dfa66a88eb784","kind":"commit","published_at":"2015-05-15T10:15:38.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v3.0","html_url":"https://github.com/redis/go-redis/releases/tag/v3.0"},{"name":"v2.3.2","sha":"e6179049628164864e6e84e973cfb56335748dea","kind":"tag","published_at":"2014-12-09T11:08:50.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2.3.2","html_url":"https://github.com/redis/go-redis/releases/tag/v2.3.2"},{"name":"v2.3.1","sha":"9778c1acf576a9c34468d850abe8dfdd585bc60f","kind":"tag","published_at":"2014-11-13T13:25:48.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2.3.1","html_url":"https://github.com/redis/go-redis/releases/tag/v2.3.1"},{"name":"v2.3","sha":"9805fc35f8e8c8cfe388b7b8814ed1feda64b16f","kind":"tag","published_at":"2014-11-06T11:31:27.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2.3","html_url":"https://github.com/redis/go-redis/releases/tag/v2.3"},{"name":"v2.2","sha":"7b28e6f9d2a9ea4fcb7bdba70149309e97e02c3e","kind":"tag","published_at":"2014-10-07T11:03:03.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2.2","html_url":"https://github.com/redis/go-redis/releases/tag/v2.2"},{"name":"v2.1","sha":"48ff0f00a2e48b19d4629fea0293e92d97d0ac7e","kind":"tag","published_at":"2014-10-03T07:06:10.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2.1","html_url":"https://github.com/redis/go-redis/releases/tag/v2.1"},{"name":"v2","sha":"77d8805e9143844308620603c9a59ebda85e1fd1","kind":"tag","published_at":"2014-08-15T08:06:58.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v2","html_url":"https://github.com/redis/go-redis/releases/tag/v2"},{"name":"v1","sha":"4ea3e7531bf719b02630a8712cb66b5b1bc37f8e","kind":"tag","published_at":"2014-07-02T13:11:37.000Z","download_url":"https://codeload.github.com/redis/go-redis/tar.gz/v1","html_url":"https://github.com/redis/go-redis/releases/tag/v1"}]},"repo_metadata_updated_at":"2023-04-25T15:37:41.300Z","dependent_packages_count":2061,"downloads":null,"downloads_period":null,"dependent_repos_count":1640,"rankings":{"downloads":null,"dependent_repos_count":0.19950036725496625,"dependent_packages_count":0.20333890786257608,"stargazers_count":0.4631147370910917,"forks_count":0.5207804032263081,"docker_downloads_count":0.1359050863775381,"average":0.30452790036249605},"purl":"pkg:golang/github.com/redis/go-redis/v9","advisories":[{"uuid":"GSA_kwCzR0hTQS05MmNwLTU0MjItMm13N84ABFwa","url":"https://github.com/advisories/GHSA-92cp-5422-2mw7","title":"go-redis allows potential out of order responses when `CLIENT SETINFO` times out during connection establishment","description":"### Impact\n\nThe issue only occurs when the `CLIENT SETINFO` command times out during connection establishment. The following circumstances can cause such a timeout:\n\n1. The client is configured to transmit its identity. This can be disabled via the `DisableIndentity` flag.\n2. There are network connectivity issues\n3. The client was configured with aggressive timeouts\n\nThe impact differs by use case:\n\n* **Sticky connections**: Rather than using a connection from the pool on-demand, the caller can stick with a connection. Then you receive persistent out-of-order responses for the lifetime of the connection.\n* **Pipelines**: All commands in the pipeline receive incorrect responses.\n* **Default connection pool usage without pipelining**: When used with the default [ConnPool](https://github.com/redis/go-redis/blob/8fadbef84a3f4e7573f8b38e5023fd469470a8a4/internal/pool/pool.go#L77) once a connection is returned after use with [ConnPool#Put](https://github.com/redis/go-redis/blob/8fadbef84a3f4e7573f8b38e5023fd469470a8a4/internal/pool/pool.go#L366) the read buffer will be checked and the connection will be marked as bad due to the unread data. This means that at most one out-of-order response before the connection is discarded.\n\n### Patches\nWe prepared a fix in https://github.com/redis/go-redis/pull/3295 and plan to release patch versions soon.\n\n### Workarounds\nYou can prevent the vulnerability by setting the flag `DisableIndentity` (BTW: We also need to fix the spelling.) to `true` when constructing the client instance.\n\n### Credit\n\nAkhass Wasti\nRamin Ghorashi\nAnton Amlinger\nSyed Rahman\nMahesh Venkateswaran\nSergey Zavoloka\nAditya Adarwal\nAbdulla Anam\nAbd-Alhameed\nAlex Vanlint\nGaurav Choudhary\nVedanta Jha\nYll Kelani\nRyan Picard","origin":"UNSPECIFIED","severity":"LOW","published_at":"2025-03-20T18:49:59.000Z","withdrawn_at":null,"classification":"GENERAL","cvss_score":3.7,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N","references":["https://github.com/redis/go-redis/security/advisories/GHSA-92cp-5422-2mw7","https://nvd.nist.gov/vuln/detail/CVE-2025-29923","https://github.com/redis/go-redis/pull/3295","https://github.com/redis/go-redis/commit/d236865b0cfa1b752ea4b7da666b1fdcd0acebb6","https://github.com/advisories/GHSA-92cp-5422-2mw7"],"source_kind":"github","identifiers":["GHSA-92cp-5422-2mw7","CVE-2025-29923"],"repository_url":"https://github.com/redis/go-redis","blast_radius":11.894922237776482,"packages":[{"versions":[{"first_patched_version":"9.5.5","vulnerable_version_range":"\u003e= 9.5.1, \u003c 9.5.5"},{"first_patched_version":"9.6.3","vulnerable_version_range":"\u003e= 9.6.0b1, \u003c 9.6.3"},{"first_patched_version":"9.7.3","vulnerable_version_range":"\u003e= 9.7.0-beta.1, \u003c 9.7.3"}],"ecosystem":"go","package_name":"github.com/redis/go-redis/v9"}],"created_at":"2025-03-20T19:08:05.336Z","updated_at":"2025-03-20T18:50:01.000Z","epss_percentage":null,"epss_percentile":null}],"docker_usage_url":"https://docker.ecosyste.ms/usage/go/github.com/redis/go-redis/v9","docker_dependents_count":579,"docker_downloads_count":7842386964,"usage_url":"https://repos.ecosyste.ms/usage/go/github.com/redis/go-redis/v9","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/go/github.com/redis/go-redis/v9/dependencies","status":null,"funding_links":["https://uptrace.dev/sponsor"],"critical":null,"versions_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fredis%2Fgo-redis%2Fv9/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fredis%2Fgo-redis%2Fv9/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fredis%2Fgo-redis%2Fv9/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages/github.com%2Fredis%2Fgo-redis%2Fv9/related_packages","maintainers":[],"registry":{"name":"proxy.golang.org","url":"https://proxy.golang.org","ecosystem":"go","default":true,"packages_count":1882879,"maintainers_count":0,"namespaces_count":723926,"keywords_count":97872,"github":"golang","metadata":{"funded_packages_count":39346},"icon_url":"https://github.com/golang.png","created_at":"2022-04-04T15:19:22.939Z","updated_at":"2025-06-06T05:22:27.920Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/proxy.golang.org/namespaces"}},"unique_repositories_count":779,"unique_repositories_count_past_30_days":38,"recent_issues":[{"uuid":"4662748583","node_id":"PR_kwDOQSbpRs7magQX","number":429,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.1 in /services/emote-service","user":"dependabot[bot]","labels":["needs-manual-review","dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-15T06:54:41.000Z","updated_at":"2026-06-15T06:56:54.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"/services/emote-service","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/caesarakalaeii/all-chat/pull/429","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/caesarakalaeii%2Fall-chat/issues/429","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/429/packages"},{"uuid":"4661302209","node_id":"PR_kwDOStQJBM7mV4T0","number":15,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.7.0 to 9.20.1 in the go-module-minor-patch group","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-15T01:08:46.000Z","updated_at":"2026-06-15T01:08:47.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.7.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"the go-module-minor-patch group","ecosystem":"go"},"body":"Bumps the go-module-minor-patch group with 1 update: [github.com/redis/go-redis/v9](https://github.com/redis/go-redis).\n\nUpdates `github.com/redis/go-redis/v9` from 9.7.0 to 9.20.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.7.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.7.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/ZoneCNH/redisx/pull/15","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZoneCNH%2Fredisx/issues/15","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/15/packages"},{"uuid":"4659127509","node_id":"PR_kwDOQ315r87mPPb8","number":32,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.20.0 to 9.20.1","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-14T12:42:28.000Z","updated_at":"2026-06-14T12:42:29.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.20.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.20.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.20.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/open-apime/apime/pull/32","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-apime%2Fapime/issues/32","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/32/packages"},{"uuid":"4658212892","node_id":"PR_kwDOSmJ6Is7mMeM3","number":23,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.1","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-14T06:52:45.000Z","updated_at":"2026-06-14T06:52:46.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/nkokkalis/dbconfigsync-operator/pull/23","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkokkalis%2Fdbconfigsync-operator/issues/23","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/23/packages"},{"uuid":"4657228572","node_id":"PR_kwDORz07ic7mJi20","number":49,"state":"open","title":"chore(deps)(deps): bump github.com/redis/go-redis/v9 from 9.7.3 to 9.20.1 in /threat-intel","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-13T23:02:35.000Z","updated_at":"2026-06-13T23:03:04.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.7.3","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"/threat-intel","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.7.3 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.7.3...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.7.3\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/tsm7979/tsm79/pull/49","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsm7979%2Ftsm79/issues/49","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/49/packages"},{"uuid":"4655187269","node_id":"PR_kwDOSlZEDc7mDbaQ","number":12,"state":"open","title":"chore(deps): bump the go-deps group across 1 directory with 11 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-13T10:22:32.000Z","updated_at":"2026-06-13T10:22:33.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"go-deps","update_count":11,"packages":[{"name":"connectrpc.com/connect","old_version":"1.19.1","new_version":"1.20.0","repository_url":"https://github.com/connectrpc/connect-go"},{"name":"github.com/jackc/pgx/v5","old_version":"5.9.0","new_version":"5.10.0","repository_url":"https://github.com/jackc/pgx"},{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.1","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/sync","old_version":"0.20.0","new_version":"0.21.0","repository_url":"https://github.com/golang/sync"}],"path":null,"ecosystem":"go"},"body":"Bumps the go-deps group with 7 updates in the /backend directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [connectrpc.com/connect](https://github.com/connectrpc/connect-go) | `1.19.1` | `1.20.0` |\n| [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) | `5.9.0` | `5.10.0` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.18.0` | `9.20.1` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.1` | `1.28.0` |\n| [golang.org/x/sync](https://github.com/golang/sync) | `0.20.0` | `0.21.0` |\n\n\nUpdates `connectrpc.com/connect` from 1.19.1 to 1.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/connectrpc/connect-go/releases\"\u003econnectrpc.com/connect's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.20.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump minimum supported Go version to 1.25 by \u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate Unary-Get query parameter order to match spec recommendation by \u003ca href=\"https://github.com/oliversun9\"\u003e\u003ccode\u003e@​oliversun9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.19.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eGovernance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ca href=\"https://github.com/timostamm\"\u003e\u003ccode\u003e@​timostamm\u003c/code\u003e\u003c/a\u003e as a maintainer in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/905\"\u003econnectrpc/connect-go#905\u003c/a\u003e 🎉\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBugfixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse 'deadline_exceeded' instead of 'canceled' on HTTP/2 cancelation when appropriate by \u003ca href=\"https://github.com/jhump\"\u003e\u003ccode\u003e@​jhump\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/904\"\u003econnectrpc/connect-go#904\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndReceive by \u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRefactor memhttptest to work with Go 1.25 synctest by \u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDoc clarifications by \u003ca href=\"https://github.com/emcfarlane\"\u003e\u003ccode\u003e@​emcfarlane\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/912\"\u003e#912\u003c/a\u003e) and \u003ca href=\"https://github.com/stefanvanburen\"\u003e\u003ccode\u003e@​stefanvanburen\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/906\"\u003e#906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e:\n\u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1291a7dcac19b00490f935dce18f44f301fc58f6\"\u003e\u003ccode\u003e1291a7d\u003c/code\u003e\u003c/a\u003e Prepare for v1.20.0 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/927\"\u003e#927\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/6df682f19e5b957b96b5fa44ffb28705a2d7bc8c\"\u003e\u003ccode\u003e6df682f\u003c/code\u003e\u003c/a\u003e Update Unary-Get query parameter order to match spec recommendation (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/c4aac92b87026cd709cfbccdaabe8c45abef705c\"\u003e\u003ccode\u003ec4aac92\u003c/code\u003e\u003c/a\u003e Chore update buf v1.69.0 and license year (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/925\"\u003e#925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/a5a6c30f3776b06ae05a66ab3bdd2d60c46db6db\"\u003e\u003ccode\u003ea5a6c30\u003c/code\u003e\u003c/a\u003e Bump Go from v1.24 to v1.25 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/138e2700eb60b8004363eb344031b317bf599a1f\"\u003e\u003ccode\u003e138e270\u003c/code\u003e\u003c/a\u003e Back to development (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/921\"\u003e#921\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1c195ae986164a681af958e675dd283eed23e365\"\u003e\u003ccode\u003e1c195ae\u003c/code\u003e\u003c/a\u003e Prepare for v1.19.2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/920\"\u003e#920\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/96abc6b87132d1c43f67f1f5c91efdcb6a59b4aa\"\u003e\u003ccode\u003e96abc6b\u003c/code\u003e\u003c/a\u003e Upgrade golangci-lint to v2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/917\"\u003e#917\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/be72fa520cdc8b942db6839dadbe9af0b44b40df\"\u003e\u003ccode\u003ebe72fa5\u003c/code\u003e\u003c/a\u003e Clarify concurrent use semantics for streaming types (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/299d2e7cdfb5e2fa3fa0963e6cedc51a7364521d\"\u003e\u003ccode\u003e299d2e7\u003c/code\u003e\u003c/a\u003e Fix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndRecei...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/e299aa60ffcf91633e48fcb3dd594cbbb187ec7f\"\u003e\u003ccode\u003ee299aa6\u003c/code\u003e\u003c/a\u003e Bump google.golang.org/grpc from 1.76.0 to 1.79.3 in /internal/conformance (#...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/jackc/pgx/v5` from 5.9.0 to 5.10.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jackc/pgx/blob/master/CHANGELOG.md\"\u003egithub.com/jackc/pgx/v5's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e5.10.0 (June 3, 2026)\u003c/h1\u003e\n\u003cp\u003eThis release includes a significant amount of hardening against malicious or compromised PostgreSQL servers,\ncontributed by Sean Chittenden at CrowdStrike, Inc. This work bounds binary decoders against attacker-controlled\nmessage sizes, caps server-supplied SCRAM iteration counts, adds \u003ccode\u003erequire_auth\u003c/code\u003e to restrict which authentication\nmethods a server may use (mitigating downgrade attacks under \u003ccode\u003esslmode=prefer\u003c/code\u003e), and ensures cancellation requests are\nsent over TLS when the original connection used TLS.\u003c/p\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003erequire_auth\u003c/code\u003e to restrict accepted server authentication methods (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eParseConfigOptions.ConnStringAllowedKeys\u003c/code\u003e to restrict allowed connection string keys (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eStructArgs\u003c/code\u003e and \u003ccode\u003eStrictStructArgs\u003c/code\u003e for \u003ccode\u003e@\u003c/code\u003e-named queries (Tubelight30)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eErrConnClosed\u003c/code\u003e sentinel error and unwrap it from \u003ccode\u003econnLockError\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgxpool: check if connection is expired before acquire (arthurdotwork)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eSecurity Hardening\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEncrypt \u003ccode\u003eCancelRequest\u003c/code\u003e connection when the primary connection used TLS (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eCap server-supplied SCRAM iteration count (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eDefault Frontend max message body length to ~1 GiB (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound hstore binary decode against malicious server input (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound array binary decode element length against remaining message bytes (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound array element count against remaining message bytes (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound range, multirange, and tsvector binary decoders (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eDocument secure connection configuration (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eFix panic on malformed geometric text; return an error instead (MaIII)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix scanning \u003ccode\u003e\u0026quot;char\u0026quot;\u003c/code\u003e (OID 18) into \u003ccode\u003e*string\u003c/code\u003e in binary format (luongs3)\u003c/li\u003e\n\u003cli\u003eFix handling of typed-nil \u003ccode\u003edriver.Valuer\u003c/code\u003e in array and composite codecs (Donncha Fahy)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eCopyData.Data\u003c/code\u003e hex decoding in \u003ccode\u003eUnmarshalJSON\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003eFix data race when context is cancelled during connect\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eparseKeywordValueSettings\u003c/code\u003e rejecting trailing whitespace (alliasgher)\u003c/li\u003e\n\u003cli\u003epgconn: preserve full error chain in \u003ccode\u003enormalizeTimeoutError\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgconn: use a fresh context for the fallback connection in \u003ccode\u003econnectPreferred\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgxpool: fix \u003ccode\u003eMaxLifetimeDestroyCount\u003c/code\u003e and ping order for acquire-time expiry check\u003c/li\u003e\n\u003cli\u003eAdd missing error check of \u003ccode\u003erows.Err\u003c/code\u003e to load types (Jen Altavilla)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003e5.9.2 (April 18, 2026)\u003c/h1\u003e\n\u003cp\u003eFix SQL Injection via placeholder confusion with dollar quoted string literals (GHSA-j88v-2chj-qfwx)\u003c/p\u003e\n\u003cp\u003eSQL injection can occur when:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThe non-default simple protocol is used.\u003c/li\u003e\n\u003cli\u003eA dollar quoted string literal is used in the SQL query.\u003c/li\u003e\n\u003cli\u003eThat query contains text that would be would be interpreted outside as a placeholder outside of a string literal.\u003c/li\u003e\n\u003cli\u003eThe value of that placeholder is controllable by the attacker.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/7293fb11125be0373a92f716683f2d494f6fd4b0\"\u003e\u003ccode\u003e7293fb1\u003c/code\u003e\u003c/a\u003e Update changelog for v5.10.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/1ade2852841d4ee55677207200f4ffdbc217ce69\"\u003e\u003ccode\u003e1ade285\u003c/code\u003e\u003c/a\u003e pgconn: document secure connection configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/b4d6d4d1be7f381bb81d12ebfecae6b10f5c7562\"\u003e\u003ccode\u003eb4d6d4d\u003c/code\u003e\u003c/a\u003e pgtype: bound range, multirange, and tsvector binary decoders\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/0639b37f8f4fff31dbe73297087e69b3ccc3bf2b\"\u003e\u003ccode\u003e0639b37\u003c/code\u003e\u003c/a\u003e pgconn: add ParseConfigOptions.ConnStringAllowedKeys\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/b28e65b0c3e0cd45c09e7c9ce36e5e29caa6dbe9\"\u003e\u003ccode\u003eb28e65b\u003c/code\u003e\u003c/a\u003e pgtype: bound array element count against remaining message bytes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/cd1f389d37d775bc8cb11c60363946f928c02c98\"\u003e\u003ccode\u003ecd1f389\u003c/code\u003e\u003c/a\u003e pgtype: bound array binary decode element length against remaining bytes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/ff27b5bbea012020d1fd8b9bdd56284a88783ef1\"\u003e\u003ccode\u003eff27b5b\u003c/code\u003e\u003c/a\u003e pgtype: bound hstore binary decode against malicious server input\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/a6002e12a8a393844b48c29d105e7542e7b3a251\"\u003e\u003ccode\u003ea6002e1\u003c/code\u003e\u003c/a\u003e pgproto3: default Frontend max message body length to ~1 GiB\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/44f61732ecdfd08081a1a2ff7227f1e975f0b71e\"\u003e\u003ccode\u003e44f6173\u003c/code\u003e\u003c/a\u003e pgconn: cap server-supplied SCRAM iteration count\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/1a976f7bb91216ea7f8369cb7abe78ce34dc244f\"\u003e\u003ccode\u003e1a976f7\u003c/code\u003e\u003c/a\u003e pgconn: add require_auth to restrict accepted server auth methods\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/jackc/pgx/compare/v5.9.0...v5.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.18.0 to 9.20.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/sdk` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/sdk's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/trace` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/trace's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/myfxlogs/ant/pull/12","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/myfxlogs%2Fant/issues/12","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/12/packages"},{"uuid":"4645427147","node_id":"PR_kwDORx3C_s7lkAoy","number":74,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.1","user":"dependabot[bot]","labels":["area/backend"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-12T01:24:47.000Z","updated_at":"2026-06-12T01:29:35.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/CaptDany/oscar/pull/74","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptDany%2Foscar/issues/74","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/74/packages"},{"uuid":"4632793993","node_id":"PR_kwDOSefv2c7k7cf_","number":51,"state":"closed","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-10T19:21:48.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-10T15:52:05.000Z","updated_at":"2026-06-10T19:21:58.000Z","time_to_close":12583,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/Nodus-protocol/Nodus-Protocol-Backend/pull/51","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nodus-protocol%2FNodus-Protocol-Backend/issues/51","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/51/packages"},{"uuid":"4609181390","node_id":"PR_kwDOSqZPbs7jtmcH","number":6,"state":"open","title":"deps(deps): Bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-08T00:14:06.000Z","updated_at":"2026-06-08T00:14:06.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps): Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/changryeul/wtg/pull/6","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/changryeul%2Fwtg/issues/6","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/6/packages"},{"uuid":"4584852814","node_id":"PR_kwDOIebONs7ielEq","number":155,"state":"open","title":"chore(deps): bump the security-updates group with 22 updates","user":"dependabot[bot]","labels":["size/L","dependencies","go"],"assignees":[],"locked":false,"comments_count":4,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-04T01:01:24.000Z","updated_at":"2026-06-04T01:07:03.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"security-updates","update_count":22,"packages":[{"name":"github.com/BurntSushi/toml","old_version":"1.5.0","new_version":"1.6.0","repository_url":"https://github.com/BurntSushi/toml"},{"name":"github.com/gin-gonic/gin","old_version":"1.11.0","new_version":"1.12.0","repository_url":"https://github.com/gin-gonic/gin"},{"name":"github.com/go-sql-driver/mysql","old_version":"1.9.2","new_version":"1.10.0","repository_url":"https://github.com/go-sql-driver/mysql"},{"name":"github.com/prometheus/client_golang","old_version":"1.22.0","new_version":"1.23.2","repository_url":"https://github.com/prometheus/client_golang"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.etcd.io/etcd/api/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.etcd.io/etcd/client/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.etcd.io/etcd/server/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.opentelemetry.io/contrib/propagators/autoprop","old_version":"0.63.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/contrib/samplers/jaegerremote","old_version":"0.37.0","new_version":"0.37.1","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/bridge/opentracing","old_version":"1.36.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/jaeger","old_version":"1.16.0","new_version":"1.17.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace","old_version":"1.38.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.38.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp","old_version":"1.36.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.0","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/sys","old_version":"0.42.0","new_version":"0.45.0","repository_url":"https://github.com/golang/sys"},{"name":"gorm.io/gorm","old_version":"1.30.0","new_version":"1.31.1","repository_url":"https://github.com/go-gorm/gorm"},{"name":"k8s.io/client-go","old_version":"0.34.1","new_version":"0.36.1","repository_url":"https://github.com/kubernetes/client-go"}],"path":null,"ecosystem":"go"},"body":"Bumps the security-updates group with 22 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) | `1.5.0` | `1.6.0` |\n| [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) | `1.11.0` | `1.12.0` |\n| [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | `1.9.2` | `1.10.0` |\n| [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `1.22.0` | `1.23.2` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.etcd.io/etcd/api/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.etcd.io/etcd/client/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.etcd.io/etcd/server/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.opentelemetry.io/contrib/propagators/autoprop](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.63.0` | `0.69.0` |\n| [go.opentelemetry.io/contrib/samplers/jaegerremote](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.37.0` | `0.37.1` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/bridge/opentracing](https://github.com/open-telemetry/opentelemetry-go) | `1.36.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/jaeger](https://github.com/open-telemetry/opentelemetry-go) | `1.16.0` | `1.17.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://github.com/open-telemetry/opentelemetry-go) | `1.38.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.38.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) | `1.36.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.0` | `1.28.0` |\n| [golang.org/x/sys](https://github.com/golang/sys) | `0.42.0` | `0.45.0` |\n| [gorm.io/gorm](https://github.com/go-gorm/gorm) | `1.30.0` | `1.31.1` |\n| [k8s.io/client-go](https://github.com/kubernetes/client-go) | `0.34.1` | `0.36.1` |\n\nUpdates `github.com/BurntSushi/toml` from 1.5.0 to 1.6.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/BurntSushi/toml/releases\"\u003egithub.com/BurntSushi/toml's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.0\u003c/h2\u003e\n\u003cp\u003eTOML 1.1 is now enabled by default. The TOML changelog has an overview of changes: \u003ca href=\"https://github.com/toml-lang/toml/blob/main/CHANGELOG.md\"\u003ehttps://github.com/toml-lang/toml/blob/main/CHANGELOG.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAlso two small fixes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEncode large floats as exponent syntax so that round-tripping things like \u003ccode\u003e5e+22\u003c/code\u003e is correct.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUsing duplicate array keys would not give an error:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earr = [1]\r\narr = [2]\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will now correctly give a \u0026quot;Key 'arr' has already been defined\u0026quot; error.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/52534926c55b4cd85b05aee90569dd0668b8cf30\"\u003e\u003ccode\u003e5253492\u003c/code\u003e\u003c/a\u003e Enable TOML 1.1 by default (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/457\"\u003e#457\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/e954445330492727c18483838a15f88a4fc2d03a\"\u003e\u003ccode\u003ee954445\u003c/code\u003e\u003c/a\u003e Reject duplicate arrays (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/455\"\u003e#455\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/6b16cbdb0f5a152aad1a6b89798a89655b84150d\"\u003e\u003ccode\u003e6b16cbd\u003c/code\u003e\u003c/a\u003e Update toml-test test cases from upstream (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/456\"\u003e#456\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/011fa2bc64cec3bb4ec450d11984f5e87b8e158c\"\u003e\u003ccode\u003e011fa2b\u003c/code\u003e\u003c/a\u003e Ensure constant format strings in wf calls\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/4b439bf5c6ef125a94df7a136733df5ba37d4c16\"\u003e\u003ccode\u003e4b439bf\u003c/code\u003e\u003c/a\u003e Remove itemNil\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/a473c125bce7078efea98a29698b7c1eb453ff0b\"\u003e\u003ccode\u003ea473c12\u003c/code\u003e\u003c/a\u003e Add test for out of range float64\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/b535ff89e48996de98ace1301decf94a3a480aa8\"\u003e\u003ccode\u003eb535ff8\u003c/code\u003e\u003c/a\u003e Add some boring tests for lex.go\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/6011ef0c32b214ac134b8228af2a667e171dad6e\"\u003e\u003ccode\u003e6011ef0\u003c/code\u003e\u003c/a\u003e Remove unreachable condition in lexTableNameStart\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/c8ca9e6c2d5987a6c23f89d13987ac335aad90c3\"\u003e\u003ccode\u003ec8ca9e6\u003c/code\u003e\u003c/a\u003e Remove unreachable condition\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/1121f81c60f5947e13057fa5efecbf21369c651e\"\u003e\u003ccode\u003e1121f81\u003c/code\u003e\u003c/a\u003e Make tomlv read from stdin\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/BurntSushi/toml/compare/v1.5.0...v1.6.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/gin-gonic/gin` from 1.11.0 to 1.12.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gin-gonic/gin/releases\"\u003egithub.com/gin-gonic/gin's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.12.0\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e192ac89eefc1c30f7c97ae48a9ffb1c6f1c8c8bc: feat(binding): add support for encoding.UnmarshalText in uri/query binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4203\"\u003e#4203\u003c/a\u003e) (\u003ca href=\"https://github.com/takanuva15\"\u003e\u003ccode\u003e@​takanuva15\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e53410d2e07054369e0960fbe2eed97e1b9966f12: feat(context): add GetError and GetErrorSlice methods for error retrieval (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4502\"\u003e#4502\u003c/a\u003e) (\u003ca href=\"https://github.com/raju-mechatronics\"\u003e\u003ccode\u003e@​raju-mechatronics\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eacc55e049e33b401e810dbd8c0d6dcb6b3ba2b05: feat(context): add Protocol Buffers support to content negotiation (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4423\"\u003e#4423\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e38e765119241d990705169bedb5002a29ae0cbd1: feat(context): implemented Delete method (\u003ca href=\"https://github.com/Spyder01\"\u003e\u003ccode\u003e@​Spyder01\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e771dcc6476d7bc6abb9ec0235ecefa4d38fe6fb0: feat(gin): add option to use escaped path (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4420\"\u003e#4420\u003c/a\u003e) (\u003ca href=\"https://github.com/ldesauw\"\u003e\u003ccode\u003e@​ldesauw\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e4dec17afdff48e8018c83618fbbe69fceeb2b41d: feat(logger): color latency (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4146\"\u003e#4146\u003c/a\u003e) (\u003ca href=\"https://github.com/wsyqn6\"\u003e\u003ccode\u003e@​wsyqn6\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ed7776de7d444935ea4385999711bd6331a98fecb: feat(render): add bson protocol (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4145\"\u003e#4145\u003c/a\u003e) (\u003ca href=\"https://github.com/laurentcau\"\u003e\u003ccode\u003e@​laurentcau\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eb917b14ff9d189f16a7492be79d123a47806ee19: fix(binding): empty value error (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/2169\"\u003e#2169\u003c/a\u003e) (\u003ca href=\"https://github.com/guonaihong\"\u003e\u003ccode\u003e@​guonaihong\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec3d1092b3b48addf6f9cd00fe274ec3bd14650eb: fix(binding): improve empty slice/array handling in form binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4380\"\u003e#4380\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e9914178584e42458ff7d23891463a880f58c9d86: fix(context): ClientIP handling for multiple X-Forwarded-For header values (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4472\"\u003e#4472\u003c/a\u003e) (\u003ca href=\"https://github.com/Nurysso\"\u003e\u003ccode\u003e@​Nurysso\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e2a794cd0b0faa7d829291375b27a3467ea972b0d: fix(debug): version mismatch (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4403\"\u003e#4403\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec3d5a28ed6d3849da820195b6774d212bcc038a9: fix(gin): close os.File in RunFd to prevent resource leak (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4422\"\u003e#4422\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5fad976b372e381312f8de69f0969f1284d229d3: fix(gin): literal colon routes not working with engine.Handler() (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4415\"\u003e#4415\u003c/a\u003e) (\u003ca href=\"https://github.com/pawannn\"\u003e\u003ccode\u003e@​pawannn\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e63dd3e60cab89c27fb66bce1423bd268d52abad1: fix(recover): suppress http.ErrAbortHandler in recover (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4336\"\u003e#4336\u003c/a\u003e) (\u003ca href=\"https://github.com/MondayCha\"\u003e\u003ccode\u003e@​MondayCha\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5c00df8afadd06cc5be530dde00fe6d9fa4a2e4a: fix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4206\"\u003e#4206\u003c/a\u003e) (\u003ca href=\"https://github.com/dengaleev\"\u003e\u003ccode\u003e@​dengaleev\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e234a6d4c00cb77af9852aca0b8289745d5529b4b: fix(response): refine hijack behavior for response lifecycle (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4373\"\u003e#4373\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e472d086af2acd924cb4b9d7be0525f7d790f69bc: fix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4535\"\u003e#4535\u003c/a\u003e) (\u003ca href=\"https://github.com/veeceey\"\u003e\u003ccode\u003e@​veeceey\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e8e07d37c63e5536eb25f4af4c91eabeee4011fba: fix: Correct typos, improve documentation clarity, and remove dead code (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4511\"\u003e#4511\u003c/a\u003e) (\u003ca href=\"https://github.com/mahanadh\"\u003e\u003ccode\u003e@​mahanadh\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eEnhancements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eba093d19477b896ac89a7fc3246af23d290b8e26: chore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4549\"\u003e#4549\u003c/a\u003e) (\u003ca href=\"https://github.com/BobDu\"\u003e\u003ccode\u003e@​BobDu\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eb2b489dbf4826c2c630717a77fd5e42774625410: chore(context): always trust xff headers from unix socket (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/3359\"\u003e#3359\u003c/a\u003e) (\u003ca href=\"https://github.com/WeidiDeng\"\u003e\u003ccode\u003e@​WeidiDeng\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eecb3f7b5e2f3915bf1db240ed5eee572f8dbea36: chore(deps): upgrade golang.org/x/crypto to v0.45.0 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4449\"\u003e#4449\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eaf6e8b70b8261bb0c99ad094fe552ab92991620a: chore(deps): upgrade quic-go to v0.57.1 (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003edb309081bc5c137b2aa15701ef53f7f19788da25: chore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4547\"\u003e#4547\u003c/a\u003e) (\u003ca href=\"https://github.com/USA-RedDragon\"\u003e\u003ccode\u003e@​USA-RedDragon\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e26c3a628655cad2388380cb8102d6ce7d4875f3b: chore(response): prevent Flush() panic when \u003ccode\u003ehttp.Flusher\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4479\"\u003e#4479\u003c/a\u003e) (\u003ca href=\"https://github.com/Twacqwq\"\u003e\u003ccode\u003e@​Twacqwq\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5dd833f1f26de0eb30eae47b17e05ced2482dc41: chore: bump minimum Go version to 1.24 and update workflows (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4388\"\u003e#4388\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRefactor\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e39858a0859c914bd26948fa950477e11bd8d3823: refactor(binding): use maps.Copy for cleaner map handling (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4352\"\u003e#4352\u003c/a\u003e) (\u003ca href=\"https://github.com/russcoss\"\u003e\u003ccode\u003e@​russcoss\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec0048f645ee945c4db30593afdea10123e2c30a6: refactor(context): omit the return value names (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4395\"\u003e#4395\u003c/a\u003e) (\u003ca href=\"https://github.com/wanghaolong613\"\u003e\u003ccode\u003e@​wanghaolong613\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e915e4c90d28ec4cffc6eb146e208ab5a65eac772: refactor(context): replace hardcoded localhost IPs with constants (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4481\"\u003e#4481\u003c/a\u003e) (\u003ca href=\"https://github.com/pauloappbr\"\u003e\u003ccode\u003e@​pauloappbr\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e414de60574449457f3192a7a1d5528940db2836d: refactor(context): using maps.Clone (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4333\"\u003e#4333\u003c/a\u003e) (\u003ca href=\"https://github.com/cuiweixie\"\u003e\u003ccode\u003e@​cuiweixie\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e59e9d4a794f12c4f9a6c7bed441b9644e5f6d99b: refactor(ginS): use sync.OnceValue to simplify engine function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4314\"\u003e#4314\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e3ab698dc5110af1977d57226e4995c57dd34c233: refactor(recovery): smart error comparison (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4142\"\u003e#4142\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ed1a15347b1e45a8ee816193d3578a93bfd73b70f: refactor(utils): move util functions to utils.go (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4467\"\u003e#4467\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ee3118cc378d263454098924ebbde7e8d1dd2e904: refactor: for loop can be modernized using range over int (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4392\"\u003e#4392\u003c/a\u003e) (\u003ca href=\"https://github.com/wanghaolong613\"\u003e\u003ccode\u003e@​wanghaolong613\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e488f8c3ffa579a8d19beb2bae95ff8ef36b3d53f: refactor: replace magic numbers with named constants in bodyAllowedForStatus (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4529\"\u003e#4529\u003c/a\u003e) (\u003ca href=\"https://github.com/veeceey\"\u003e\u003ccode\u003e@​veeceey\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e9968c4bf9d5a99edc3eee2c068a4c9160ece8915: refactor: use b.Loop() to simplify the code and improve performance (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4389\"\u003e#4389\u003c/a\u003e) (\u003ca href=\"https://github.com/reddaisyy\"\u003e\u003ccode\u003e@​reddaisyy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ea85ef5ce4d0cda8834c59c855068ed48b51192d1: refactor: use b.Loop() to simplify the code and improve performance (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4432\"\u003e#4432\u003c/a\u003e) (\u003ca href=\"https://github.com/efcking\"\u003e\u003ccode\u003e@​efcking\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBuild process updates\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e61b67de522a189b568aced4c5c16917c558e3387: ci(bot): increase frequency and group updates for dependencies (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4367\"\u003e#4367\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efb27ef26c2fdfe25344b4c039d8a53551f9e912c: ci(lint): refactor test assertions and linter configuration (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4436\"\u003e#4436\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e93ff771e6dbf10e432864b30f3719ac5c84a4d4a: ci(sec): improve type safety and server organization in HTTP middleware (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4437\"\u003e#4437\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ee88fc8927a52b74f55bec0351604a56ac0aa1c51: ci(sec): schedule Trivy security scans to run daily at midnight UTC (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4439\"\u003e#4439\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5e5ff3ace496a31b138b0820136a146bfb5de0ef: ci: replace vulnerability scanning workflow with Trivy integration (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4421\"\u003e#4421\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e00900fb3e1ea9dde33985a0e4f6afec793d5e786: ci: update CI workflows and standardize Trivy config quotes (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4531\"\u003e#4531\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eae3f524974fc4f55d18c9e7fae4614503c015226: ci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4550\"\u003e#4550\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md\"\u003egithub.com/gin-gonic/gin's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eGin v1.12.0\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(render): add bson protocol (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4145\"\u003e#4145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): add GetError and GetErrorSlice methods for error retrieval (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4502\"\u003e#4502\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(binding): add support for encoding.UnmarshalText in uri/query binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4203\"\u003e#4203\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(gin): add option to use escaped path (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4420\"\u003e#4420\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): add Protocol Buffers support to content negotiation (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4423\"\u003e#4423\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): implemented Delete method (\u003ca href=\"https://github.com/gin-gonic/gin/commit/38e7651\"\u003e#38e7651\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(logger): color latency (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4146\"\u003e#4146\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eEnhancements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eperf(tree): reduce allocations in findCaseInsensitivePath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4417\"\u003e#4417\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(recovery): optimize line reading in stack function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4466\"\u003e#4466\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(path): replace regex with custom functions in redirectTrailingSlash (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4414\"\u003e#4414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(tree): optimize path parsing using strings.Count (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4246\"\u003e#4246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4547\"\u003e#4547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(context): always trust xff headers from unix socket (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/3359\"\u003e#3359\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(response): prevent Flush() panic when the underlying ResponseWriter does not implement \u003ccode\u003ehttp.Flusher\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4479\"\u003e#4479\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(recovery): smart error comparison (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4142\"\u003e#4142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(context): replace hardcoded localhost IPs with constants (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4481\"\u003e#4481\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(utils): move util functions to utils.go (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4467\"\u003e#4467\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(binding): use maps.Copy for cleaner map handling (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4352\"\u003e#4352\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(context): using maps.Clone (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4333\"\u003e#4333\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(ginS): use sync.OnceValue to simplify engine function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4314\"\u003e#4314\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor: replace magic numbers with named constants in bodyAllowedForStatus (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4529\"\u003e#4529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor: for loop can be modernized using range over int (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4392\"\u003e#4392\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4535\"\u003e#4535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4206\"\u003e#4206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(context): ClientIP handling for multiple X-Forwarded-For header values (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4472\"\u003e#4472\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(binding): empty value error (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/2169\"\u003e#2169\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(recover): suppress http.ErrAbortHandler in recover (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4336\"\u003e#4336\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(gin): literal colon routes not working with engine.Handler() (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4415\"\u003e#4415\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(gin): close os.File in RunFd to prevent resource leak (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4422\"\u003e#4422\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(response): refine hijack behavior for response lifecycle (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4373\"\u003e#4373\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(binding): improve empty slice/array handling in form binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4380\"\u003e#4380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(debug): version mismatch (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4403\"\u003e#4403\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: correct typos, improve documentation clarity, and remove dead code (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4511\"\u003e#4511\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBuild process updates / CI\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4550\"\u003e#4550\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4549\"\u003e#4549\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/73726dc606796a025971fe451f0aa6f1b9b847f6\"\u003e\u003ccode\u003e73726dc\u003c/code\u003e\u003c/a\u003e docs: update documentation to reflect Go version changes (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4552\"\u003e#4552\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/e292e5caa777bce70b66fe08c94cbe9cef3e2ec9\"\u003e\u003ccode\u003ee292e5c\u003c/code\u003e\u003c/a\u003e docs: document and finalize Gin v1.12.0 release (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4551\"\u003e#4551\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/ae3f524974fc4f55d18c9e7fae4614503c015226\"\u003e\u003ccode\u003eae3f524\u003c/code\u003e\u003c/a\u003e ci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4550\"\u003e#4550\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/38534e2bf98a06e1f62d6b24384e90b5f78699bf\"\u003e\u003ccode\u003e38534e2\u003c/code\u003e\u003c/a\u003e chore(deps): bump golang.org/x/net from 0.50.0 to 0.51.0 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4548\"\u003e#4548\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/472d086af2acd924cb4b9d7be0525f7d790f69bc\"\u003e\u003ccode\u003e472d086\u003c/code\u003e\u003c/a\u003e fix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4535\"\u003e#4535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/fb2583442c4d9bccb75e6d26f1aa6e7c01950db6\"\u003e\u003ccode\u003efb25834\u003c/code\u003e\u003c/a\u003e test(context): use http.StatusContinue constant instead of magic number 100 (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/6f1d5fe3cdb171a08928c3c9dd3fbcfc9ee1b521\"\u003e\u003ccode\u003e6f1d5fe\u003c/code\u003e\u003c/a\u003e test(render): add comprehensive error handling tests (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4541\"\u003e#4541\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/5c00df8afadd06cc5be530dde00fe6d9fa4a2e4a\"\u003e\u003ccode\u003e5c00df8\u003c/code\u003e\u003c/a\u003e fix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4206\"\u003e#4206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/db309081bc5c137b2aa15701ef53f7f19788da25\"\u003e\u003ccode\u003edb30908\u003c/code\u003e\u003c/a\u003e chore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4547\"\u003e#4547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/ba093d19477b896ac89a7fc3246af23d290b8e26\"\u003e\u003ccode\u003eba093d1\u003c/code\u003e\u003c/a\u003e chore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4549\"\u003e#4549\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/gin-gonic/gin/compare/v1.11.0...v1.12.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/go-sql-driver/mysql` from 1.9.2 to 1.10.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/go-sql-driver/mysql/releases\"\u003egithub.com/go-sql-driver/mysql's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.10.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eadd Go 1.24 to the test matrix by \u003ca href=\"https://github.com/shogo82148\"\u003e\u003ccode\u003e@​shogo82148\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1681\"\u003ego-sql-driver/mysql#1681\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003emodernize for Go 1.22 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1695\"\u003ego-sql-driver/mysql#1695\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest stability improvement. by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1698\"\u003ego-sql-driver/mysql#1698\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esimplify collation tests by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1700\"\u003ego-sql-driver/mysql#1700\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix bigint unsigned null column scan to err type int64 by \u003ca href=\"https://github.com/elonnzhang\"\u003e\u003ccode\u003e@​elonnzhang\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1612\"\u003ego-sql-driver/mysql#1612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eTransaction Commit/Rollback returns conn's cached error, if present by \u003ca href=\"https://github.com/brad-defined\"\u003e\u003ccode\u003e@​brad-defined\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1691\"\u003ego-sql-driver/mysql#1691\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadd BenchmarkReceive10kRowsCompress by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1704\"\u003ego-sql-driver/mysql#1704\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eoptimize readPacket by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1705\"\u003ego-sql-driver/mysql#1705\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMariaDB Metadata skipping and DEPRECATE_EOF by \u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1708\"\u003ego-sql-driver/mysql#1708\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOptimization: statements reuse previous column name by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1711\"\u003ego-sql-driver/mysql#1711\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupdate outdated MySQL internals documentation links by \u003ca href=\"https://github.com/demouth\"\u003e\u003ccode\u003e@​demouth\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1714\"\u003ego-sql-driver/mysql#1714\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix PING on compressed connections by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1721\"\u003ego-sql-driver/mysql#1721\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadd DeepWiki badge by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1722\"\u003ego-sql-driver/mysql#1722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate edwards25519 dependency to v1.1.1 by \u003ca href=\"https://github.com/williamhaw\"\u003e\u003ccode\u003e@​williamhaw\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1749\"\u003ego-sql-driver/mysql#1749\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eConfigure Dependabot for Go modules by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1755\"\u003ego-sql-driver/mysql#1755\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump dominikh/staticcheck-action from 1.3.1 to 1.4.1 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1759\"\u003ego-sql-driver/mysql#1759\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 3 to 4 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1760\"\u003ego-sql-driver/mysql#1760\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/setup-go from 5 to 6 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1757\"\u003ego-sql-driver/mysql#1757\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix staticcheck error by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1761\"\u003ego-sql-driver/mysql#1761\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/checkout from 4 to 6 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1758\"\u003ego-sql-driver/mysql#1758\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix getSystemVar buffer reuse by \u003ca href=\"https://github.com/morgo\"\u003e\u003ccode\u003e@​morgo\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1754\"\u003ego-sql-driver/mysql#1754\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eConsolidate Dependabot update noise by grouping weekly dependency PRs by \u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1762\"\u003ego-sql-driver/mysql#1762\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump filippo.io/edwards25519 from 1.1.1 to 1.2.0 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1756\"\u003ego-sql-driver/mysql#1756\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCI: Update GitHub Actions Go matrix to 1.24–1.26 by \u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1763\"\u003ego-sql-driver/mysql#1763\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnhance interpolateParams to correctly handle placeholders by \u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1732\"\u003ego-sql-driver/mysql#1732\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003emodernize by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1764\"\u003ego-sql-driver/mysql#1764\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease v1.10.0 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1765\"\u003ego-sql-driver/mysql#1765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/elonnzhang\"\u003e\u003ccode\u003e@​elonnzhang\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1612\"\u003ego-sql-driver/mysql#1612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/brad-defined\"\u003e\u003ccode\u003e@​brad-defined\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1691\"\u003ego-sql-driver/mysql#1691\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1708\"\u003ego-sql-driver/mysql#1708\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/demouth\"\u003e\u003ccode\u003e@​demouth\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1714\"\u003ego-sql-driver/mysql#1714\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/williamhaw\"\u003e\u003ccode\u003e@​williamhaw\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1749\"\u003ego-sql-driver/mysql#1749\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1759\"\u003ego-sql-driver/mysql#1759\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/morgo\"\u003e\u003ccode\u003e@​morgo\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1754\"\u003ego-sql-driver/mysql#1754\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1762\"\u003ego-sql-driver/mysql#1762\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\"\u003ehttps://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.9.3\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[1.9] test stability improvement. by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1699\"\u003ego-sql-driver/mysql#1699\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] Transaction Commit/Rollback returns conn's cached error by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1702\"\u003ego-sql-driver/mysql#1702\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebackport benchmark_test by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1706\"\u003ego-sql-driver/mysql#1706\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] optimize readPacket (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1705\"\u003e#1705\u003c/a\u003e) by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1707\"\u003ego-sql-driver/mysql#1707\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] fix PING on compressed connections by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1723\"\u003ego-sql-driver/mysql#1723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease v1.9.3 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1725\"\u003ego-sql-driver/mysql#1725\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/go-sql-driver/mysql/blob/master/CHANGELOG.md\"\u003egithub.com/go-sql-driver/mysql's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.10.0 (2026-04-28)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003egetSystemVar(\u0026quot;max_allowed_packet\u0026quot;)\u003c/code\u003e potentially returned wrong value. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1754\"\u003e#1754\u003c/a\u003e)\nThis affects only when \u003ccode\u003emaxAllowedPacket=0\u003c/code\u003e is set.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBump filippo.io/edwards25519 from 1.1.1 to 1.2.0. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1756\"\u003e#1756\u003c/a\u003e)\nWhile older versions have reported CVEs, they do not affect go-mysql.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Go versions to 1.24-1.26. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1763\"\u003e#1763\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnhance interpolateParams to correctly handle placeholders. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1732\"\u003e#1732\u003c/a\u003e)\nThe question mark (?) within strings and comments will no longer be treated as a placeholder.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.9.3 (2025-06-13)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etx.Commit()\u003c/code\u003e and \u003ccode\u003etx.Rollback()\u003c/code\u003e returned \u003ccode\u003eErrInvalidConn\u003c/code\u003e always.\nNow they return cached real error if present. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1690\"\u003e#1690\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOptimize reading small result sets to fix a performance regression\nintroduced by compression protocol support. (\u003ccode\u003e[#1707](https://github.com/go-sql-driver/mysql/issues/1707)\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003edb.Ping()\u003c/code\u003e on compressed connection. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1723\"\u003e#1723\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/a065b60ab6d0c8e15468e7709c7f76acf4431647\"\u003e\u003ccode\u003ea065b60\u003c/code\u003e\u003c/a\u003e release v1.10.0 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1765\"\u003e#1765\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/09e4187be9c52bb13449a662d2a36e1e1789ac95\"\u003e\u003ccode\u003e09e4187\u003c/code\u003e\u003c/a\u003e modernize (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1764\"\u003e#1764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/6c44a9a0a1769e145dc91c08abe1aded2936ab63\"\u003e\u003ccode\u003e6c44a9a\u003c/code\u003e\u003c/a\u003e Enhance interpolateParams to correctly handle placeholders (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1732\"\u003e#1732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/688ce563a28598a9b733e6fc2b325050a4dcf261\"\u003e\u003ccode\u003e688ce56\u003c/code\u003e\u003c/a\u003e Update supported Go version to 1.24–1.26 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1763\"\u003e#1763\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/118d07fdb51f9e523ebcdb00628812e49d7c1881\"\u003e\u003ccode\u003e118d07f\u003c/code\u003e\u003c/a\u003e Bump filippo.io/edwards25519 from 1.1.1 to 1.2.0 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1756\"\u003e#1756\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/d6b2d3ee2cc8569b6778a7ae7ac2816e185f616b\"\u003e\u003ccode\u003ed6b2d3e\u003c/code\u003e\u003c/a\u003e Consolidate Dependabot update noise by grouping weekly dependency PRs (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1762\"\u003e#1762\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/037dfd872a7b6c88e63c53f32700dffed560120c\"\u003e\u003ccode\u003e037dfd8\u003c/code\u003e\u003c/a\u003e Fix getSystemVar buffer reuse (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1754\"\u003e#1754\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/900f33035615559b6188e4fa98d57ae20af2b73b\"\u003e\u003ccode\u003e900f330\u003c/code\u003e\u003c/a\u003e Bump actions/checkout from 4 to 6 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1758\"\u003e#1758\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/ab9e3804c604d6a60b0d3136f4654f81f184757d\"\u003e\u003ccode\u003eab9e380\u003c/code\u003e\u003c/a\u003e fix staticcheck error (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1761\"\u003e#1761\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/f298c66742396b6921732744b9bb075c7faaca81\"\u003e\u003ccode\u003ef298c66\u003c/code\u003e\u003c/a\u003e Bump actions/setup-go from 5 to 6 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1757\"\u003e#1757\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/prometheus/client_golang` from 1.22.0 to 1.23.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/prometheus/client_golang/releases\"\u003egithub.com/prometheus/client_golang's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.23.2 - 2025-09-05\u003c/h2\u003e\n\u003cp\u003eThis release is made to upgrade to prometheus/common v0.66.1, which drops the dependencies github.com/grafana/regexp and go.uber.org/atomic and replaces gopkg.in/yaml.v2 with go.yaml.in/yaml/v2 (a drop-in replacement). There are no functional changes.\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cul\u003e\n\u003cli\u003e[release-1.23] Upgrade to prometheus/common@v0.66.1 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1869\"\u003eprometheus/client_golang#1869\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[release-1.23] Cut v1.23.2 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1870\"\u003eprometheus/client_golang#1870\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.23.1...v1.23.2\"\u003ehttps://github.com/prometheus/client_golang/compare/v1.23.1...v1.23.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.23.1 - 2025-09-04\u003c/h2\u003e\n\u003cp\u003eThis release is made to be compatible with a backwards incompatible API change in prometheus/common v0.66.0. There are no functional changes.\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cul\u003e\n\u003cli\u003e[release-1.23] Upgrade to prometheus/common v0.66 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1866\"\u003eprometheus/client_golang#1866\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[release-1.23] Cut v1.23.1 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1867\"\u003eprometheus/client_golang#1867\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.1\"\u003ehttps://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.23.0 - 2025-07-30\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1812\"\u003e#1812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1766\"\u003e#1766\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add exemplars for native histograms \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1686\"\u003e#1686\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] exp/api: Bubble up status code from writeResponse \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1823\"\u003e#1823\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1833\"\u003e#1833\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[BUGFIX] exp/api: client prompt return on context cancellation \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1729\"\u003e#1729\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md\"\u003egithub.com/prometheus/client_golang's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.23.2 / 2025-09-05\u003c/h2\u003e\n\u003cp\u003eThis release is made to upgrade to prometheus/common v0.66.1, which drops the dependencies github.com/grafana/regexp and go.uber.org/atomic and replaces gopkg.in/yaml.v2 with go.yaml.in/yaml/v2 (a drop-in replacement).\nThere are no functional changes.\u003c/p\u003e\n\u003ch2\u003e1.23.1 / 2025-09-04\u003c/h2\u003e\n\u003cp\u003eThis release is made to be compatible with a backwards incompatible API change\nin prometheus/common v0.66.0. There are no functional changes.\u003c/p\u003e\n\u003ch2\u003e1.23.0 / 2025-07-30\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1812\"\u003e#1812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1766\"\u003e#1766\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add exemplars for native histograms \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1686\"\u003e#1686\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] exp/api: Bubble up status code from writeResponse \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1823\"\u003e#1823\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1833\"\u003e#1833\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[BUGFIX] exp/api: client prompt return on context cancellation \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1729\"\u003e#1729\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/8179a560819f2c64ef6ade70e6ae4c73aecaca3c\"\u003e\u003ccode\u003e8179a56\u003c/code\u003e\u003c/a\u003e Cut v1.23.2 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1870\"\u003e#1870\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/4142b5908bb6c8f5e412b72de5ea4b927d8c219d\"\u003e\u003ccode\u003e4142b59\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1869\"\u003e#1869\u003c/a\u003e from prometheus/arve/upgrade-common\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/4ff40f0d918efc0f59701d13622913805c2425b4\"\u003e\u003ccode\u003e4ff40f0\u003c/code\u003e\u003c/a\u003e Cut v1.23.1 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1867\"\u003e#1867\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/989b0298944e64f88a54ac9c70cd8c8121f10bc9\"\u003e\u003ccode\u003e989b029\u003c/code\u003e\u003c/a\u003e Upgrade to prometheus/common v0.66 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1866\"\u003e#1866\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/e4b2208dd8cb6d1425f00250db842ec3c1e8749e\"\u003e\u003ccode\u003ee4b2208\u003c/code\u003e\u003c/a\u003e Cut v1.23.0 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1848\"\u003e#1848\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/d9492afd3a6f2e9782a7fc10363281bfd5b743bb\"\u003e\u003ccode\u003ed9492af\u003c/code\u003e\u003c/a\u003e cut v1.23.0-rc.1 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1842\"\u003e#1842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/aeae8a0b4f54a8fa720d19b88638a2d048596f82\"\u003e\u003ccode\u003eaeae8a0\u003c/code\u003e\u003c/a\u003e Cut v1.23.0-rc.0 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1837\"\u003e#1837\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/b157309b723f0b8588ea604bb78dbbba196803f2\"\u003e\u003ccode\u003eb157309\u003c/code\u003e\u003c/a\u003e Update common Prometheus files (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1832\"\u003e#1832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/a704e287f467b79744c30af996b7d710d4c6900d\"\u003e\u003ccode\u003ea704e28\u003c/code\u003e\u003c/a\u003e build(deps): bump the github-actions group with 3 updates (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1826\"\u003e#1826\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/c7743110ad2c599de3d8c23682d978a12f9f36d1\"\u003e\u003ccode\u003ec774311\u003c/code\u003e\u003c/a\u003e Fix errNotImplemented reference (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1835\"\u003e#1835\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.22.0...v1.23.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary...\n\n_Description has been truncated_\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n\n## Summary by CodeRabbit\n\n* **Chores**\n  * Updated Go version to 1.26.0\n  * Refreshed core project dependencies including web framework, database drivers, monitoring and observability packages, caching, and distributed systems tools\n  * Updated transitive dependencies across the dependency tree, including migration to newer authentication library version\n  * Bumped utility packages for performance and compatibility improvements\n\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e","html_url":"https://github.com/kubeservice-stack/common/pull/155","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubeservice-stack%2Fcommon/issues/155","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/155/packages"},{"uuid":"4584346186","node_id":"PR_kwDOSCoGAc7ic584","number":6,"state":"open","title":"chore(deps): Bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T23:13:09.000Z","updated_at":"2026-06-03T23:13:09.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/venaissance/shorturl/pull/6","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/venaissance%2Fshorturl/issues/6","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/6/packages"},{"uuid":"4584142569","node_id":"PR_kwDOP1itWs7icOa4","number":1132,"state":"open","title":"build(deps): Bump the go-gateway group in /services/gateway with 7 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T22:30:49.000Z","updated_at":"2026-06-03T22:31:06.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): Bump","group_name":"go-gateway","update_count":7,"packages":[{"name":"github.com/redis/go-redis/extra/redisprometheus/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin","old_version":"0.68.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"}],"path":"/services/gateway","ecosystem":"go"},"body":"Bumps the go-gateway group in /services/gateway with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/redis/go-redis/extra/redisprometheus/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.68.0` | `0.69.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n\nUpdates `github.com/redis/go-redis/extra/redisprometheus/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/extra/redisprometheus/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/extra/redisprometheus/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin` from 0.68.0 to 0.69.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/releases\"\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eotelconf: validate encoding configuration for OTLP HTTP exporters by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8772\"\u003eopen-telemetry/opentelemetry-go-contrib#8772\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.99.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8780\"\u003eopen-telemetry/opentelemetry-go-contrib#8780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update prom/prometheus docker tag to v3.11.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8779\"\u003eopen-telemetry/opentelemetry-go-contrib#8779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotellogrus: Set error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8778\"\u003eopen-telemetry/opentelemetry-go-contrib#8778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/sys to v0.43.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8783\"\u003eopen-telemetry/opentelemetry-go-contrib#8783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x/telemetry digest to 93c7c8a by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8786\"\u003eopen-telemetry/opentelemetry-go-contrib#8786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-isatty to v0.0.21 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8787\"\u003eopen-telemetry/opentelemetry-go-contrib#8787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-runewidth to v0.0.23 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8788\"\u003eopen-telemetry/opentelemetry-go-contrib#8788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8791\"\u003eopen-telemetry/opentelemetry-go-contrib#8791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/github-script action to v9 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8795\"\u003eopen-telemetry/opentelemetry-go-contrib#8795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8794\"\u003eopen-telemetry/opentelemetry-go-contrib#8794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotelzap: set error field as record.SetErr  by \u003ca href=\"https://github.com/iblancasa\"\u003e\u003ccode\u003e@​iblancasa\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8719\"\u003eopen-telemetry/opentelemetry-go-contrib#8719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x to 746e56f by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8796\"\u003eopen-telemetry/opentelemetry-go-contrib#8796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/arch to v0.26.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8798\"\u003eopen-telemetry/opentelemetry-go-contrib#8798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck if otelgrpc metrics are enabled by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8792\"\u003eopen-telemetry/opentelemetry-go-contrib#8792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/upload-artifact action to v7.0.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8800\"\u003eopen-telemetry/opentelemetry-go-contrib#8800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck instrument enabled in deprecatedruntime by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8793\"\u003eopen-telemetry/opentelemetry-go-contrib#8793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/forbidigo/v2 to v2.3.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8804\"\u003eopen-telemetry/opentelemetry-go-contrib#8804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/makezero/v2 to v2.2.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8802\"\u003eopen-telemetry/opentelemetry-go-contrib#8802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/manuelarte/funcorder to v0.6.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8803\"\u003eopen-telemetry/opentelemetry-go-contrib#8803\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/2.5.1/0.69.0/0.37.1/0.24.0/0.19.0/0.16.1/0.16.0] - 2026-05-28\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/03b2bcdb54b3dde73c9ff91ae216aec262f6c8f5\"\u003e\u003ccode\u003e03b2bcd\u003c/code\u003e\u003c/a\u003e Release v1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9033\"\u003e#9033\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/80c46d4037d5991ce324216a52cf7e8d7f2d81fa\"\u003e\u003ccode\u003e80c46d4\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/alecthomas/chroma/v2 to v2.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9034\"\u003e#9034\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/51f292197d33b84a21b3c70ae21cb185a2570d5e\"\u003e\u003ccode\u003e51f2921\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/hetznercloud/hcloud-go/v2 to v2.41.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9026\"\u003e#9026\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/db82162f1b642bb6dca7fa5be48045315bb466d6\"\u003e\u003ccode\u003edb82162\u003c/code\u003e\u003c/a\u003e fix(deps): update aws-sdk-go-v2 monorepo (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9031\"\u003e#9031\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/5a3e533d8cd4045128e61a966f6dad58964a78ea\"\u003e\u003ccode\u003e5a3e533\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/aws/smithy-go to v1.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9032\"\u003e#9032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c67843c753a924faef17bc4aa63c138aa9472477\"\u003e\u003ccode\u003ec67843c\u003c/code\u003e\u003c/a\u003e otelhttp: Remove custom wrapper after handling request (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c0a41352283151ab6655e88120e4ff4f0a917a2e\"\u003e\u003ccode\u003ec0a4135\u003c/code\u003e\u003c/a\u003e docs(otelhttptrace): add performance guidance for WithoutSubSpans (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8785\"\u003e#8785\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/a51a86790e1f4df231a70bb5fecc72b95d3c1bf0\"\u003e\u003ccode\u003ea51a867\u003c/code\u003e\u003c/a\u003e otelconf: implement cardinality_limits support in PeriodicMetricReader (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/dead6e50fc0b5b3dc4aea288df207953dae5afe7\"\u003e\u003ccode\u003edead6e5\u003c/code\u003e\u003c/a\u003e chore(deps): update module go.yaml.in/yaml/v2 to v2.4.4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8994\"\u003e#8994\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/979ce1857524394d0884fd7c491722c5bcb43d50\"\u003e\u003ccode\u003e979ce18\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/jgautheron/goconst to v1.10.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9030\"\u003e#9030\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.68.0...zpages/v0.69.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go...\n\n_Description has been truncated_","html_url":"https://github.com/egorribun/university_ecosystem/pull/1132","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/egorribun%2Funiversity_ecosystem/issues/1132","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1132/packages"},{"uuid":"4584107228","node_id":"PR_kwDOP1itWs7icG7z","number":1131,"state":"open","title":"build(deps): Bump the go-ws-hub group in /services/ws-hub with 7 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T22:23:55.000Z","updated_at":"2026-06-03T22:24:09.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): Bump","group_name":"go-ws-hub","update_count":7,"packages":[{"name":"github.com/pact-foundation/pact-go/v2","old_version":"2.4.3","new_version":"2.5.1","repository_url":"https://github.com/pact-foundation/pact-go"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp","old_version":"0.68.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"}],"path":"/services/ws-hub","ecosystem":"go"},"body":"Bumps the go-ws-hub group in /services/ws-hub with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/pact-foundation/pact-go/v2](https://github.com/pact-foundation/pact-go) | `2.4.3` | `2.5.1` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.68.0` | `0.69.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n\nUpdates `github.com/pact-foundation/pact-go/v2` from 2.4.3 to 2.5.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pact-foundation/pact-go/releases\"\u003egithub.com/pact-foundation/pact-go/v2's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.5.1\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eba5ba8a72145364379e8e6488734d59ea4dd9baf chore(release): release v2.5.1\u003c/li\u003e\n\u003cli\u003ea8b37f15a270c0391873a8d29fb57184a40c25e9 docs(native): note ErrVerifierFailed and ErrVerifierFailedToRun are mutually exclusive (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/579\"\u003e#579\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev2.5.0\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e4be01969422ae50c0d0bc771ea0a83775848f59c chore(deps): update actions/checkout action to v6 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/547\"\u003e#547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e78a41e97ded8c49478bbf588089fbad1457f5247 chore(deps): update actions/upload-artifact action to v7 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/556\"\u003e#556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e3c4ec69a84e895441e14b5e01b9903b13b61891d chore(deps): update dependency golangci/golangci-lint to v2.12.2 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/572\"\u003e#572\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e769772f44e75a7cc43cfe8ad1dc4a0e781f12dfc chore(deps): update golang docker tag to v1.26 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/570\"\u003e#570\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ef84e41df136826fe5e0b869073f23524b892fc38 chore(release): release v2.5.0\u003c/li\u003e\n\u003cli\u003e1342c817898247cbc69107b12b53dee790fa6f7a feat(provider): expose verifier error sentinels for errors.Is discrimination (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/577\"\u003e#577\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e889dc1e2ec2b5643bd3a87db92f0321ada6e7bbd fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pact-foundation/pact-go/blob/master/CHANGELOG.md\"\u003egithub.com/pact-foundation/pact-go/v2's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch3\u003ev2.5.1 (26 May 2026)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ef7737e8 - docs: update verifier error result sentinel descriptions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ev2.5.0 (22 May 2026)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/1342c81\"\u003e1342c81\u003c/a\u003e - feat(provider): expose verifier error sentinels for errors.Is discrimination (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/577\"\u003e#577\u003c/a\u003e) (Stanislav Vodetskyi, Thu May 21 16:45:56 2026 -0700)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/889dc1e\"\u003e889dc1e\u003c/a\u003e - fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e) (renovate[bot], Mon May 18 10:10:39 2026 +1000)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/ba5ba8a72145364379e8e6488734d59ea4dd9baf\"\u003e\u003ccode\u003eba5ba8a\u003c/code\u003e\u003c/a\u003e chore(release): release v2.5.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/a8b37f15a270c0391873a8d29fb57184a40c25e9\"\u003e\u003ccode\u003ea8b37f1\u003c/code\u003e\u003c/a\u003e docs(native): note ErrVerifierFailed and ErrVerifierFailedToRun are mutually ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/f84e41df136826fe5e0b869073f23524b892fc38\"\u003e\u003ccode\u003ef84e41d\u003c/code\u003e\u003c/a\u003e chore(release): release v2.5.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/1342c817898247cbc69107b12b53dee790fa6f7a\"\u003e\u003ccode\u003e1342c81\u003c/code\u003e\u003c/a\u003e feat(provider): expose verifier error sentinels for errors.Is discrimination ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/889dc1e2ec2b5643bd3a87db92f0321ada6e7bbd\"\u003e\u003ccode\u003e889dc1e\u003c/code\u003e\u003c/a\u003e fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/3c4ec69a84e895441e14b5e01b9903b13b61891d\"\u003e\u003ccode\u003e3c4ec69\u003c/code\u003e\u003c/a\u003e chore(deps): update dependency golangci/golangci-lint to v2.12.2 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/572\"\u003e#572\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/769772f44e75a7cc43cfe8ad1dc4a0e781f12dfc\"\u003e\u003ccode\u003e769772f\u003c/code\u003e\u003c/a\u003e chore(deps): update golang docker tag to v1.26 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/570\"\u003e#570\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/78a41e97ded8c49478bbf588089fbad1457f5247\"\u003e\u003ccode\u003e78a41e9\u003c/code\u003e\u003c/a\u003e chore(deps): update actions/upload-artifact action to v7 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/556\"\u003e#556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/4be01969422ae50c0d0bc771ea0a83775848f59c\"\u003e\u003ccode\u003e4be0196\u003c/code\u003e\u003c/a\u003e chore(deps): update actions/checkout action to v6 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/547\"\u003e#547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/d2461ae5bfcc6903d50f2d84bfad5231439b33b3\"\u003e\u003ccode\u003ed2461ae\u003c/code\u003e\u003c/a\u003e chore: update release process docs\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pact-foundation/pact-go/compare/v2.4.3...v2.5.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` from 0.68.0 to 0.69.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/releases\"\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eotelconf: validate encoding configuration for OTLP HTTP exporters by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8772\"\u003eopen-telemetry/opentelemetry-go-contrib#8772\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.99.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8780\"\u003eopen-telemetry/opentelemetry-go-contrib#8780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update prom/prometheus docker tag to v3.11.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8779\"\u003eopen-telemetry/opentelemetry-go-contrib#8779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotellogrus: Set error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8778\"\u003eopen-telemetry/opentelemetry-go-contrib#8778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/sys to v0.43.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8783\"\u003eopen-telemetry/opentelemetry-go-contrib#8783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x/telemetry digest to 93c7c8a by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8786\"\u003eopen-telemetry/opentelemetry-go-contrib#8786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-isatty to v0.0.21 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8787\"\u003eopen-telemetry/opentelemetry-go-contrib#8787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-runewidth to v0.0.23 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8788\"\u003eopen-telemetry/opentelemetry-go-contrib#8788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8791\"\u003eopen-telemetry/opentelemetry-go-contrib#8791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/github-script action to v9 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8795\"\u003eopen-telemetry/opentelemetry-go-contrib#8795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8794\"\u003eopen-telemetry/opentelemetry-go-contrib#8794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotelzap: set error field as record.SetErr  by \u003ca href=\"https://github.com/iblancasa\"\u003e\u003ccode\u003e@​iblancasa\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8719\"\u003eopen-telemetry/opentelemetry-go-contrib#8719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x to 746e56f by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8796\"\u003eopen-telemetry/opentelemetry-go-contrib#8796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/arch to v0.26.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8798\"\u003eopen-telemetry/opentelemetry-go-contrib#8798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck if otelgrpc metrics are enabled by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8792\"\u003eopen-telemetry/opentelemetry-go-contrib#8792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/upload-artifact action to v7.0.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8800\"\u003eopen-telemetry/opentelemetry-go-contrib#8800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck instrument enabled in deprecatedruntime by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8793\"\u003eopen-telemetry/opentelemetry-go-contrib#8793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/forbidigo/v2 to v2.3.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8804\"\u003eopen-telemetry/opentelemetry-go-contrib#8804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/makezero/v2 to v2.2.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8802\"\u003eopen-telemetry/opentelemetry-go-contrib#8802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/manuelarte/funcorder to v0.6.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8803\"\u003eopen-telemetry/opentelemetry-go-contrib#8803\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/2.5.1/0.69.0/0.37.1/0.24.0/0.19.0/0.16.1/0.16.0] - 2026-05-28\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/03b2bcdb54b3dde73c9ff91ae216aec262f6c8f5\"\u003e\u003ccode\u003e03b2bcd\u003c/code\u003e\u003c/a\u003e Release v1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9033\"\u003e#9033\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/80c46d4037d5991ce324216a52cf7e8d7f2d81fa\"\u003e\u003ccode\u003e80c46d4\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/alecthomas/chroma/v2 to v2.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9034\"\u003e#9034\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/51f292197d33b84a21b3c70ae21cb185a2570d5e\"\u003e\u003ccode\u003e51f2921\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/hetznercloud/hcloud-go/v2 to v2.41.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9026\"\u003e#9026\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/db82162f1b642bb6dca7fa5be48045315bb466d6\"\u003e\u003ccode\u003edb82162\u003c/code\u003e\u003c/a\u003e fix(deps): update aws-sdk-go-v2 monorepo (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9031\"\u003e#9031\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/5a3e533d8cd4045128e61a966f6dad58964a78ea\"\u003e\u003ccode\u003e5a3e533\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/aws/smithy-go to v1.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9032\"\u003e#9032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c67843c753a924faef17bc4aa63c138aa9472477\"\u003e\u003ccode\u003ec67843c\u003c/code\u003e\u003c/a\u003e otelhttp: Remove custom wrapper after handling request (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c0a41352283151ab6655e88120e4ff4f0a917a2e\"\u003e\u003ccode\u003ec0a4135\u003c/code\u003e\u003c/a\u003e docs(otelhttptrace): add performance guidance for WithoutSubSpans (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8785\"\u003e#8785\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/a51a86790e1f4df231a70bb5fecc72b95d3c1bf0\"\u003e\u003ccode\u003ea51a867\u003c/code\u003e\u003c/a\u003e otelconf: implement cardinality_limits support in PeriodicMetricReader (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/dead6e50fc0b5b3dc4aea288df207953dae5afe7\"\u003e\u003ccode\u003edead6e5\u003c/code\u003e\u003c/a\u003e chore(deps): update module go.yaml.in/yaml/v2 to v2.4.4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8994\"\u003e#8994\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/979ce1857524394d0884fd7c491722c5bcb43d50\"\u003e\u003ccode\u003e979ce18\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/jgautheron/goconst to v1.10.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9030\"\u003e#9030\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.68.0...zpages/v0.69.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelem...\n\n_Description has been truncated_","html_url":"https://github.com/egorribun/university_ecosystem/pull/1131","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/egorribun%2Funiversity_ecosystem/issues/1131","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1131/packages"},{"uuid":"4574963081","node_id":"PR_kwDOOdjLf87h9_jJ","number":9,"state":"closed","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-15T15:08:37.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-02T21:03:38.000Z","updated_at":"2026-06-15T15:08:39.000Z","time_to_close":1101899,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/fransfilastap/urlshortener/pull/9","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/fransfilastap%2Furlshortener/issues/9","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/9/packages"},{"uuid":"4569468381","node_id":"PR_kwDOLwul-c7hr6J5","number":96,"state":"closed","title":"Bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0 in the gomod group","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-06-07T07:12:40.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-02T07:37:34.000Z","updated_at":"2026-06-07T07:12:42.000Z","time_to_close":430506,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":"the gomod group","ecosystem":"go"},"body":"Bumps the gomod group with 1 update: [github.com/redis/go-redis/v9](https://github.com/redis/go-redis).\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/AS203038/looking-glass/pull/96","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/AS203038%2Flooking-glass/issues/96","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/96/packages"},{"uuid":"4568247691","node_id":"PR_kwDOR7yHgs7hn8wD","number":19,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-02T03:49:37.000Z","updated_at":"2026-06-02T03:49:38.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/yi-nology/rainbow_bridge/pull/19","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/yi-nology%2Frainbow_bridge/issues/19","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/19/packages"},{"uuid":"4568044380","node_id":"PR_kwDOPBkrgM7hnRhA","number":68,"state":"open","title":"deps(deps): bump github.com/redis/go-redis/v9 from 9.12.1 to 9.20.0","user":"dependabot[bot]","labels":["minor","no-version-update","dependencies","go"],"assignees":["saviobatista"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-02T03:09:03.000Z","updated_at":"2026-06-02T03:11:34.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.12.1","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.12.1 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.12.1...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.12.1\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/saviobatista/sbs-logger/pull/68","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/saviobatista%2Fsbs-logger/issues/68","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/68/packages"},{"uuid":"4567006832","node_id":"PR_kwDOQfHMY87hj64C","number":36,"state":"open","title":"deps: bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-01T23:04:59.000Z","updated_at":"2026-06-01T23:05:00.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/davidbudnick/redis-tui/pull/36","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidbudnick%2Fredis-tui/issues/36","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/36/packages"},{"uuid":"4566867300","node_id":"PR_kwDOQSbpRs7hjd_o","number":381,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0 in /services/message-processor","user":"dependabot[bot]","labels":["needs-manual-review","dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-01T22:33:10.000Z","updated_at":"2026-06-01T22:34:24.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":"/services/message-processor","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/caesarakalaeii/all-chat/pull/381","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/caesarakalaeii%2Fall-chat/issues/381","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/381/packages"},{"uuid":"4563179075","node_id":"PR_kwDOI4BqqM7hXXMD","number":2010,"state":"closed","title":"chore(deps): bump the gomod-updates group across 1 directory with 12 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-08T05:06:23.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-01T12:43:58.000Z","updated_at":"2026-06-08T05:06:24.000Z","time_to_close":577345,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"gomod-updates","update_count":12,"packages":[{"name":"connectrpc.com/connect","old_version":"1.19.1","new_version":"1.20.0","repository_url":"https://github.com/connectrpc/connect-go"},{"name":"github.com/DataDog/datadog-agent/pkg/trace/log","old_version":"0.78.0","new_version":"0.79.1","repository_url":"https://github.com/DataDog/datadog-agent"},{"name":"github.com/Masterminds/semver/v3","old_version":"3.4.0","new_version":"3.5.0","repository_url":"https://github.com/Masterminds/semver"},{"name":"github.com/exaring/otelpgx","old_version":"0.10.0","new_version":"0.11.1","repository_url":"https://github.com/exaring/otelpgx"},{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/prometheus","old_version":"0.65.0","new_version":"0.66.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.1","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/crypto","old_version":"0.50.0","new_version":"0.52.0","repository_url":"https://github.com/golang/crypto"},{"name":"google.golang.org/grpc","old_version":"1.80.0","new_version":"1.81.1","repository_url":"https://github.com/grpc/grpc-go"}],"path":null,"ecosystem":"go"},"body":"Bumps the gomod-updates group with 10 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [connectrpc.com/connect](https://github.com/connectrpc/connect-go) | `1.19.1` | `1.20.0` |\n| [github.com/DataDog/datadog-agent/pkg/trace/log](https://github.com/DataDog/datadog-agent) | `0.78.0` | `0.79.1` |\n| [github.com/Masterminds/semver/v3](https://github.com/Masterminds/semver) | `3.4.0` | `3.5.0` |\n| [github.com/exaring/otelpgx](https://github.com/exaring/otelpgx) | `0.10.0` | `0.11.1` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.18.0` | `9.20.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/prometheus](https://github.com/open-telemetry/opentelemetry-go) | `0.65.0` | `0.66.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.1` | `1.28.0` |\n| [golang.org/x/crypto](https://github.com/golang/crypto) | `0.50.0` | `0.52.0` |\n| [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `1.80.0` | `1.81.1` |\n\n\nUpdates `connectrpc.com/connect` from 1.19.1 to 1.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/connectrpc/connect-go/releases\"\u003econnectrpc.com/connect's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.20.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump minimum supported Go version to 1.25 by \u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate Unary-Get query parameter order to match spec recommendation by \u003ca href=\"https://github.com/oliversun9\"\u003e\u003ccode\u003e@​oliversun9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.19.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eGovernance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ca href=\"https://github.com/timostamm\"\u003e\u003ccode\u003e@​timostamm\u003c/code\u003e\u003c/a\u003e as a maintainer in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/905\"\u003econnectrpc/connect-go#905\u003c/a\u003e 🎉\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBugfixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse 'deadline_exceeded' instead of 'canceled' on HTTP/2 cancelation when appropriate by \u003ca href=\"https://github.com/jhump\"\u003e\u003ccode\u003e@​jhump\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/904\"\u003econnectrpc/connect-go#904\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndReceive by \u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRefactor memhttptest to work with Go 1.25 synctest by \u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDoc clarifications by \u003ca href=\"https://github.com/emcfarlane\"\u003e\u003ccode\u003e@​emcfarlane\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/912\"\u003e#912\u003c/a\u003e) and \u003ca href=\"https://github.com/stefanvanburen\"\u003e\u003ccode\u003e@​stefanvanburen\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/906\"\u003e#906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e:\n\u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1291a7dcac19b00490f935dce18f44f301fc58f6\"\u003e\u003ccode\u003e1291a7d\u003c/code\u003e\u003c/a\u003e Prepare for v1.20.0 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/927\"\u003e#927\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/6df682f19e5b957b96b5fa44ffb28705a2d7bc8c\"\u003e\u003ccode\u003e6df682f\u003c/code\u003e\u003c/a\u003e Update Unary-Get query parameter order to match spec recommendation (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/c4aac92b87026cd709cfbccdaabe8c45abef705c\"\u003e\u003ccode\u003ec4aac92\u003c/code\u003e\u003c/a\u003e Chore update buf v1.69.0 and license year (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/925\"\u003e#925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/a5a6c30f3776b06ae05a66ab3bdd2d60c46db6db\"\u003e\u003ccode\u003ea5a6c30\u003c/code\u003e\u003c/a\u003e Bump Go from v1.24 to v1.25 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/138e2700eb60b8004363eb344031b317bf599a1f\"\u003e\u003ccode\u003e138e270\u003c/code\u003e\u003c/a\u003e Back to development (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/921\"\u003e#921\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1c195ae986164a681af958e675dd283eed23e365\"\u003e\u003ccode\u003e1c195ae\u003c/code\u003e\u003c/a\u003e Prepare for v1.19.2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/920\"\u003e#920\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/96abc6b87132d1c43f67f1f5c91efdcb6a59b4aa\"\u003e\u003ccode\u003e96abc6b\u003c/code\u003e\u003c/a\u003e Upgrade golangci-lint to v2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/917\"\u003e#917\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/be72fa520cdc8b942db6839dadbe9af0b44b40df\"\u003e\u003ccode\u003ebe72fa5\u003c/code\u003e\u003c/a\u003e Clarify concurrent use semantics for streaming types (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/299d2e7cdfb5e2fa3fa0963e6cedc51a7364521d\"\u003e\u003ccode\u003e299d2e7\u003c/code\u003e\u003c/a\u003e Fix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndRecei...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/e299aa60ffcf91633e48fcb3dd594cbbb187ec7f\"\u003e\u003ccode\u003ee299aa6\u003c/code\u003e\u003c/a\u003e Bump google.golang.org/grpc from 1.76.0 to 1.79.3 in /internal/conformance (#...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/DataDog/datadog-agent/pkg/trace/log` from 0.78.0 to 0.79.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/672032c98c6432dd3629dbc98dc5581df7078397\"\u003e\u003ccode\u003e672032c\u003c/code\u003e\u003c/a\u003e [release] Update release.json for 7.79.1 (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51405\"\u003e#51405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/1509dd32beee61fa0b5fb9278c26798f0ec23a12\"\u003e\u003ccode\u003e1509dd3\u003c/code\u003e\u003c/a\u003e [release] Update release.json for 7.79.1-rc.1 (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51147\"\u003e#51147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/506b038c308566d18e845c3e10ca838b06cc5244\"\u003e\u003ccode\u003e506b038\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x] Bump prometheus/prometheus to address CVE-2026-42151 and CV...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/ab42b5891a6e2635216d523ea660d3839b11d89c\"\u003e\u003ccode\u003eab42b58\u003c/code\u003e\u003c/a\u003e [backport] rshell v0.0.14-1 to fix ps (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51298\"\u003e#51298\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/953f787c36af686eaafaec4eb0e8702d7ef0c0d5\"\u003e\u003ccode\u003e953f787\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  [automated] Update golang.org/x/... dependencies (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51259\"\u003e#51259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/771a21d4b9bf5cad703f3184e8da206b33a88bdd\"\u003e\u003ccode\u003e771a21d\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  [autoscaling] Re-sync local-owner DPAs on annotation chang...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/2f261afbafe04d3408fe3cf3fb47e9d8e8d9f72e\"\u003e\u003ccode\u003e2f261af\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  macos: fix system-probe.yaml being overwritten on upgrade ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/ab3c1143b35d66abc0465eaa670d8678447841f1\"\u003e\u003ccode\u003eab3c114\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  ignore sigpipe in mac gui app (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51195\"\u003e#51195\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/59a166c538378a5bcdfdacad62c238b1c9a81636\"\u003e\u003ccode\u003e59a166c\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x] fix(npm/windows): suppress lingering flow re-reports that c...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/27801b98135f636019506e5058b64c48b1f58767\"\u003e\u003ccode\u003e27801b9\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  Update curl (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/50966\"\u003e#50966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/DataDog/datadog-agent/compare/pkg/api/v0.78.0...pkg/api/v0.79.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/Masterminds/semver/v3` from 3.4.0 to 3.5.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/Masterminds/semver/releases\"\u003egithub.com/Masterminds/semver/v3's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev3.5.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdding more prerelease tests by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/273\"\u003eMasterminds/semver#273\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate constraint error messages by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/278\"\u003eMasterminds/semver#278\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix edge cases by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/279\"\u003eMasterminds/semver#279\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdding some checks in by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/280\"\u003eMasterminds/semver#280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdating deps by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/281\"\u003eMasterminds/semver#281\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 4.35.1 to 4.35.2 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/282\"\u003eMasterminds/semver#282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/cache from 4.2.3 to 5.0.5 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/283\"\u003eMasterminds/semver#283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump golangci/golangci-lint-action from 7.0.1 to 9.2.0 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/284\"\u003eMasterminds/semver#284\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdating gitignore for devcontainers by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/286\"\u003eMasterminds/semver#286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFixing some quality issues by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/287\"\u003eMasterminds/semver#287\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] made their first contribution in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/282\"\u003eMasterminds/semver#282\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\"\u003ehttps://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/Masterminds/semver/blob/master/CHANGELOG.md\"\u003egithub.com/Masterminds/semver/v3's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/8b89c86cb53c57cfd5d07c13de12bc4d78954e99\"\u003e\u003ccode\u003e8b89c86\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/287\"\u003e#287\u003c/a\u003e from mattfarina/fix-da-issues\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/29d51d0ea4bffe39173673685d0dd312447d74a7\"\u003e\u003ccode\u003e29d51d0\u003c/code\u003e\u003c/a\u003e Fixing some quality issues\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/87f651dbe2f616342d6408b997ad7116ba72ddf3\"\u003e\u003ccode\u003e87f651d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/286\"\u003e#286\u003c/a\u003e from mattfarina/update-devcontainer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/158a6852a7e66d99594653227d3e8c3dc6d160ca\"\u003e\u003ccode\u003e158a685\u003c/code\u003e\u003c/a\u003e Updating gitignore for devcontainers\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/7e83c080cfb4455752c654805b189274a10890ab\"\u003e\u003ccode\u003e7e83c08\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/284\"\u003e#284\u003c/a\u003e from Masterminds/dependabot/github_actions/golangci/g...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/697e27f32e7419eb896e7d3ec680c65fc673166b\"\u003e\u003ccode\u003e697e27f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/283\"\u003e#283\u003c/a\u003e from Masterminds/dependabot/github_actions/actions/ca...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/1591f8e3806198f60fa4dcaf2751bfc805c7740d\"\u003e\u003ccode\u003e1591f8e\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/282\"\u003e#282\u003c/a\u003e from Masterminds/dependabot/github_actions/github/cod...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/3f5ff1737a28437e536d3ec54e41919577748ae6\"\u003e\u003ccode\u003e3f5ff17\u003c/code\u003e\u003c/a\u003e Bump golangci/golangci-lint-action from 7.0.1 to 9.2.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/04baa3376047b6d5e79ffcc60f69332dd3e26c85\"\u003e\u003ccode\u003e04baa33\u003c/code\u003e\u003c/a\u003e Bump actions/cache from 4.2.3 to 5.0.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/45939fec77cd7d07d586b823284d11423028e9c2\"\u003e\u003ccode\u003e45939fe\u003c/code\u003e\u003c/a\u003e Bump github/codeql-action from 4.35.1 to 4.35.2\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/exaring/otelpgx` from 0.10.0 to 0.11.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/exaring/otelpgx/releases\"\u003egithub.com/exaring/otelpgx's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev0.11.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: Tracer.logConnectionDetails defaults to true by \u003ca href=\"https://github.com/trygve-baerland\"\u003e\u003ccode\u003e@​trygve-baerland\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/80\"\u003eexaring/otelpgx#80\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/trygve-baerland\"\u003e\u003ccode\u003e@​trygve-baerland\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/80\"\u003eexaring/otelpgx#80\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.11.0...v0.11.1\"\u003ehttps://github.com/exaring/otelpgx/compare/v0.11.0...v0.11.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev0.11.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): upgrade Go version to 1.25 + use latest stable otel semconv by \u003ca href=\"https://github.com/ValentinLvr\"\u003e\u003ccode\u003e@​ValentinLvr\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/74\"\u003eexaring/otelpgx#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat: add option to disable the AcquireTracer by \u003ca href=\"https://github.com/joshua-tianci\"\u003e\u003ccode\u003e@​joshua-tianci\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/73\"\u003eexaring/otelpgx#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(stats): allow WithStatsAttributes to override library defaults by \u003ca href=\"https://github.com/obitech\"\u003e\u003ccode\u003e@​obitech\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/78\"\u003eexaring/otelpgx#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: spring cleaning — Go matrix, pgx, testify, golangci-lint by \u003ca href=\"https://github.com/obitech\"\u003e\u003ccode\u003e@​obitech\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/79\"\u003eexaring/otelpgx#79\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ValentinLvr\"\u003e\u003ccode\u003e@​ValentinLvr\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/74\"\u003eexaring/otelpgx#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/joshua-tianci\"\u003e\u003ccode\u003e@​joshua-tianci\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/73\"\u003eexaring/otelpgx#73\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.0\"\u003ehttps://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/626246cecc54852957b15ff581eaadc139893e17\"\u003e\u003ccode\u003e626246c\u003c/code\u003e\u003c/a\u003e Fix lints\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/168b1050b5d09587aa3fab80da4a0aa50aa4b7d3\"\u003e\u003ccode\u003e168b105\u003c/code\u003e\u003c/a\u003e Refactor tests to use testify\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/795d56ddbeaca027d09b464e99bf693d68b264f3\"\u003e\u003ccode\u003e795d56d\u003c/code\u003e\u003c/a\u003e fix logConnectionDetails\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/76cf7a5e74d62b3d166720df7c2f2edbde5daee2\"\u003e\u003ccode\u003e76cf7a5\u003c/code\u003e\u003c/a\u003e Add tests for asserting trace attributes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/25501deaaaeb09fc8a76c6719ab4b87ee7378b79\"\u003e\u003ccode\u003e25501de\u003c/code\u003e\u003c/a\u003e fix(ci): test from go1.25+\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/ca37215cd0dd8b46c2c17db02d424817278591f1\"\u003e\u003ccode\u003eca37215\u003c/code\u003e\u003c/a\u003e fix: Update .github/workflows/test.yaml\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/b0d28b5275d7e20efbc7420cadf8ff0fa0130729\"\u003e\u003ccode\u003eb0d28b5\u003c/code\u003e\u003c/a\u003e refactor(test): use typed context key in span name test\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/45dc29040173579735def2de9d112dd8b1a6577f\"\u003e\u003ccode\u003e45dc290\u003c/code\u003e\u003c/a\u003e chore(lint): switch from golint to golangci-lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/ad455b081c94019e793b969f26c9dcdc42dcc0c9\"\u003e\u003ccode\u003ead455b0\u003c/code\u003e\u003c/a\u003e refactor: switch to testify\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/e630def1602b705641a39594c43336d8281e14b3\"\u003e\u003ccode\u003ee630def\u003c/code\u003e\u003c/a\u003e chore: update pgx\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.18.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/prometheus` from 0.65.0 to 0.66.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/releases\"\u003ego.opentelemetry.io/otel/exporters/prometheus's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v0.66.0/v0.20.0/v0.0.17\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/HEAD/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\nThis can break users who relied on the previous unlimited default.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/prometheus's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/xmtp/xmtpd/pull/2010","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmtp%2Fxmtpd/issues/2010","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/2010/packages"}],"issue_packages":[{"old_version":"9.19.0","new_version":"9.20.1","update_type":"minor","path":"/services/emote-service","pr_created_at":"2026-06-15T06:54:41.000Z","version_change":"9.19.0 → 9.20.1","issue":{"uuid":"4662748583","node_id":"PR_kwDOQSbpRs7magQX","number":429,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.1 in /services/emote-service","user":"dependabot[bot]","labels":["needs-manual-review","dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-15T06:54:41.000Z","updated_at":"2026-06-15T06:56:54.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"/services/emote-service","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/caesarakalaeii/all-chat/pull/429","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/caesarakalaeii%2Fall-chat/issues/429","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/429/packages"}},{"old_version":"9.7.0","new_version":"9.20.1","update_type":"minor","path":"the go-module-minor-patch group","pr_created_at":"2026-06-15T01:08:46.000Z","version_change":"9.7.0 → 9.20.1","issue":{"uuid":"4661302209","node_id":"PR_kwDOStQJBM7mV4T0","number":15,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.7.0 to 9.20.1 in the go-module-minor-patch group","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-15T01:08:46.000Z","updated_at":"2026-06-15T01:08:47.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.7.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"the go-module-minor-patch group","ecosystem":"go"},"body":"Bumps the go-module-minor-patch group with 1 update: [github.com/redis/go-redis/v9](https://github.com/redis/go-redis).\n\nUpdates `github.com/redis/go-redis/v9` from 9.7.0 to 9.20.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.7.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.7.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/ZoneCNH/redisx/pull/15","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/ZoneCNH%2Fredisx/issues/15","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/15/packages"}},{"old_version":"9.20.0","new_version":"9.20.1","update_type":"patch","path":null,"pr_created_at":"2026-06-14T12:42:28.000Z","version_change":"9.20.0 → 9.20.1","issue":{"uuid":"4659127509","node_id":"PR_kwDOQ315r87mPPb8","number":32,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.20.0 to 9.20.1","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-14T12:42:28.000Z","updated_at":"2026-06-14T12:42:29.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.20.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.20.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.20.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/open-apime/apime/pull/32","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-apime%2Fapime/issues/32","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/32/packages"}},{"old_version":"9.19.0","new_version":"9.20.1","update_type":"minor","path":null,"pr_created_at":"2026-06-14T06:52:45.000Z","version_change":"9.19.0 → 9.20.1","issue":{"uuid":"4658212892","node_id":"PR_kwDOSmJ6Is7mMeM3","number":23,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.1","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-14T06:52:45.000Z","updated_at":"2026-06-14T06:52:46.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/nkokkalis/dbconfigsync-operator/pull/23","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/nkokkalis%2Fdbconfigsync-operator/issues/23","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/23/packages"}},{"old_version":"9.7.3","new_version":"9.20.1","update_type":"minor","path":"/threat-intel","pr_created_at":"2026-06-13T23:02:35.000Z","version_change":"9.7.3 → 9.20.1","issue":{"uuid":"4657228572","node_id":"PR_kwDORz07ic7mJi20","number":49,"state":"open","title":"chore(deps)(deps): bump github.com/redis/go-redis/v9 from 9.7.3 to 9.20.1 in /threat-intel","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-13T23:02:35.000Z","updated_at":"2026-06-13T23:03:04.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.7.3","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":"/threat-intel","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.7.3 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.7.3...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.7.3\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/tsm7979/tsm79/pull/49","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/tsm7979%2Ftsm79/issues/49","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/49/packages"}},{"old_version":"9.18.0","new_version":"9.20.1","update_type":"minor","path":null,"pr_created_at":"2026-06-13T10:22:32.000Z","version_change":"9.18.0 → 9.20.1","issue":{"uuid":"4655187269","node_id":"PR_kwDOSlZEDc7mDbaQ","number":12,"state":"open","title":"chore(deps): bump the go-deps group across 1 directory with 11 updates","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-13T10:22:32.000Z","updated_at":"2026-06-13T10:22:33.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"go-deps","update_count":11,"packages":[{"name":"connectrpc.com/connect","old_version":"1.19.1","new_version":"1.20.0","repository_url":"https://github.com/connectrpc/connect-go"},{"name":"github.com/jackc/pgx/v5","old_version":"5.9.0","new_version":"5.10.0","repository_url":"https://github.com/jackc/pgx"},{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.1","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/sync","old_version":"0.20.0","new_version":"0.21.0","repository_url":"https://github.com/golang/sync"}],"path":null,"ecosystem":"go"},"body":"Bumps the go-deps group with 7 updates in the /backend directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [connectrpc.com/connect](https://github.com/connectrpc/connect-go) | `1.19.1` | `1.20.0` |\n| [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) | `5.9.0` | `5.10.0` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.18.0` | `9.20.1` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.1` | `1.28.0` |\n| [golang.org/x/sync](https://github.com/golang/sync) | `0.20.0` | `0.21.0` |\n\n\nUpdates `connectrpc.com/connect` from 1.19.1 to 1.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/connectrpc/connect-go/releases\"\u003econnectrpc.com/connect's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.20.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump minimum supported Go version to 1.25 by \u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate Unary-Get query parameter order to match spec recommendation by \u003ca href=\"https://github.com/oliversun9\"\u003e\u003ccode\u003e@​oliversun9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.19.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eGovernance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ca href=\"https://github.com/timostamm\"\u003e\u003ccode\u003e@​timostamm\u003c/code\u003e\u003c/a\u003e as a maintainer in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/905\"\u003econnectrpc/connect-go#905\u003c/a\u003e 🎉\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBugfixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse 'deadline_exceeded' instead of 'canceled' on HTTP/2 cancelation when appropriate by \u003ca href=\"https://github.com/jhump\"\u003e\u003ccode\u003e@​jhump\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/904\"\u003econnectrpc/connect-go#904\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndReceive by \u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRefactor memhttptest to work with Go 1.25 synctest by \u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDoc clarifications by \u003ca href=\"https://github.com/emcfarlane\"\u003e\u003ccode\u003e@​emcfarlane\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/912\"\u003e#912\u003c/a\u003e) and \u003ca href=\"https://github.com/stefanvanburen\"\u003e\u003ccode\u003e@​stefanvanburen\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/906\"\u003e#906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e:\n\u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1291a7dcac19b00490f935dce18f44f301fc58f6\"\u003e\u003ccode\u003e1291a7d\u003c/code\u003e\u003c/a\u003e Prepare for v1.20.0 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/927\"\u003e#927\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/6df682f19e5b957b96b5fa44ffb28705a2d7bc8c\"\u003e\u003ccode\u003e6df682f\u003c/code\u003e\u003c/a\u003e Update Unary-Get query parameter order to match spec recommendation (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/c4aac92b87026cd709cfbccdaabe8c45abef705c\"\u003e\u003ccode\u003ec4aac92\u003c/code\u003e\u003c/a\u003e Chore update buf v1.69.0 and license year (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/925\"\u003e#925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/a5a6c30f3776b06ae05a66ab3bdd2d60c46db6db\"\u003e\u003ccode\u003ea5a6c30\u003c/code\u003e\u003c/a\u003e Bump Go from v1.24 to v1.25 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/138e2700eb60b8004363eb344031b317bf599a1f\"\u003e\u003ccode\u003e138e270\u003c/code\u003e\u003c/a\u003e Back to development (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/921\"\u003e#921\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1c195ae986164a681af958e675dd283eed23e365\"\u003e\u003ccode\u003e1c195ae\u003c/code\u003e\u003c/a\u003e Prepare for v1.19.2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/920\"\u003e#920\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/96abc6b87132d1c43f67f1f5c91efdcb6a59b4aa\"\u003e\u003ccode\u003e96abc6b\u003c/code\u003e\u003c/a\u003e Upgrade golangci-lint to v2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/917\"\u003e#917\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/be72fa520cdc8b942db6839dadbe9af0b44b40df\"\u003e\u003ccode\u003ebe72fa5\u003c/code\u003e\u003c/a\u003e Clarify concurrent use semantics for streaming types (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/299d2e7cdfb5e2fa3fa0963e6cedc51a7364521d\"\u003e\u003ccode\u003e299d2e7\u003c/code\u003e\u003c/a\u003e Fix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndRecei...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/e299aa60ffcf91633e48fcb3dd594cbbb187ec7f\"\u003e\u003ccode\u003ee299aa6\u003c/code\u003e\u003c/a\u003e Bump google.golang.org/grpc from 1.76.0 to 1.79.3 in /internal/conformance (#...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/jackc/pgx/v5` from 5.9.0 to 5.10.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/jackc/pgx/blob/master/CHANGELOG.md\"\u003egithub.com/jackc/pgx/v5's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e5.10.0 (June 3, 2026)\u003c/h1\u003e\n\u003cp\u003eThis release includes a significant amount of hardening against malicious or compromised PostgreSQL servers,\ncontributed by Sean Chittenden at CrowdStrike, Inc. This work bounds binary decoders against attacker-controlled\nmessage sizes, caps server-supplied SCRAM iteration counts, adds \u003ccode\u003erequire_auth\u003c/code\u003e to restrict which authentication\nmethods a server may use (mitigating downgrade attacks under \u003ccode\u003esslmode=prefer\u003c/code\u003e), and ensures cancellation requests are\nsent over TLS when the original connection used TLS.\u003c/p\u003e\n\u003ch2\u003eFeatures\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003erequire_auth\u003c/code\u003e to restrict accepted server authentication methods (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eParseConfigOptions.ConnStringAllowedKeys\u003c/code\u003e to restrict allowed connection string keys (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eStructArgs\u003c/code\u003e and \u003ccode\u003eStrictStructArgs\u003c/code\u003e for \u003ccode\u003e@\u003c/code\u003e-named queries (Tubelight30)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eErrConnClosed\u003c/code\u003e sentinel error and unwrap it from \u003ccode\u003econnLockError\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgxpool: check if connection is expired before acquire (arthurdotwork)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eSecurity Hardening\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEncrypt \u003ccode\u003eCancelRequest\u003c/code\u003e connection when the primary connection used TLS (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eCap server-supplied SCRAM iteration count (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eDefault Frontend max message body length to ~1 GiB (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound hstore binary decode against malicious server input (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound array binary decode element length against remaining message bytes (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound array element count against remaining message bytes (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eBound range, multirange, and tsvector binary decoders (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eDocument secure connection configuration (Sean Chittenden at CrowdStrike, Inc.)\u003c/li\u003e\n\u003cli\u003eFix panic on malformed geometric text; return an error instead (MaIII)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eFixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFix scanning \u003ccode\u003e\u0026quot;char\u0026quot;\u003c/code\u003e (OID 18) into \u003ccode\u003e*string\u003c/code\u003e in binary format (luongs3)\u003c/li\u003e\n\u003cli\u003eFix handling of typed-nil \u003ccode\u003edriver.Valuer\u003c/code\u003e in array and composite codecs (Donncha Fahy)\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eCopyData.Data\u003c/code\u003e hex decoding in \u003ccode\u003eUnmarshalJSON\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003eFix data race when context is cancelled during connect\u003c/li\u003e\n\u003cli\u003eFix \u003ccode\u003eparseKeywordValueSettings\u003c/code\u003e rejecting trailing whitespace (alliasgher)\u003c/li\u003e\n\u003cli\u003epgconn: preserve full error chain in \u003ccode\u003enormalizeTimeoutError\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgconn: use a fresh context for the fallback connection in \u003ccode\u003econnectPreferred\u003c/code\u003e (Charlie Tonneslan)\u003c/li\u003e\n\u003cli\u003epgxpool: fix \u003ccode\u003eMaxLifetimeDestroyCount\u003c/code\u003e and ping order for acquire-time expiry check\u003c/li\u003e\n\u003cli\u003eAdd missing error check of \u003ccode\u003erows.Err\u003c/code\u003e to load types (Jen Altavilla)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1\u003e5.9.2 (April 18, 2026)\u003c/h1\u003e\n\u003cp\u003eFix SQL Injection via placeholder confusion with dollar quoted string literals (GHSA-j88v-2chj-qfwx)\u003c/p\u003e\n\u003cp\u003eSQL injection can occur when:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eThe non-default simple protocol is used.\u003c/li\u003e\n\u003cli\u003eA dollar quoted string literal is used in the SQL query.\u003c/li\u003e\n\u003cli\u003eThat query contains text that would be would be interpreted outside as a placeholder outside of a string literal.\u003c/li\u003e\n\u003cli\u003eThe value of that placeholder is controllable by the attacker.\u003c/li\u003e\n\u003c/ol\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/7293fb11125be0373a92f716683f2d494f6fd4b0\"\u003e\u003ccode\u003e7293fb1\u003c/code\u003e\u003c/a\u003e Update changelog for v5.10.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/1ade2852841d4ee55677207200f4ffdbc217ce69\"\u003e\u003ccode\u003e1ade285\u003c/code\u003e\u003c/a\u003e pgconn: document secure connection configuration\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/b4d6d4d1be7f381bb81d12ebfecae6b10f5c7562\"\u003e\u003ccode\u003eb4d6d4d\u003c/code\u003e\u003c/a\u003e pgtype: bound range, multirange, and tsvector binary decoders\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/0639b37f8f4fff31dbe73297087e69b3ccc3bf2b\"\u003e\u003ccode\u003e0639b37\u003c/code\u003e\u003c/a\u003e pgconn: add ParseConfigOptions.ConnStringAllowedKeys\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/b28e65b0c3e0cd45c09e7c9ce36e5e29caa6dbe9\"\u003e\u003ccode\u003eb28e65b\u003c/code\u003e\u003c/a\u003e pgtype: bound array element count against remaining message bytes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/cd1f389d37d775bc8cb11c60363946f928c02c98\"\u003e\u003ccode\u003ecd1f389\u003c/code\u003e\u003c/a\u003e pgtype: bound array binary decode element length against remaining bytes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/ff27b5bbea012020d1fd8b9bdd56284a88783ef1\"\u003e\u003ccode\u003eff27b5b\u003c/code\u003e\u003c/a\u003e pgtype: bound hstore binary decode against malicious server input\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/a6002e12a8a393844b48c29d105e7542e7b3a251\"\u003e\u003ccode\u003ea6002e1\u003c/code\u003e\u003c/a\u003e pgproto3: default Frontend max message body length to ~1 GiB\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/44f61732ecdfd08081a1a2ff7227f1e975f0b71e\"\u003e\u003ccode\u003e44f6173\u003c/code\u003e\u003c/a\u003e pgconn: cap server-supplied SCRAM iteration count\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jackc/pgx/commit/1a976f7bb91216ea7f8369cb7abe78ce34dc244f\"\u003e\u003ccode\u003e1a976f7\u003c/code\u003e\u003c/a\u003e pgconn: add require_auth to restrict accepted server auth methods\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/jackc/pgx/compare/v5.9.0...v5.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.18.0 to 9.20.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/sdk` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/sdk's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/trace` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/trace's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/myfxlogs/ant/pull/12","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/myfxlogs%2Fant/issues/12","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/12/packages"}},{"old_version":"9.18.0","new_version":"9.20.1","update_type":"minor","path":null,"pr_created_at":"2026-06-12T01:24:47.000Z","version_change":"9.18.0 → 9.20.1","issue":{"uuid":"4645427147","node_id":"PR_kwDORx3C_s7lkAoy","number":74,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.1","user":"dependabot[bot]","labels":["area/backend"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-12T01:24:47.000Z","updated_at":"2026-06-12T01:29:35.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.1","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.1.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.1\u003c/h2\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.1 (2026-06-11)\u003c/h1\u003e\n\u003cp\u003eThis is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.\u003c/p\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRESP3 pub/sub message loss fixed\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ePeekPushNotificationName\u003c/code\u003e previously inspected only the bytes already buffered by \u003ccode\u003ebufio\u003c/code\u003e, so when a push frame header straddled a buffer fill boundary it could return a \u003cstrong\u003etruncated\u003c/strong\u003e notification name (e.g. \u003ccode\u003e\u0026quot;messa\u0026quot;\u003c/code\u003e instead of \u003ccode\u003e\u0026quot;message\u0026quot;\u003c/code\u003e). The push processor then mis-routed the frame and \u003ccode\u003eReadReply\u003c/code\u003e silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 push peeking\u003c/strong\u003e: \u003ccode\u003ePeekPushNotificationName\u003c/code\u003e no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3839\"\u003e#3839\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3842\"\u003e#3842\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector params\u003c/strong\u003e: Vector data is now always sent via \u003ccode\u003ePARAMS\u003c/code\u003e with auto-generated param names (\u003ccode\u003e__vector_param_N\u003c/code\u003e, with collision avoidance) when \u003ccode\u003eVectorParamName\u003c/code\u003e is omitted, since Redis no longer accepts inline vector blobs; the \u003ccode\u003eFTHybridOptions.Params\u003c/code\u003e map is no longer mutated, so the same options struct can be reused across calls (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3844\"\u003e#3844\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e forward compatibility\u003c/strong\u003e: Unknown shard- and node-level attributes in the \u003ccode\u003eCLUSTER SHARDS\u003c/code\u003e reply are now skipped via \u003ccode\u003eDiscardNext()\u003c/code\u003e instead of erroring, so clients keep working when the server introduces new fields (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3843\"\u003e#3843\u003c/a\u003e) by \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePubSub double reconnect\u003c/strong\u003e: \u003ccode\u003ePubSub.releaseConn\u003c/code\u003e no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3833\"\u003e#3833\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e👥 Contributors\u003c/h2\u003e\n\u003cp\u003eWe'd like to thank all the contributors who worked on this release!\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/madolson\"\u003e\u003ccode\u003e@​madolson\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003chr /\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\"\u003ehttps://github.com/redis/go-redis/compare/v9.20.0...v9.20.1\u003c/a\u003e\u003c/p\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a13416bf1c0556075b843dd0a9cb6db3b3cf2789\"\u003e\u003ccode\u003ea13416b\u003c/code\u003e\u003c/a\u003e chore(release): 9.20.1 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3847\"\u003e#3847\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/10dc44f424d58b9c2b4df29e529ca92a2f8fa986\"\u003e\u003ccode\u003e10dc44f\u003c/code\u003e\u003c/a\u003e fix(push): fix peeking when push name is truncated (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3842\"\u003e#3842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/e1a2d68b27e70ca8f3ff5eec61d0dd2b74554670\"\u003e\u003ccode\u003ee1a2d68\u003c/code\u003e\u003c/a\u003e fix(ft.hybrid): Always generate vector param names if they are not provided b...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/a4b234f4a4f2551d1179181bbc136db132bf5912\"\u003e\u003ccode\u003ea4b234f\u003c/code\u003e\u003c/a\u003e chore(deps): bump codecov/codecov-action from 6 to 7 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3845\"\u003e#3845\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/974e717dbf3008497e54aec34636e34452e6872b\"\u003e\u003ccode\u003e974e717\u003c/code\u003e\u003c/a\u003e fix(command): ignore unknown fields in CLUSTER SHARDS response (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3843\"\u003e#3843\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/65d6abde0d812234d26763930b5e84ff05963c96\"\u003e\u003ccode\u003e65d6abd\u003c/code\u003e\u003c/a\u003e fix(pubsub): prevent double reconnect in releaseConn (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3833\"\u003e#3833\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/CaptDany/oscar/pull/74","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/CaptDany%2Foscar/issues/74","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/74/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-10T15:52:05.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4632793993","node_id":"PR_kwDOSefv2c7k7cf_","number":51,"state":"closed","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-10T19:21:48.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-10T15:52:05.000Z","updated_at":"2026-06-10T19:21:58.000Z","time_to_close":12583,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/Nodus-protocol/Nodus-Protocol-Backend/pull/51","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/Nodus-protocol%2FNodus-Protocol-Backend/issues/51","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/51/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-08T00:14:06.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4609181390","node_id":"PR_kwDOSqZPbs7jtmcH","number":6,"state":"open","title":"deps(deps): Bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-08T00:14:06.000Z","updated_at":"2026-06-08T00:14:06.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps): Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/changryeul/wtg/pull/6","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/changryeul%2Fwtg/issues/6","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/6/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-04T01:01:24.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4584852814","node_id":"PR_kwDOIebONs7ielEq","number":155,"state":"open","title":"chore(deps): bump the security-updates group with 22 updates","user":"dependabot[bot]","labels":["size/L","dependencies","go"],"assignees":[],"locked":false,"comments_count":4,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-04T01:01:24.000Z","updated_at":"2026-06-04T01:07:03.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"security-updates","update_count":22,"packages":[{"name":"github.com/BurntSushi/toml","old_version":"1.5.0","new_version":"1.6.0","repository_url":"https://github.com/BurntSushi/toml"},{"name":"github.com/gin-gonic/gin","old_version":"1.11.0","new_version":"1.12.0","repository_url":"https://github.com/gin-gonic/gin"},{"name":"github.com/go-sql-driver/mysql","old_version":"1.9.2","new_version":"1.10.0","repository_url":"https://github.com/go-sql-driver/mysql"},{"name":"github.com/prometheus/client_golang","old_version":"1.22.0","new_version":"1.23.2","repository_url":"https://github.com/prometheus/client_golang"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.etcd.io/etcd/api/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.etcd.io/etcd/client/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.etcd.io/etcd/server/v3","old_version":"3.5.21","new_version":"3.6.12","repository_url":"https://github.com/etcd-io/etcd"},{"name":"go.opentelemetry.io/contrib/propagators/autoprop","old_version":"0.63.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/contrib/samplers/jaegerremote","old_version":"0.37.0","new_version":"0.37.1","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/bridge/opentracing","old_version":"1.36.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/jaeger","old_version":"1.16.0","new_version":"1.17.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace","old_version":"1.38.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.38.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp","old_version":"1.36.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.0","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/sys","old_version":"0.42.0","new_version":"0.45.0","repository_url":"https://github.com/golang/sys"},{"name":"gorm.io/gorm","old_version":"1.30.0","new_version":"1.31.1","repository_url":"https://github.com/go-gorm/gorm"},{"name":"k8s.io/client-go","old_version":"0.34.1","new_version":"0.36.1","repository_url":"https://github.com/kubernetes/client-go"}],"path":null,"ecosystem":"go"},"body":"Bumps the security-updates group with 22 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) | `1.5.0` | `1.6.0` |\n| [github.com/gin-gonic/gin](https://github.com/gin-gonic/gin) | `1.11.0` | `1.12.0` |\n| [github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql) | `1.9.2` | `1.10.0` |\n| [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) | `1.22.0` | `1.23.2` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.etcd.io/etcd/api/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.etcd.io/etcd/client/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.etcd.io/etcd/server/v3](https://github.com/etcd-io/etcd) | `3.5.21` | `3.6.12` |\n| [go.opentelemetry.io/contrib/propagators/autoprop](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.63.0` | `0.69.0` |\n| [go.opentelemetry.io/contrib/samplers/jaegerremote](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.37.0` | `0.37.1` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/bridge/opentracing](https://github.com/open-telemetry/opentelemetry-go) | `1.36.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/jaeger](https://github.com/open-telemetry/opentelemetry-go) | `1.16.0` | `1.17.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace](https://github.com/open-telemetry/opentelemetry-go) | `1.38.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.38.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) | `1.36.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.0` | `1.28.0` |\n| [golang.org/x/sys](https://github.com/golang/sys) | `0.42.0` | `0.45.0` |\n| [gorm.io/gorm](https://github.com/go-gorm/gorm) | `1.30.0` | `1.31.1` |\n| [k8s.io/client-go](https://github.com/kubernetes/client-go) | `0.34.1` | `0.36.1` |\n\nUpdates `github.com/BurntSushi/toml` from 1.5.0 to 1.6.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/BurntSushi/toml/releases\"\u003egithub.com/BurntSushi/toml's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.6.0\u003c/h2\u003e\n\u003cp\u003eTOML 1.1 is now enabled by default. The TOML changelog has an overview of changes: \u003ca href=\"https://github.com/toml-lang/toml/blob/main/CHANGELOG.md\"\u003ehttps://github.com/toml-lang/toml/blob/main/CHANGELOG.md\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eAlso two small fixes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEncode large floats as exponent syntax so that round-tripping things like \u003ccode\u003e5e+22\u003c/code\u003e is correct.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUsing duplicate array keys would not give an error:\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003earr = [1]\r\narr = [2]\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eThis will now correctly give a \u0026quot;Key 'arr' has already been defined\u0026quot; error.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/52534926c55b4cd85b05aee90569dd0668b8cf30\"\u003e\u003ccode\u003e5253492\u003c/code\u003e\u003c/a\u003e Enable TOML 1.1 by default (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/457\"\u003e#457\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/e954445330492727c18483838a15f88a4fc2d03a\"\u003e\u003ccode\u003ee954445\u003c/code\u003e\u003c/a\u003e Reject duplicate arrays (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/455\"\u003e#455\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/6b16cbdb0f5a152aad1a6b89798a89655b84150d\"\u003e\u003ccode\u003e6b16cbd\u003c/code\u003e\u003c/a\u003e Update toml-test test cases from upstream (\u003ca href=\"https://redirect.github.com/BurntSushi/toml/issues/456\"\u003e#456\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/011fa2bc64cec3bb4ec450d11984f5e87b8e158c\"\u003e\u003ccode\u003e011fa2b\u003c/code\u003e\u003c/a\u003e Ensure constant format strings in wf calls\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/4b439bf5c6ef125a94df7a136733df5ba37d4c16\"\u003e\u003ccode\u003e4b439bf\u003c/code\u003e\u003c/a\u003e Remove itemNil\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/a473c125bce7078efea98a29698b7c1eb453ff0b\"\u003e\u003ccode\u003ea473c12\u003c/code\u003e\u003c/a\u003e Add test for out of range float64\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/b535ff89e48996de98ace1301decf94a3a480aa8\"\u003e\u003ccode\u003eb535ff8\u003c/code\u003e\u003c/a\u003e Add some boring tests for lex.go\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/6011ef0c32b214ac134b8228af2a667e171dad6e\"\u003e\u003ccode\u003e6011ef0\u003c/code\u003e\u003c/a\u003e Remove unreachable condition in lexTableNameStart\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/c8ca9e6c2d5987a6c23f89d13987ac335aad90c3\"\u003e\u003ccode\u003ec8ca9e6\u003c/code\u003e\u003c/a\u003e Remove unreachable condition\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/BurntSushi/toml/commit/1121f81c60f5947e13057fa5efecbf21369c651e\"\u003e\u003ccode\u003e1121f81\u003c/code\u003e\u003c/a\u003e Make tomlv read from stdin\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/BurntSushi/toml/compare/v1.5.0...v1.6.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/gin-gonic/gin` from 1.11.0 to 1.12.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gin-gonic/gin/releases\"\u003egithub.com/gin-gonic/gin's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.12.0\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e192ac89eefc1c30f7c97ae48a9ffb1c6f1c8c8bc: feat(binding): add support for encoding.UnmarshalText in uri/query binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4203\"\u003e#4203\u003c/a\u003e) (\u003ca href=\"https://github.com/takanuva15\"\u003e\u003ccode\u003e@​takanuva15\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e53410d2e07054369e0960fbe2eed97e1b9966f12: feat(context): add GetError and GetErrorSlice methods for error retrieval (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4502\"\u003e#4502\u003c/a\u003e) (\u003ca href=\"https://github.com/raju-mechatronics\"\u003e\u003ccode\u003e@​raju-mechatronics\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eacc55e049e33b401e810dbd8c0d6dcb6b3ba2b05: feat(context): add Protocol Buffers support to content negotiation (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4423\"\u003e#4423\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e38e765119241d990705169bedb5002a29ae0cbd1: feat(context): implemented Delete method (\u003ca href=\"https://github.com/Spyder01\"\u003e\u003ccode\u003e@​Spyder01\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e771dcc6476d7bc6abb9ec0235ecefa4d38fe6fb0: feat(gin): add option to use escaped path (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4420\"\u003e#4420\u003c/a\u003e) (\u003ca href=\"https://github.com/ldesauw\"\u003e\u003ccode\u003e@​ldesauw\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e4dec17afdff48e8018c83618fbbe69fceeb2b41d: feat(logger): color latency (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4146\"\u003e#4146\u003c/a\u003e) (\u003ca href=\"https://github.com/wsyqn6\"\u003e\u003ccode\u003e@​wsyqn6\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ed7776de7d444935ea4385999711bd6331a98fecb: feat(render): add bson protocol (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4145\"\u003e#4145\u003c/a\u003e) (\u003ca href=\"https://github.com/laurentcau\"\u003e\u003ccode\u003e@​laurentcau\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eb917b14ff9d189f16a7492be79d123a47806ee19: fix(binding): empty value error (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/2169\"\u003e#2169\u003c/a\u003e) (\u003ca href=\"https://github.com/guonaihong\"\u003e\u003ccode\u003e@​guonaihong\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec3d1092b3b48addf6f9cd00fe274ec3bd14650eb: fix(binding): improve empty slice/array handling in form binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4380\"\u003e#4380\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e9914178584e42458ff7d23891463a880f58c9d86: fix(context): ClientIP handling for multiple X-Forwarded-For header values (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4472\"\u003e#4472\u003c/a\u003e) (\u003ca href=\"https://github.com/Nurysso\"\u003e\u003ccode\u003e@​Nurysso\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e2a794cd0b0faa7d829291375b27a3467ea972b0d: fix(debug): version mismatch (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4403\"\u003e#4403\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec3d5a28ed6d3849da820195b6774d212bcc038a9: fix(gin): close os.File in RunFd to prevent resource leak (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4422\"\u003e#4422\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5fad976b372e381312f8de69f0969f1284d229d3: fix(gin): literal colon routes not working with engine.Handler() (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4415\"\u003e#4415\u003c/a\u003e) (\u003ca href=\"https://github.com/pawannn\"\u003e\u003ccode\u003e@​pawannn\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e63dd3e60cab89c27fb66bce1423bd268d52abad1: fix(recover): suppress http.ErrAbortHandler in recover (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4336\"\u003e#4336\u003c/a\u003e) (\u003ca href=\"https://github.com/MondayCha\"\u003e\u003ccode\u003e@​MondayCha\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5c00df8afadd06cc5be530dde00fe6d9fa4a2e4a: fix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4206\"\u003e#4206\u003c/a\u003e) (\u003ca href=\"https://github.com/dengaleev\"\u003e\u003ccode\u003e@​dengaleev\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e234a6d4c00cb77af9852aca0b8289745d5529b4b: fix(response): refine hijack behavior for response lifecycle (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4373\"\u003e#4373\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e472d086af2acd924cb4b9d7be0525f7d790f69bc: fix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4535\"\u003e#4535\u003c/a\u003e) (\u003ca href=\"https://github.com/veeceey\"\u003e\u003ccode\u003e@​veeceey\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e8e07d37c63e5536eb25f4af4c91eabeee4011fba: fix: Correct typos, improve documentation clarity, and remove dead code (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4511\"\u003e#4511\u003c/a\u003e) (\u003ca href=\"https://github.com/mahanadh\"\u003e\u003ccode\u003e@​mahanadh\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eEnhancements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eba093d19477b896ac89a7fc3246af23d290b8e26: chore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4549\"\u003e#4549\u003c/a\u003e) (\u003ca href=\"https://github.com/BobDu\"\u003e\u003ccode\u003e@​BobDu\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eb2b489dbf4826c2c630717a77fd5e42774625410: chore(context): always trust xff headers from unix socket (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/3359\"\u003e#3359\u003c/a\u003e) (\u003ca href=\"https://github.com/WeidiDeng\"\u003e\u003ccode\u003e@​WeidiDeng\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eecb3f7b5e2f3915bf1db240ed5eee572f8dbea36: chore(deps): upgrade golang.org/x/crypto to v0.45.0 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4449\"\u003e#4449\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eaf6e8b70b8261bb0c99ad094fe552ab92991620a: chore(deps): upgrade quic-go to v0.57.1 (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003edb309081bc5c137b2aa15701ef53f7f19788da25: chore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4547\"\u003e#4547\u003c/a\u003e) (\u003ca href=\"https://github.com/USA-RedDragon\"\u003e\u003ccode\u003e@​USA-RedDragon\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e26c3a628655cad2388380cb8102d6ce7d4875f3b: chore(response): prevent Flush() panic when \u003ccode\u003ehttp.Flusher\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4479\"\u003e#4479\u003c/a\u003e) (\u003ca href=\"https://github.com/Twacqwq\"\u003e\u003ccode\u003e@​Twacqwq\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5dd833f1f26de0eb30eae47b17e05ced2482dc41: chore: bump minimum Go version to 1.24 and update workflows (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4388\"\u003e#4388\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRefactor\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e39858a0859c914bd26948fa950477e11bd8d3823: refactor(binding): use maps.Copy for cleaner map handling (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4352\"\u003e#4352\u003c/a\u003e) (\u003ca href=\"https://github.com/russcoss\"\u003e\u003ccode\u003e@​russcoss\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ec0048f645ee945c4db30593afdea10123e2c30a6: refactor(context): omit the return value names (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4395\"\u003e#4395\u003c/a\u003e) (\u003ca href=\"https://github.com/wanghaolong613\"\u003e\u003ccode\u003e@​wanghaolong613\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e915e4c90d28ec4cffc6eb146e208ab5a65eac772: refactor(context): replace hardcoded localhost IPs with constants (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4481\"\u003e#4481\u003c/a\u003e) (\u003ca href=\"https://github.com/pauloappbr\"\u003e\u003ccode\u003e@​pauloappbr\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e414de60574449457f3192a7a1d5528940db2836d: refactor(context): using maps.Clone (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4333\"\u003e#4333\u003c/a\u003e) (\u003ca href=\"https://github.com/cuiweixie\"\u003e\u003ccode\u003e@​cuiweixie\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e59e9d4a794f12c4f9a6c7bed441b9644e5f6d99b: refactor(ginS): use sync.OnceValue to simplify engine function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4314\"\u003e#4314\u003c/a\u003e) (\u003ca href=\"https://github.com/1911860538\"\u003e\u003ccode\u003e@​1911860538\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e3ab698dc5110af1977d57226e4995c57dd34c233: refactor(recovery): smart error comparison (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4142\"\u003e#4142\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ed1a15347b1e45a8ee816193d3578a93bfd73b70f: refactor(utils): move util functions to utils.go (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4467\"\u003e#4467\u003c/a\u003e) (\u003ca href=\"https://github.com/zeek0x\"\u003e\u003ccode\u003e@​zeek0x\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ee3118cc378d263454098924ebbde7e8d1dd2e904: refactor: for loop can be modernized using range over int (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4392\"\u003e#4392\u003c/a\u003e) (\u003ca href=\"https://github.com/wanghaolong613\"\u003e\u003ccode\u003e@​wanghaolong613\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e488f8c3ffa579a8d19beb2bae95ff8ef36b3d53f: refactor: replace magic numbers with named constants in bodyAllowedForStatus (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4529\"\u003e#4529\u003c/a\u003e) (\u003ca href=\"https://github.com/veeceey\"\u003e\u003ccode\u003e@​veeceey\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e9968c4bf9d5a99edc3eee2c068a4c9160ece8915: refactor: use b.Loop() to simplify the code and improve performance (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4389\"\u003e#4389\u003c/a\u003e) (\u003ca href=\"https://github.com/reddaisyy\"\u003e\u003ccode\u003e@​reddaisyy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ea85ef5ce4d0cda8834c59c855068ed48b51192d1: refactor: use b.Loop() to simplify the code and improve performance (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4432\"\u003e#4432\u003c/a\u003e) (\u003ca href=\"https://github.com/efcking\"\u003e\u003ccode\u003e@​efcking\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBuild process updates\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e61b67de522a189b568aced4c5c16917c558e3387: ci(bot): increase frequency and group updates for dependencies (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4367\"\u003e#4367\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efb27ef26c2fdfe25344b4c039d8a53551f9e912c: ci(lint): refactor test assertions and linter configuration (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4436\"\u003e#4436\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e93ff771e6dbf10e432864b30f3719ac5c84a4d4a: ci(sec): improve type safety and server organization in HTTP middleware (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4437\"\u003e#4437\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ee88fc8927a52b74f55bec0351604a56ac0aa1c51: ci(sec): schedule Trivy security scans to run daily at midnight UTC (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4439\"\u003e#4439\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e5e5ff3ace496a31b138b0820136a146bfb5de0ef: ci: replace vulnerability scanning workflow with Trivy integration (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4421\"\u003e#4421\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e00900fb3e1ea9dde33985a0e4f6afec793d5e786: ci: update CI workflows and standardize Trivy config quotes (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4531\"\u003e#4531\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eae3f524974fc4f55d18c9e7fae4614503c015226: ci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4550\"\u003e#4550\u003c/a\u003e) (\u003ca href=\"https://github.com/appleboy\"\u003e\u003ccode\u003e@​appleboy\u003c/code\u003e\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/gin-gonic/gin/blob/master/CHANGELOG.md\"\u003egithub.com/gin-gonic/gin's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003eGin v1.12.0\u003c/h2\u003e\n\u003ch3\u003eFeatures\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efeat(render): add bson protocol (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4145\"\u003e#4145\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): add GetError and GetErrorSlice methods for error retrieval (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4502\"\u003e#4502\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(binding): add support for encoding.UnmarshalText in uri/query binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4203\"\u003e#4203\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(gin): add option to use escaped path (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4420\"\u003e#4420\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): add Protocol Buffers support to content negotiation (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4423\"\u003e#4423\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(context): implemented Delete method (\u003ca href=\"https://github.com/gin-gonic/gin/commit/38e7651\"\u003e#38e7651\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efeat(logger): color latency (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4146\"\u003e#4146\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eEnhancements\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eperf(tree): reduce allocations in findCaseInsensitivePath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4417\"\u003e#4417\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(recovery): optimize line reading in stack function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4466\"\u003e#4466\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(path): replace regex with custom functions in redirectTrailingSlash (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4414\"\u003e#4414\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eperf(tree): optimize path parsing using strings.Count (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4246\"\u003e#4246\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4547\"\u003e#4547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(context): always trust xff headers from unix socket (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/3359\"\u003e#3359\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(response): prevent Flush() panic when the underlying ResponseWriter does not implement \u003ccode\u003ehttp.Flusher\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4479\"\u003e#4479\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(recovery): smart error comparison (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4142\"\u003e#4142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(context): replace hardcoded localhost IPs with constants (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4481\"\u003e#4481\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(utils): move util functions to utils.go (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4467\"\u003e#4467\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(binding): use maps.Copy for cleaner map handling (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4352\"\u003e#4352\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(context): using maps.Clone (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4333\"\u003e#4333\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor(ginS): use sync.OnceValue to simplify engine function (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4314\"\u003e#4314\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor: replace magic numbers with named constants in bodyAllowedForStatus (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4529\"\u003e#4529\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003erefactor: for loop can be modernized using range over int (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4392\"\u003e#4392\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBug Fixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003efix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4535\"\u003e#4535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4206\"\u003e#4206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(context): ClientIP handling for multiple X-Forwarded-For header values (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4472\"\u003e#4472\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(binding): empty value error (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/2169\"\u003e#2169\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(recover): suppress http.ErrAbortHandler in recover (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4336\"\u003e#4336\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(gin): literal colon routes not working with engine.Handler() (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4415\"\u003e#4415\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(gin): close os.File in RunFd to prevent resource leak (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4422\"\u003e#4422\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(response): refine hijack behavior for response lifecycle (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4373\"\u003e#4373\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(binding): improve empty slice/array handling in form binding (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4380\"\u003e#4380\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix(debug): version mismatch (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4403\"\u003e#4403\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003efix: correct typos, improve documentation clarity, and remove dead code (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4511\"\u003e#4511\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBuild process updates / CI\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4550\"\u003e#4550\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003echore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/pull/4549\"\u003e#4549\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/73726dc606796a025971fe451f0aa6f1b9b847f6\"\u003e\u003ccode\u003e73726dc\u003c/code\u003e\u003c/a\u003e docs: update documentation to reflect Go version changes (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4552\"\u003e#4552\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/e292e5caa777bce70b66fe08c94cbe9cef3e2ec9\"\u003e\u003ccode\u003ee292e5c\u003c/code\u003e\u003c/a\u003e docs: document and finalize Gin v1.12.0 release (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4551\"\u003e#4551\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/ae3f524974fc4f55d18c9e7fae4614503c015226\"\u003e\u003ccode\u003eae3f524\u003c/code\u003e\u003c/a\u003e ci: update Go version support to 1.25+ across CI and docs (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4550\"\u003e#4550\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/38534e2bf98a06e1f62d6b24384e90b5f78699bf\"\u003e\u003ccode\u003e38534e2\u003c/code\u003e\u003c/a\u003e chore(deps): bump golang.org/x/net from 0.50.0 to 0.51.0 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4548\"\u003e#4548\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/472d086af2acd924cb4b9d7be0525f7d790f69bc\"\u003e\u003ccode\u003e472d086\u003c/code\u003e\u003c/a\u003e fix(tree): panic in findCaseInsensitivePathRec with RedirectFixedPath (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4535\"\u003e#4535\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/fb2583442c4d9bccb75e6d26f1aa6e7c01950db6\"\u003e\u003ccode\u003efb25834\u003c/code\u003e\u003c/a\u003e test(context): use http.StatusContinue constant instead of magic number 100 (...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/6f1d5fe3cdb171a08928c3c9dd3fbcfc9ee1b521\"\u003e\u003ccode\u003e6f1d5fe\u003c/code\u003e\u003c/a\u003e test(render): add comprehensive error handling tests (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4541\"\u003e#4541\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/5c00df8afadd06cc5be530dde00fe6d9fa4a2e4a\"\u003e\u003ccode\u003e5c00df8\u003c/code\u003e\u003c/a\u003e fix(render): write content length in Data.Render (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4206\"\u003e#4206\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/db309081bc5c137b2aa15701ef53f7f19788da25\"\u003e\u003ccode\u003edb30908\u003c/code\u003e\u003c/a\u003e chore(logger): allow skipping query string output (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4547\"\u003e#4547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/gin-gonic/gin/commit/ba093d19477b896ac89a7fc3246af23d290b8e26\"\u003e\u003ccode\u003eba093d1\u003c/code\u003e\u003c/a\u003e chore(binding): upgrade bson dependency to mongo-driver v2 (\u003ca href=\"https://redirect.github.com/gin-gonic/gin/issues/4549\"\u003e#4549\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/gin-gonic/gin/compare/v1.11.0...v1.12.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/go-sql-driver/mysql` from 1.9.2 to 1.10.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/go-sql-driver/mysql/releases\"\u003egithub.com/go-sql-driver/mysql's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.10.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eadd Go 1.24 to the test matrix by \u003ca href=\"https://github.com/shogo82148\"\u003e\u003ccode\u003e@​shogo82148\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1681\"\u003ego-sql-driver/mysql#1681\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003emodernize for Go 1.22 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1695\"\u003ego-sql-driver/mysql#1695\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003etest stability improvement. by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1698\"\u003ego-sql-driver/mysql#1698\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esimplify collation tests by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1700\"\u003ego-sql-driver/mysql#1700\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix bigint unsigned null column scan to err type int64 by \u003ca href=\"https://github.com/elonnzhang\"\u003e\u003ccode\u003e@​elonnzhang\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1612\"\u003ego-sql-driver/mysql#1612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eTransaction Commit/Rollback returns conn's cached error, if present by \u003ca href=\"https://github.com/brad-defined\"\u003e\u003ccode\u003e@​brad-defined\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1691\"\u003ego-sql-driver/mysql#1691\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadd BenchmarkReceive10kRowsCompress by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1704\"\u003ego-sql-driver/mysql#1704\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eoptimize readPacket by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1705\"\u003ego-sql-driver/mysql#1705\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMariaDB Metadata skipping and DEPRECATE_EOF by \u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1708\"\u003ego-sql-driver/mysql#1708\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOptimization: statements reuse previous column name by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1711\"\u003ego-sql-driver/mysql#1711\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eupdate outdated MySQL internals documentation links by \u003ca href=\"https://github.com/demouth\"\u003e\u003ccode\u003e@​demouth\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1714\"\u003ego-sql-driver/mysql#1714\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix PING on compressed connections by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1721\"\u003ego-sql-driver/mysql#1721\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eadd DeepWiki badge by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1722\"\u003ego-sql-driver/mysql#1722\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate edwards25519 dependency to v1.1.1 by \u003ca href=\"https://github.com/williamhaw\"\u003e\u003ccode\u003e@​williamhaw\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1749\"\u003ego-sql-driver/mysql#1749\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eConfigure Dependabot for Go modules by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1755\"\u003ego-sql-driver/mysql#1755\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump dominikh/staticcheck-action from 1.3.1 to 1.4.1 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1759\"\u003ego-sql-driver/mysql#1759\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 3 to 4 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1760\"\u003ego-sql-driver/mysql#1760\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/setup-go from 5 to 6 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1757\"\u003ego-sql-driver/mysql#1757\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix staticcheck error by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1761\"\u003ego-sql-driver/mysql#1761\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/checkout from 4 to 6 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1758\"\u003ego-sql-driver/mysql#1758\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix getSystemVar buffer reuse by \u003ca href=\"https://github.com/morgo\"\u003e\u003ccode\u003e@​morgo\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1754\"\u003ego-sql-driver/mysql#1754\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eConsolidate Dependabot update noise by grouping weekly dependency PRs by \u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1762\"\u003ego-sql-driver/mysql#1762\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump filippo.io/edwards25519 from 1.1.1 to 1.2.0 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1756\"\u003ego-sql-driver/mysql#1756\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCI: Update GitHub Actions Go matrix to 1.24–1.26 by \u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1763\"\u003ego-sql-driver/mysql#1763\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEnhance interpolateParams to correctly handle placeholders by \u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1732\"\u003ego-sql-driver/mysql#1732\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003emodernize by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1764\"\u003ego-sql-driver/mysql#1764\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease v1.10.0 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1765\"\u003ego-sql-driver/mysql#1765\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/elonnzhang\"\u003e\u003ccode\u003e@​elonnzhang\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1612\"\u003ego-sql-driver/mysql#1612\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/brad-defined\"\u003e\u003ccode\u003e@​brad-defined\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1691\"\u003ego-sql-driver/mysql#1691\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/rusher\"\u003e\u003ccode\u003e@​rusher\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1708\"\u003ego-sql-driver/mysql#1708\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/demouth\"\u003e\u003ccode\u003e@​demouth\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1714\"\u003ego-sql-driver/mysql#1714\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/williamhaw\"\u003e\u003ccode\u003e@​williamhaw\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1749\"\u003ego-sql-driver/mysql#1749\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1759\"\u003ego-sql-driver/mysql#1759\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/morgo\"\u003e\u003ccode\u003e@​morgo\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1754\"\u003ego-sql-driver/mysql#1754\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Copilot\"\u003e\u003ccode\u003e@​Copilot\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1762\"\u003ego-sql-driver/mysql#1762\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\"\u003ehttps://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.9.3\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[1.9] test stability improvement. by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1699\"\u003ego-sql-driver/mysql#1699\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] Transaction Commit/Rollback returns conn's cached error by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1702\"\u003ego-sql-driver/mysql#1702\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ebackport benchmark_test by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1706\"\u003ego-sql-driver/mysql#1706\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] optimize readPacket (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1705\"\u003e#1705\u003c/a\u003e) by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1707\"\u003ego-sql-driver/mysql#1707\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[1.9] fix PING on compressed connections by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1723\"\u003ego-sql-driver/mysql#1723\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erelease v1.9.3 by \u003ca href=\"https://github.com/methane\"\u003e\u003ccode\u003e@​methane\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/pull/1725\"\u003ego-sql-driver/mysql#1725\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/go-sql-driver/mysql/blob/master/CHANGELOG.md\"\u003egithub.com/go-sql-driver/mysql's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.10.0 (2026-04-28)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003egetSystemVar(\u0026quot;max_allowed_packet\u0026quot;)\u003c/code\u003e potentially returned wrong value. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1754\"\u003e#1754\u003c/a\u003e)\nThis affects only when \u003ccode\u003emaxAllowedPacket=0\u003c/code\u003e is set.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBump filippo.io/edwards25519 from 1.1.1 to 1.2.0. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1756\"\u003e#1756\u003c/a\u003e)\nWhile older versions have reported CVEs, they do not affect go-mysql.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUpdate Go versions to 1.24-1.26. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1763\"\u003e#1763\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnhance interpolateParams to correctly handle placeholders. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1732\"\u003e#1732\u003c/a\u003e)\nThe question mark (?) within strings and comments will no longer be treated as a placeholder.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev1.9.3 (2025-06-13)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etx.Commit()\u003c/code\u003e and \u003ccode\u003etx.Rollback()\u003c/code\u003e returned \u003ccode\u003eErrInvalidConn\u003c/code\u003e always.\nNow they return cached real error if present. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1690\"\u003e#1690\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOptimize reading small result sets to fix a performance regression\nintroduced by compression protocol support. (\u003ccode\u003e[#1707](https://github.com/go-sql-driver/mysql/issues/1707)\u003c/code\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFix \u003ccode\u003edb.Ping()\u003c/code\u003e on compressed connection. (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1723\"\u003e#1723\u003c/a\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/a065b60ab6d0c8e15468e7709c7f76acf4431647\"\u003e\u003ccode\u003ea065b60\u003c/code\u003e\u003c/a\u003e release v1.10.0 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1765\"\u003e#1765\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/09e4187be9c52bb13449a662d2a36e1e1789ac95\"\u003e\u003ccode\u003e09e4187\u003c/code\u003e\u003c/a\u003e modernize (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1764\"\u003e#1764\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/6c44a9a0a1769e145dc91c08abe1aded2936ab63\"\u003e\u003ccode\u003e6c44a9a\u003c/code\u003e\u003c/a\u003e Enhance interpolateParams to correctly handle placeholders (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1732\"\u003e#1732\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/688ce563a28598a9b733e6fc2b325050a4dcf261\"\u003e\u003ccode\u003e688ce56\u003c/code\u003e\u003c/a\u003e Update supported Go version to 1.24–1.26 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1763\"\u003e#1763\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/118d07fdb51f9e523ebcdb00628812e49d7c1881\"\u003e\u003ccode\u003e118d07f\u003c/code\u003e\u003c/a\u003e Bump filippo.io/edwards25519 from 1.1.1 to 1.2.0 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1756\"\u003e#1756\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/d6b2d3ee2cc8569b6778a7ae7ac2816e185f616b\"\u003e\u003ccode\u003ed6b2d3e\u003c/code\u003e\u003c/a\u003e Consolidate Dependabot update noise by grouping weekly dependency PRs (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1762\"\u003e#1762\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/037dfd872a7b6c88e63c53f32700dffed560120c\"\u003e\u003ccode\u003e037dfd8\u003c/code\u003e\u003c/a\u003e Fix getSystemVar buffer reuse (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1754\"\u003e#1754\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/900f33035615559b6188e4fa98d57ae20af2b73b\"\u003e\u003ccode\u003e900f330\u003c/code\u003e\u003c/a\u003e Bump actions/checkout from 4 to 6 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1758\"\u003e#1758\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/ab9e3804c604d6a60b0d3136f4654f81f184757d\"\u003e\u003ccode\u003eab9e380\u003c/code\u003e\u003c/a\u003e fix staticcheck error (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1761\"\u003e#1761\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/go-sql-driver/mysql/commit/f298c66742396b6921732744b9bb075c7faaca81\"\u003e\u003ccode\u003ef298c66\u003c/code\u003e\u003c/a\u003e Bump actions/setup-go from 5 to 6 (\u003ca href=\"https://redirect.github.com/go-sql-driver/mysql/issues/1757\"\u003e#1757\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/go-sql-driver/mysql/compare/v1.9.2...v1.10.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/prometheus/client_golang` from 1.22.0 to 1.23.2\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/prometheus/client_golang/releases\"\u003egithub.com/prometheus/client_golang's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.23.2 - 2025-09-05\u003c/h2\u003e\n\u003cp\u003eThis release is made to upgrade to prometheus/common v0.66.1, which drops the dependencies github.com/grafana/regexp and go.uber.org/atomic and replaces gopkg.in/yaml.v2 with go.yaml.in/yaml/v2 (a drop-in replacement). There are no functional changes.\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cul\u003e\n\u003cli\u003e[release-1.23] Upgrade to prometheus/common@v0.66.1 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1869\"\u003eprometheus/client_golang#1869\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[release-1.23] Cut v1.23.2 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1870\"\u003eprometheus/client_golang#1870\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.23.1...v1.23.2\"\u003ehttps://github.com/prometheus/client_golang/compare/v1.23.1...v1.23.2\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.23.1 - 2025-09-04\u003c/h2\u003e\n\u003cp\u003eThis release is made to be compatible with a backwards incompatible API change in prometheus/common v0.66.0. There are no functional changes.\u003c/p\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cul\u003e\n\u003cli\u003e[release-1.23] Upgrade to prometheus/common v0.66 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1866\"\u003eprometheus/client_golang#1866\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[release-1.23] Cut v1.23.1 by \u003ca href=\"https://github.com/aknuds1\"\u003e\u003ccode\u003e@​aknuds1\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/prometheus/client_golang/pull/1867\"\u003eprometheus/client_golang#1867\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.1\"\u003ehttps://github.com/prometheus/client_golang/compare/v1.23.0...v1.23.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.23.0 - 2025-07-30\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1812\"\u003e#1812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1766\"\u003e#1766\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add exemplars for native histograms \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1686\"\u003e#1686\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] exp/api: Bubble up status code from writeResponse \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1823\"\u003e#1823\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1833\"\u003e#1833\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[BUGFIX] exp/api: client prompt return on context cancellation \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1729\"\u003e#1729\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md\"\u003egithub.com/prometheus/client_golang's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e1.23.2 / 2025-09-05\u003c/h2\u003e\n\u003cp\u003eThis release is made to upgrade to prometheus/common v0.66.1, which drops the dependencies github.com/grafana/regexp and go.uber.org/atomic and replaces gopkg.in/yaml.v2 with go.yaml.in/yaml/v2 (a drop-in replacement).\nThere are no functional changes.\u003c/p\u003e\n\u003ch2\u003e1.23.1 / 2025-09-04\u003c/h2\u003e\n\u003cp\u003eThis release is made to be compatible with a backwards incompatible API change\nin prometheus/common v0.66.0. There are no functional changes.\u003c/p\u003e\n\u003ch2\u003e1.23.0 / 2025-07-30\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e[CHANGE] Minimum required Go version is now 1.23, only the two latest Go versions are supported from now on. \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1812\"\u003e#1812\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add WrapCollectorWith and WrapCollectorWithPrefix \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1766\"\u003e#1766\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[FEATURE] Add exemplars for native histograms \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1686\"\u003e#1686\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] exp/api: Bubble up status code from writeResponse \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1823\"\u003e#1823\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[ENHANCEMENT] collector/go: Update runtime metrics for Go v1.23 and v1.24 \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1833\"\u003e#1833\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e[BUGFIX] exp/api: client prompt return on context cancellation \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1729\"\u003e#1729\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/8179a560819f2c64ef6ade70e6ae4c73aecaca3c\"\u003e\u003ccode\u003e8179a56\u003c/code\u003e\u003c/a\u003e Cut v1.23.2 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1870\"\u003e#1870\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/4142b5908bb6c8f5e412b72de5ea4b927d8c219d\"\u003e\u003ccode\u003e4142b59\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1869\"\u003e#1869\u003c/a\u003e from prometheus/arve/upgrade-common\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/4ff40f0d918efc0f59701d13622913805c2425b4\"\u003e\u003ccode\u003e4ff40f0\u003c/code\u003e\u003c/a\u003e Cut v1.23.1 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1867\"\u003e#1867\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/989b0298944e64f88a54ac9c70cd8c8121f10bc9\"\u003e\u003ccode\u003e989b029\u003c/code\u003e\u003c/a\u003e Upgrade to prometheus/common v0.66 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1866\"\u003e#1866\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/e4b2208dd8cb6d1425f00250db842ec3c1e8749e\"\u003e\u003ccode\u003ee4b2208\u003c/code\u003e\u003c/a\u003e Cut v1.23.0 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1848\"\u003e#1848\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/d9492afd3a6f2e9782a7fc10363281bfd5b743bb\"\u003e\u003ccode\u003ed9492af\u003c/code\u003e\u003c/a\u003e cut v1.23.0-rc.1 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1842\"\u003e#1842\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/aeae8a0b4f54a8fa720d19b88638a2d048596f82\"\u003e\u003ccode\u003eaeae8a0\u003c/code\u003e\u003c/a\u003e Cut v1.23.0-rc.0 (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1837\"\u003e#1837\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/b157309b723f0b8588ea604bb78dbbba196803f2\"\u003e\u003ccode\u003eb157309\u003c/code\u003e\u003c/a\u003e Update common Prometheus files (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1832\"\u003e#1832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/a704e287f467b79744c30af996b7d710d4c6900d\"\u003e\u003ccode\u003ea704e28\u003c/code\u003e\u003c/a\u003e build(deps): bump the github-actions group with 3 updates (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1826\"\u003e#1826\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/prometheus/client_golang/commit/c7743110ad2c599de3d8c23682d978a12f9f36d1\"\u003e\u003ccode\u003ec774311\u003c/code\u003e\u003c/a\u003e Fix errNotImplemented reference (\u003ca href=\"https://redirect.github.com/prometheus/client_golang/issues/1835\"\u003e#1835\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/prometheus/client_golang/compare/v1.22.0...v1.23.2\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary...\n\n_Description has been truncated_\n\n\u003c!-- This is an auto-generated comment: release notes by coderabbit.ai --\u003e\n\n## Summary by CodeRabbit\n\n* **Chores**\n  * Updated Go version to 1.26.0\n  * Refreshed core project dependencies including web framework, database drivers, monitoring and observability packages, caching, and distributed systems tools\n  * Updated transitive dependencies across the dependency tree, including migration to newer authentication library version\n  * Bumped utility packages for performance and compatibility improvements\n\n\u003c!-- end of auto-generated comment: release notes by coderabbit.ai --\u003e","html_url":"https://github.com/kubeservice-stack/common/pull/155","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/kubeservice-stack%2Fcommon/issues/155","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/155/packages"}},{"old_version":"9.18.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-03T23:13:09.000Z","version_change":"9.18.0 → 9.20.0","issue":{"uuid":"4584346186","node_id":"PR_kwDOSCoGAc7ic584","number":6,"state":"open","title":"chore(deps): Bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T23:13:09.000Z","updated_at":"2026-06-03T23:13:09.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/venaissance/shorturl/pull/6","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/venaissance%2Fshorturl/issues/6","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/6/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":"/services/gateway","pr_created_at":"2026-06-03T22:30:49.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4584142569","node_id":"PR_kwDOP1itWs7icOa4","number":1132,"state":"open","title":"build(deps): Bump the go-gateway group in /services/gateway with 7 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T22:30:49.000Z","updated_at":"2026-06-03T22:31:06.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): Bump","group_name":"go-gateway","update_count":7,"packages":[{"name":"github.com/redis/go-redis/extra/redisprometheus/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin","old_version":"0.68.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"}],"path":"/services/gateway","ecosystem":"go"},"body":"Bumps the go-gateway group in /services/gateway with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/redis/go-redis/extra/redisprometheus/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.68.0` | `0.69.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n\nUpdates `github.com/redis/go-redis/extra/redisprometheus/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/extra/redisprometheus/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/extra/redisprometheus/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin` from 0.68.0 to 0.69.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/releases\"\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eotelconf: validate encoding configuration for OTLP HTTP exporters by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8772\"\u003eopen-telemetry/opentelemetry-go-contrib#8772\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.99.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8780\"\u003eopen-telemetry/opentelemetry-go-contrib#8780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update prom/prometheus docker tag to v3.11.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8779\"\u003eopen-telemetry/opentelemetry-go-contrib#8779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotellogrus: Set error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8778\"\u003eopen-telemetry/opentelemetry-go-contrib#8778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/sys to v0.43.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8783\"\u003eopen-telemetry/opentelemetry-go-contrib#8783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x/telemetry digest to 93c7c8a by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8786\"\u003eopen-telemetry/opentelemetry-go-contrib#8786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-isatty to v0.0.21 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8787\"\u003eopen-telemetry/opentelemetry-go-contrib#8787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-runewidth to v0.0.23 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8788\"\u003eopen-telemetry/opentelemetry-go-contrib#8788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8791\"\u003eopen-telemetry/opentelemetry-go-contrib#8791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/github-script action to v9 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8795\"\u003eopen-telemetry/opentelemetry-go-contrib#8795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8794\"\u003eopen-telemetry/opentelemetry-go-contrib#8794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotelzap: set error field as record.SetErr  by \u003ca href=\"https://github.com/iblancasa\"\u003e\u003ccode\u003e@​iblancasa\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8719\"\u003eopen-telemetry/opentelemetry-go-contrib#8719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x to 746e56f by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8796\"\u003eopen-telemetry/opentelemetry-go-contrib#8796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/arch to v0.26.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8798\"\u003eopen-telemetry/opentelemetry-go-contrib#8798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck if otelgrpc metrics are enabled by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8792\"\u003eopen-telemetry/opentelemetry-go-contrib#8792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/upload-artifact action to v7.0.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8800\"\u003eopen-telemetry/opentelemetry-go-contrib#8800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck instrument enabled in deprecatedruntime by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8793\"\u003eopen-telemetry/opentelemetry-go-contrib#8793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/forbidigo/v2 to v2.3.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8804\"\u003eopen-telemetry/opentelemetry-go-contrib#8804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/makezero/v2 to v2.2.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8802\"\u003eopen-telemetry/opentelemetry-go-contrib#8802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/manuelarte/funcorder to v0.6.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8803\"\u003eopen-telemetry/opentelemetry-go-contrib#8803\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/2.5.1/0.69.0/0.37.1/0.24.0/0.19.0/0.16.1/0.16.0] - 2026-05-28\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/03b2bcdb54b3dde73c9ff91ae216aec262f6c8f5\"\u003e\u003ccode\u003e03b2bcd\u003c/code\u003e\u003c/a\u003e Release v1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9033\"\u003e#9033\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/80c46d4037d5991ce324216a52cf7e8d7f2d81fa\"\u003e\u003ccode\u003e80c46d4\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/alecthomas/chroma/v2 to v2.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9034\"\u003e#9034\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/51f292197d33b84a21b3c70ae21cb185a2570d5e\"\u003e\u003ccode\u003e51f2921\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/hetznercloud/hcloud-go/v2 to v2.41.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9026\"\u003e#9026\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/db82162f1b642bb6dca7fa5be48045315bb466d6\"\u003e\u003ccode\u003edb82162\u003c/code\u003e\u003c/a\u003e fix(deps): update aws-sdk-go-v2 monorepo (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9031\"\u003e#9031\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/5a3e533d8cd4045128e61a966f6dad58964a78ea\"\u003e\u003ccode\u003e5a3e533\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/aws/smithy-go to v1.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9032\"\u003e#9032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c67843c753a924faef17bc4aa63c138aa9472477\"\u003e\u003ccode\u003ec67843c\u003c/code\u003e\u003c/a\u003e otelhttp: Remove custom wrapper after handling request (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c0a41352283151ab6655e88120e4ff4f0a917a2e\"\u003e\u003ccode\u003ec0a4135\u003c/code\u003e\u003c/a\u003e docs(otelhttptrace): add performance guidance for WithoutSubSpans (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8785\"\u003e#8785\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/a51a86790e1f4df231a70bb5fecc72b95d3c1bf0\"\u003e\u003ccode\u003ea51a867\u003c/code\u003e\u003c/a\u003e otelconf: implement cardinality_limits support in PeriodicMetricReader (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/dead6e50fc0b5b3dc4aea288df207953dae5afe7\"\u003e\u003ccode\u003edead6e5\u003c/code\u003e\u003c/a\u003e chore(deps): update module go.yaml.in/yaml/v2 to v2.4.4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8994\"\u003e#8994\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/979ce1857524394d0884fd7c491722c5bcb43d50\"\u003e\u003ccode\u003e979ce18\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/jgautheron/goconst to v1.10.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9030\"\u003e#9030\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.68.0...zpages/v0.69.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go...\n\n_Description has been truncated_","html_url":"https://github.com/egorribun/university_ecosystem/pull/1132","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/egorribun%2Funiversity_ecosystem/issues/1132","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1132/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":"/services/ws-hub","pr_created_at":"2026-06-03T22:23:55.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4584107228","node_id":"PR_kwDOP1itWs7icG7z","number":1131,"state":"open","title":"build(deps): Bump the go-ws-hub group in /services/ws-hub with 7 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-03T22:23:55.000Z","updated_at":"2026-06-03T22:24:09.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps): Bump","group_name":"go-ws-hub","update_count":7,"packages":[{"name":"github.com/pact-foundation/pact-go/v2","old_version":"2.4.3","new_version":"2.5.1","repository_url":"https://github.com/pact-foundation/pact-go"},{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp","old_version":"0.68.0","new_version":"0.69.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go-contrib"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/sdk","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/trace","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"}],"path":"/services/ws-hub","ecosystem":"go"},"body":"Bumps the go-ws-hub group in /services/ws-hub with 7 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [github.com/pact-foundation/pact-go/v2](https://github.com/pact-foundation/pact-go) | `2.4.3` | `2.5.1` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.19.0` | `9.20.0` |\n| [go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp](https://github.com/open-telemetry/opentelemetry-go-contrib) | `0.68.0` | `0.69.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/trace](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n\nUpdates `github.com/pact-foundation/pact-go/v2` from 2.4.3 to 2.5.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pact-foundation/pact-go/releases\"\u003egithub.com/pact-foundation/pact-go/v2's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev2.5.1\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eba5ba8a72145364379e8e6488734d59ea4dd9baf chore(release): release v2.5.1\u003c/li\u003e\n\u003cli\u003ea8b37f15a270c0391873a8d29fb57184a40c25e9 docs(native): note ErrVerifierFailed and ErrVerifierFailedToRun are mutually exclusive (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/579\"\u003e#579\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003ev2.5.0\u003c/h2\u003e\n\u003ch2\u003eChangelog\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e4be01969422ae50c0d0bc771ea0a83775848f59c chore(deps): update actions/checkout action to v6 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/547\"\u003e#547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e78a41e97ded8c49478bbf588089fbad1457f5247 chore(deps): update actions/upload-artifact action to v7 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/556\"\u003e#556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e3c4ec69a84e895441e14b5e01b9903b13b61891d chore(deps): update dependency golangci/golangci-lint to v2.12.2 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/572\"\u003e#572\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e769772f44e75a7cc43cfe8ad1dc4a0e781f12dfc chore(deps): update golang docker tag to v1.26 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/570\"\u003e#570\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003ef84e41df136826fe5e0b869073f23524b892fc38 chore(release): release v2.5.0\u003c/li\u003e\n\u003cli\u003e1342c817898247cbc69107b12b53dee790fa6f7a feat(provider): expose verifier error sentinels for errors.Is discrimination (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/577\"\u003e#577\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e889dc1e2ec2b5643bd3a87db92f0321ada6e7bbd fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/pact-foundation/pact-go/blob/master/CHANGELOG.md\"\u003egithub.com/pact-foundation/pact-go/v2's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch3\u003ev2.5.1 (26 May 2026)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ef7737e8 - docs: update verifier error result sentinel descriptions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003ev2.5.0 (22 May 2026)\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/1342c81\"\u003e1342c81\u003c/a\u003e - feat(provider): expose verifier error sentinels for errors.Is discrimination (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/577\"\u003e#577\u003c/a\u003e) (Stanislav Vodetskyi, Thu May 21 16:45:56 2026 -0700)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/889dc1e\"\u003e889dc1e\u003c/a\u003e - fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e) (renovate[bot], Mon May 18 10:10:39 2026 +1000)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/ba5ba8a72145364379e8e6488734d59ea4dd9baf\"\u003e\u003ccode\u003eba5ba8a\u003c/code\u003e\u003c/a\u003e chore(release): release v2.5.1\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/a8b37f15a270c0391873a8d29fb57184a40c25e9\"\u003e\u003ccode\u003ea8b37f1\u003c/code\u003e\u003c/a\u003e docs(native): note ErrVerifierFailed and ErrVerifierFailedToRun are mutually ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/f84e41df136826fe5e0b869073f23524b892fc38\"\u003e\u003ccode\u003ef84e41d\u003c/code\u003e\u003c/a\u003e chore(release): release v2.5.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/1342c817898247cbc69107b12b53dee790fa6f7a\"\u003e\u003ccode\u003e1342c81\u003c/code\u003e\u003c/a\u003e feat(provider): expose verifier error sentinels for errors.Is discrimination ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/889dc1e2ec2b5643bd3a87db92f0321ada6e7bbd\"\u003e\u003ccode\u003e889dc1e\u003c/code\u003e\u003c/a\u003e fix(deps): update module google.golang.org/grpc to v1.81.1 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/574\"\u003e#574\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/3c4ec69a84e895441e14b5e01b9903b13b61891d\"\u003e\u003ccode\u003e3c4ec69\u003c/code\u003e\u003c/a\u003e chore(deps): update dependency golangci/golangci-lint to v2.12.2 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/572\"\u003e#572\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/769772f44e75a7cc43cfe8ad1dc4a0e781f12dfc\"\u003e\u003ccode\u003e769772f\u003c/code\u003e\u003c/a\u003e chore(deps): update golang docker tag to v1.26 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/570\"\u003e#570\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/78a41e97ded8c49478bbf588089fbad1457f5247\"\u003e\u003ccode\u003e78a41e9\u003c/code\u003e\u003c/a\u003e chore(deps): update actions/upload-artifact action to v7 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/556\"\u003e#556\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/4be01969422ae50c0d0bc771ea0a83775848f59c\"\u003e\u003ccode\u003e4be0196\u003c/code\u003e\u003c/a\u003e chore(deps): update actions/checkout action to v6 (\u003ca href=\"https://redirect.github.com/pact-foundation/pact-go/issues/547\"\u003e#547\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/pact-foundation/pact-go/commit/d2461ae5bfcc6903d50f2d84bfad5231439b33b3\"\u003e\u003ccode\u003ed2461ae\u003c/code\u003e\u003c/a\u003e chore: update release process docs\u003c/li\u003e\n\u003cli\u003eSee full diff in \u003ca href=\"https://github.com/pact-foundation/pact-go/compare/v2.4.3...v2.5.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` from 0.68.0 to 0.69.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/releases\"\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eotelconf: validate encoding configuration for OTLP HTTP exporters by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8772\"\u003eopen-telemetry/opentelemetry-go-contrib#8772\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update module github.com/aws/aws-sdk-go-v2/service/s3 to v1.99.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8780\"\u003eopen-telemetry/opentelemetry-go-contrib#8780\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update prom/prometheus docker tag to v3.11.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8779\"\u003eopen-telemetry/opentelemetry-go-contrib#8779\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotellogrus: Set error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e by \u003ca href=\"https://github.com/sonalgaud12\"\u003e\u003ccode\u003e@​sonalgaud12\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8778\"\u003eopen-telemetry/opentelemetry-go-contrib#8778\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/sys to v0.43.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8783\"\u003eopen-telemetry/opentelemetry-go-contrib#8783\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x/telemetry digest to 93c7c8a by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8786\"\u003eopen-telemetry/opentelemetry-go-contrib#8786\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-isatty to v0.0.21 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8787\"\u003eopen-telemetry/opentelemetry-go-contrib#8787\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/mattn/go-runewidth to v0.0.23 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8788\"\u003eopen-telemetry/opentelemetry-go-contrib#8788\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8791\"\u003eopen-telemetry/opentelemetry-go-contrib#8791\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/github-script action to v9 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8795\"\u003eopen-telemetry/opentelemetry-go-contrib#8795\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8794\"\u003eopen-telemetry/opentelemetry-go-contrib#8794\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eotelzap: set error field as record.SetErr  by \u003ca href=\"https://github.com/iblancasa\"\u003e\u003ccode\u003e@​iblancasa\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8719\"\u003eopen-telemetry/opentelemetry-go-contrib#8719\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(deps): update golang.org/x to 746e56f by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8796\"\u003eopen-telemetry/opentelemetry-go-contrib#8796\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module golang.org/x/arch to v0.26.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8798\"\u003eopen-telemetry/opentelemetry-go-contrib#8798\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck if otelgrpc metrics are enabled by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8792\"\u003eopen-telemetry/opentelemetry-go-contrib#8792\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update actions/upload-artifact action to v7.0.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8800\"\u003eopen-telemetry/opentelemetry-go-contrib#8800\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eCheck instrument enabled in deprecatedruntime by \u003ca href=\"https://github.com/dashpole\"\u003e\u003ccode\u003e@​dashpole\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8793\"\u003eopen-telemetry/opentelemetry-go-contrib#8793\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/forbidigo/v2 to v2.3.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8804\"\u003eopen-telemetry/opentelemetry-go-contrib#8804\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/ashanbrown/makezero/v2 to v2.2.1 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8802\"\u003eopen-telemetry/opentelemetry-go-contrib#8802\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore(deps): update module github.com/manuelarte/funcorder to v0.6.0 by \u003ca href=\"https://github.com/renovate\"\u003e\u003ccode\u003e@​renovate\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/pull/8803\"\u003eopen-telemetry/opentelemetry-go-contrib#8803\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/2.5.1/0.69.0/0.37.1/0.24.0/0.19.0/0.16.1/0.16.0] - 2026-05-28\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eerror.type\u003c/code\u003e attribute to \u003ccode\u003ehttp.client.request.duration\u003c/code\u003e for transport failures in \u003ccode\u003eotelhttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8801\"\u003e#8801\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd examples for prometheus compatibility document. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8716\"\u003e#8716\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd support for \u003ccode\u003ecardinality_limits\u003c/code\u003e in \u003ccode\u003ePeriodicMetricReader\u003c/code\u003e in \u003ccode\u003eotelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eResource\u003c/code\u003e method to \u003ccode\u003eSDK\u003c/code\u003e in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf/x\u003c/code\u003e to expose the resolved SDK resource from declarative configuration. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8913\"\u003e#8913\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/contrib/detectors/hetzner\u003c/code\u003e, a new resource detector for Hetzner Cloud servers, ported from \u003ccode\u003egithub.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal/hetzner\u003c/code\u003e. Detects \u003ccode\u003ecloud.provider\u003c/code\u003e, \u003ccode\u003ecloud.platform\u003c/code\u003e, \u003ccode\u003ecloud.region\u003c/code\u003e, \u003ccode\u003ecloud.availability_zone\u003c/code\u003e, \u003ccode\u003ehost.id\u003c/code\u003e, and \u003ccode\u003ehost.name\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8979\"\u003e#8979\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSet error field as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogrus\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8776\"\u003e#8776\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet the \u0026quot;error\u0026quot; field (e.g. created via \u003ccode\u003ezap.Error\u003c/code\u003e) as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of a plain attribute in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelzap\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8719\"\u003e#8719\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet fields implementing \u003ccode\u003eerror\u003c/code\u003e interface from \u003ccode\u003eslog\u003c/code\u003e records as \u003ccode\u003erecord.SetErr\u003c/code\u003e instead of plain attributes in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otelslog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8774\"\u003e#8774\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSet emitted errors in \u003ccode\u003ego.opentelemetry.io/contrib/bridges/otellogr\u003c/code\u003e as record errors (\u003ccode\u003eRecord.SetErr\u003c/code\u003e) instead of \u003ccode\u003eexception.message\u003c/code\u003e attributes. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8775\"\u003e#8775\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eFixed\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFix header attributes lost when using sub-spans in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8797\"\u003e#8797\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eValidate \u003ccode\u003eencoding\u003c/code\u003e configuration for OTLP HTTP exporters in \u003ccode\u003ego.opentelemetry.io/contrib/otelconf\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8772\"\u003e#8772\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eRemove the custom body wrapper from the request's body after the request is processed to allow body type comparisons with the original type in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e and \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eUnknown or empty HTTP methods now report \u0026quot;_OTHER\u0026quot; instead of \u0026quot;GET\u0026quot; across all HTTP instrumentations to align with OpenTelemetry semantic conventions. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8868\"\u003e#8868\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eThe default span name formatter in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\u003c/code\u003e now conforms to the OpenTelemetry HTTP semantic conventions for server span names. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8871\"\u003e#8871\u003c/a\u003e)\n\u003cul\u003e\n\u003cli\u003eThe default span name is now \u003ccode\u003e{method} {route}\u003c/code\u003e (e.g. \u003ccode\u003eGET /foo/{id}\u003c/code\u003e) when a route pattern is available, or \u003ccode\u003e{method}\u003c/code\u003e (e.g. \u003ccode\u003eGET\u003c/code\u003e) otherwise.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eRemoved\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRemove the deprecated \u003ccode\u003eWithSpanOptions\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8991\"\u003e#8991\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/03b2bcdb54b3dde73c9ff91ae216aec262f6c8f5\"\u003e\u003ccode\u003e03b2bcd\u003c/code\u003e\u003c/a\u003e Release v1.44.0/v2.5.1/v0.69.0/v0.37.1/v0.24.0/v0.19.0/v0.16.1/v0.16.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9033\"\u003e#9033\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/80c46d4037d5991ce324216a52cf7e8d7f2d81fa\"\u003e\u003ccode\u003e80c46d4\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/alecthomas/chroma/v2 to v2.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9034\"\u003e#9034\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/51f292197d33b84a21b3c70ae21cb185a2570d5e\"\u003e\u003ccode\u003e51f2921\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/hetznercloud/hcloud-go/v2 to v2.41.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9026\"\u003e#9026\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/db82162f1b642bb6dca7fa5be48045315bb466d6\"\u003e\u003ccode\u003edb82162\u003c/code\u003e\u003c/a\u003e fix(deps): update aws-sdk-go-v2 monorepo (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9031\"\u003e#9031\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/5a3e533d8cd4045128e61a966f6dad58964a78ea\"\u003e\u003ccode\u003e5a3e533\u003c/code\u003e\u003c/a\u003e fix(deps): update module github.com/aws/smithy-go to v1.26.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9032\"\u003e#9032\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c67843c753a924faef17bc4aa63c138aa9472477\"\u003e\u003ccode\u003ec67843c\u003c/code\u003e\u003c/a\u003e otelhttp: Remove custom wrapper after handling request (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/6914\"\u003e#6914\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/c0a41352283151ab6655e88120e4ff4f0a917a2e\"\u003e\u003ccode\u003ec0a4135\u003c/code\u003e\u003c/a\u003e docs(otelhttptrace): add performance guidance for WithoutSubSpans (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8785\"\u003e#8785\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/a51a86790e1f4df231a70bb5fecc72b95d3c1bf0\"\u003e\u003ccode\u003ea51a867\u003c/code\u003e\u003c/a\u003e otelconf: implement cardinality_limits support in PeriodicMetricReader (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8885\"\u003e#8885\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/dead6e50fc0b5b3dc4aea288df207953dae5afe7\"\u003e\u003ccode\u003edead6e5\u003c/code\u003e\u003c/a\u003e chore(deps): update module go.yaml.in/yaml/v2 to v2.4.4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/8994\"\u003e#8994\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/commit/979ce1857524394d0884fd7c491722c5bcb43d50\"\u003e\u003ccode\u003e979ce18\u003c/code\u003e\u003c/a\u003e chore(deps): update module github.com/jgautheron/goconst to v1.10.2 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go-contrib/issues/9030\"\u003e#9030\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go-contrib/compare/zpages/v0.68.0...zpages/v0.69.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelem...\n\n_Description has been truncated_","html_url":"https://github.com/egorribun/university_ecosystem/pull/1131","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/egorribun%2Funiversity_ecosystem/issues/1131","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/1131/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-02T21:03:38.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4574963081","node_id":"PR_kwDOOdjLf87h9_jJ","number":9,"state":"closed","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-15T15:08:37.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-02T21:03:38.000Z","updated_at":"2026-06-15T15:08:39.000Z","time_to_close":1101899,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/fransfilastap/urlshortener/pull/9","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/fransfilastap%2Furlshortener/issues/9","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/9/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":"the gomod group","pr_created_at":"2026-06-02T07:37:34.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4569468381","node_id":"PR_kwDOLwul-c7hr6J5","number":96,"state":"closed","title":"Bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0 in the gomod group","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":"2026-06-07T07:12:40.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-02T07:37:34.000Z","updated_at":"2026-06-07T07:12:42.000Z","time_to_close":430506,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"Bump","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":"the gomod group","ecosystem":"go"},"body":"Bumps the gomod group with 1 update: [github.com/redis/go-redis/v9](https://github.com/redis/go-redis).\n\nUpdates `github.com/redis/go-redis/v9` from 9.19.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore \u003cdependency name\u003e major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore \u003cdependency name\u003e` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore \u003cdependency name\u003e` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore \u003cdependency name\u003e \u003cignore condition\u003e` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n\u003c/details\u003e","html_url":"https://github.com/AS203038/looking-glass/pull/96","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/AS203038%2Flooking-glass/issues/96","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/96/packages"}},{"old_version":"9.18.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-02T03:49:37.000Z","version_change":"9.18.0 → 9.20.0","issue":{"uuid":"4568247691","node_id":"PR_kwDOR7yHgs7hn8wD","number":19,"state":"open","title":"chore(deps): bump github.com/redis/go-redis/v9 from 9.18.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-02T03:49:37.000Z","updated_at":"2026-06-02T03:49:38.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.18.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.18.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/yi-nology/rainbow_bridge/pull/19","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/yi-nology%2Frainbow_bridge/issues/19","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/19/packages"}},{"old_version":"9.12.1","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-02T03:09:03.000Z","version_change":"9.12.1 → 9.20.0","issue":{"uuid":"4568044380","node_id":"PR_kwDOPBkrgM7hnRhA","number":68,"state":"open","title":"deps(deps): bump github.com/redis/go-redis/v9 from 9.12.1 to 9.20.0","user":"dependabot[bot]","labels":["minor","no-version-update","dependencies","go"],"assignees":["saviobatista"],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-02T03:09:03.000Z","updated_at":"2026-06-02T03:11:34.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.12.1","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.12.1 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.12.1...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.12.1\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/saviobatista/sbs-logger/pull/68","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/saviobatista%2Fsbs-logger/issues/68","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/68/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-01T23:04:59.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4567006832","node_id":"PR_kwDOQfHMY87hj64C","number":36,"state":"open","title":"deps: bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0","user":"dependabot[bot]","labels":[],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-01T23:04:59.000Z","updated_at":"2026-06-01T23:05:00.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"deps","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":null,"ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/davidbudnick/redis-tui/pull/36","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidbudnick%2Fredis-tui/issues/36","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/36/packages"}},{"old_version":"9.19.0","new_version":"9.20.0","update_type":"minor","path":"/services/message-processor","pr_created_at":"2026-06-01T22:33:10.000Z","version_change":"9.19.0 → 9.20.0","issue":{"uuid":"4566867300","node_id":"PR_kwDOQSbpRs7hjd_o","number":381,"state":"open","title":"build(deps): bump github.com/redis/go-redis/v9 from 9.19.0 to 9.20.0 in /services/message-processor","user":"dependabot[bot]","labels":["needs-manual-review","dependencies","go"],"assignees":[],"locked":false,"comments_count":2,"pull_request":true,"closed_at":null,"author_association":null,"state_reason":null,"created_at":"2026-06-01T22:33:10.000Z","updated_at":"2026-06-01T22:34:24.000Z","time_to_close":null,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"build(deps)","packages":[{"name":"github.com/redis/go-redis/v9","old_version":"9.19.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"}],"path":"/services/message-processor","ecosystem":"go"},"body":"Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.19.0 to 9.20.0.\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9\u0026package-manager=go_modules\u0026previous-version=9.19.0\u0026new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003eDependabot commands and options\u003c/summary\u003e\n\u003cbr /\u003e\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot show \u003cdependency name\u003e ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n\n\n\u003c/details\u003e","html_url":"https://github.com/caesarakalaeii/all-chat/pull/381","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/caesarakalaeii%2Fall-chat/issues/381","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/381/packages"}},{"old_version":"9.18.0","new_version":"9.20.0","update_type":"minor","path":null,"pr_created_at":"2026-06-01T12:43:58.000Z","version_change":"9.18.0 → 9.20.0","issue":{"uuid":"4563179075","node_id":"PR_kwDOI4BqqM7hXXMD","number":2010,"state":"closed","title":"chore(deps): bump the gomod-updates group across 1 directory with 12 updates","user":"dependabot[bot]","labels":["dependencies","go"],"assignees":[],"locked":false,"comments_count":1,"pull_request":true,"closed_at":"2026-06-08T05:06:23.000Z","author_association":null,"state_reason":null,"created_at":"2026-06-01T12:43:58.000Z","updated_at":"2026-06-08T05:06:24.000Z","time_to_close":577345,"merged_at":null,"merged_by":null,"closed_by":null,"dependency_metadata":{"prefix":"chore(deps): bump","group_name":"gomod-updates","update_count":12,"packages":[{"name":"connectrpc.com/connect","old_version":"1.19.1","new_version":"1.20.0","repository_url":"https://github.com/connectrpc/connect-go"},{"name":"github.com/DataDog/datadog-agent/pkg/trace/log","old_version":"0.78.0","new_version":"0.79.1","repository_url":"https://github.com/DataDog/datadog-agent"},{"name":"github.com/Masterminds/semver/v3","old_version":"3.4.0","new_version":"3.5.0","repository_url":"https://github.com/Masterminds/semver"},{"name":"github.com/exaring/otelpgx","old_version":"0.10.0","new_version":"0.11.1","repository_url":"https://github.com/exaring/otelpgx"},{"name":"github.com/redis/go-redis/v9","old_version":"9.18.0","new_version":"9.20.0","repository_url":"https://github.com/redis/go-redis"},{"name":"go.opentelemetry.io/otel","old_version":"1.43.0","new_version":"1.44.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.opentelemetry.io/otel/exporters/prometheus","old_version":"0.65.0","new_version":"0.66.0","repository_url":"https://github.com/open-telemetry/opentelemetry-go"},{"name":"go.uber.org/zap","old_version":"1.27.1","new_version":"1.28.0","repository_url":"https://github.com/uber-go/zap"},{"name":"golang.org/x/crypto","old_version":"0.50.0","new_version":"0.52.0","repository_url":"https://github.com/golang/crypto"},{"name":"google.golang.org/grpc","old_version":"1.80.0","new_version":"1.81.1","repository_url":"https://github.com/grpc/grpc-go"}],"path":null,"ecosystem":"go"},"body":"Bumps the gomod-updates group with 10 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [connectrpc.com/connect](https://github.com/connectrpc/connect-go) | `1.19.1` | `1.20.0` |\n| [github.com/DataDog/datadog-agent/pkg/trace/log](https://github.com/DataDog/datadog-agent) | `0.78.0` | `0.79.1` |\n| [github.com/Masterminds/semver/v3](https://github.com/Masterminds/semver) | `3.4.0` | `3.5.0` |\n| [github.com/exaring/otelpgx](https://github.com/exaring/otelpgx) | `0.10.0` | `0.11.1` |\n| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.18.0` | `9.20.0` |\n| [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) | `1.43.0` | `1.44.0` |\n| [go.opentelemetry.io/otel/exporters/prometheus](https://github.com/open-telemetry/opentelemetry-go) | `0.65.0` | `0.66.0` |\n| [go.uber.org/zap](https://github.com/uber-go/zap) | `1.27.1` | `1.28.0` |\n| [golang.org/x/crypto](https://github.com/golang/crypto) | `0.50.0` | `0.52.0` |\n| [google.golang.org/grpc](https://github.com/grpc/grpc-go) | `1.80.0` | `1.81.1` |\n\n\nUpdates `connectrpc.com/connect` from 1.19.1 to 1.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/connectrpc/connect-go/releases\"\u003econnectrpc.com/connect's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.20.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eBump minimum supported Go version to 1.25 by \u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate Unary-Get query parameter order to match spec recommendation by \u003ca href=\"https://github.com/oliversun9\"\u003e\u003ccode\u003e@​oliversun9\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/jonbodner-buf\"\u003e\u003ccode\u003e@​jonbodner-buf\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.2...v1.20.0\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev1.19.2\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003ch3\u003eGovernance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ca href=\"https://github.com/timostamm\"\u003e\u003ccode\u003e@​timostamm\u003c/code\u003e\u003c/a\u003e as a maintainer in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/905\"\u003econnectrpc/connect-go#905\u003c/a\u003e 🎉\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eBugfixes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eUse 'deadline_exceeded' instead of 'canceled' on HTTP/2 cancelation when appropriate by \u003ca href=\"https://github.com/jhump\"\u003e\u003ccode\u003e@​jhump\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/904\"\u003econnectrpc/connect-go#904\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndReceive by \u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eOther changes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRefactor memhttptest to work with Go 1.25 synctest by \u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDoc clarifications by \u003ca href=\"https://github.com/emcfarlane\"\u003e\u003ccode\u003e@​emcfarlane\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e, \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/912\"\u003e#912\u003c/a\u003e) and \u003ca href=\"https://github.com/stefanvanburen\"\u003e\u003ccode\u003e@​stefanvanburen\u003c/code\u003e\u003c/a\u003e (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/906\"\u003e#906\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/codefromthecrypt\"\u003e\u003ccode\u003e@​codefromthecrypt\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/881\"\u003econnectrpc/connect-go#881\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/simonferquel\"\u003e\u003ccode\u003e@​simonferquel\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/connectrpc/connect-go/pull/919\"\u003econnectrpc/connect-go#919\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e:\n\u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\"\u003ehttps://github.com/connectrpc/connect-go/compare/v1.19.1...v1.19.2\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1291a7dcac19b00490f935dce18f44f301fc58f6\"\u003e\u003ccode\u003e1291a7d\u003c/code\u003e\u003c/a\u003e Prepare for v1.20.0 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/927\"\u003e#927\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/6df682f19e5b957b96b5fa44ffb28705a2d7bc8c\"\u003e\u003ccode\u003e6df682f\u003c/code\u003e\u003c/a\u003e Update Unary-Get query parameter order to match spec recommendation (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/926\"\u003e#926\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/c4aac92b87026cd709cfbccdaabe8c45abef705c\"\u003e\u003ccode\u003ec4aac92\u003c/code\u003e\u003c/a\u003e Chore update buf v1.69.0 and license year (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/925\"\u003e#925\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/a5a6c30f3776b06ae05a66ab3bdd2d60c46db6db\"\u003e\u003ccode\u003ea5a6c30\u003c/code\u003e\u003c/a\u003e Bump Go from v1.24 to v1.25 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/922\"\u003e#922\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/138e2700eb60b8004363eb344031b317bf599a1f\"\u003e\u003ccode\u003e138e270\u003c/code\u003e\u003c/a\u003e Back to development (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/921\"\u003e#921\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/1c195ae986164a681af958e675dd283eed23e365\"\u003e\u003ccode\u003e1c195ae\u003c/code\u003e\u003c/a\u003e Prepare for v1.19.2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/920\"\u003e#920\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/96abc6b87132d1c43f67f1f5c91efdcb6a59b4aa\"\u003e\u003ccode\u003e96abc6b\u003c/code\u003e\u003c/a\u003e Upgrade golangci-lint to v2 (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/917\"\u003e#917\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/be72fa520cdc8b942db6839dadbe9af0b44b40df\"\u003e\u003ccode\u003ebe72fa5\u003c/code\u003e\u003c/a\u003e Clarify concurrent use semantics for streaming types (\u003ca href=\"https://redirect.github.com/connectrpc/connect-go/issues/911\"\u003e#911\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/299d2e7cdfb5e2fa3fa0963e6cedc51a7364521d\"\u003e\u003ccode\u003e299d2e7\u003c/code\u003e\u003c/a\u003e Fix nil pointer deref in duplexHTTPCall under concurrent Send + CloseAndRecei...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/connectrpc/connect-go/commit/e299aa60ffcf91633e48fcb3dd594cbbb187ec7f\"\u003e\u003ccode\u003ee299aa6\u003c/code\u003e\u003c/a\u003e Bump google.golang.org/grpc from 1.76.0 to 1.79.3 in /internal/conformance (#...\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/connectrpc/connect-go/compare/v1.19.1...v1.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/DataDog/datadog-agent/pkg/trace/log` from 0.78.0 to 0.79.1\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/672032c98c6432dd3629dbc98dc5581df7078397\"\u003e\u003ccode\u003e672032c\u003c/code\u003e\u003c/a\u003e [release] Update release.json for 7.79.1 (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51405\"\u003e#51405\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/1509dd32beee61fa0b5fb9278c26798f0ec23a12\"\u003e\u003ccode\u003e1509dd3\u003c/code\u003e\u003c/a\u003e [release] Update release.json for 7.79.1-rc.1 (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51147\"\u003e#51147\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/506b038c308566d18e845c3e10ca838b06cc5244\"\u003e\u003ccode\u003e506b038\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x] Bump prometheus/prometheus to address CVE-2026-42151 and CV...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/ab42b5891a6e2635216d523ea660d3839b11d89c\"\u003e\u003ccode\u003eab42b58\u003c/code\u003e\u003c/a\u003e [backport] rshell v0.0.14-1 to fix ps (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51298\"\u003e#51298\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/953f787c36af686eaafaec4eb0e8702d7ef0c0d5\"\u003e\u003ccode\u003e953f787\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  [automated] Update golang.org/x/... dependencies (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51259\"\u003e#51259\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/771a21d4b9bf5cad703f3184e8da206b33a88bdd\"\u003e\u003ccode\u003e771a21d\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  [autoscaling] Re-sync local-owner DPAs on annotation chang...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/2f261afbafe04d3408fe3cf3fb47e9d8e8d9f72e\"\u003e\u003ccode\u003e2f261af\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  macos: fix system-probe.yaml being overwritten on upgrade ...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/ab3c1143b35d66abc0465eaa670d8678447841f1\"\u003e\u003ccode\u003eab3c114\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  ignore sigpipe in mac gui app (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/51195\"\u003e#51195\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/59a166c538378a5bcdfdacad62c238b1c9a81636\"\u003e\u003ccode\u003e59a166c\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x] fix(npm/windows): suppress lingering flow re-reports that c...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/DataDog/datadog-agent/commit/27801b98135f636019506e5058b64c48b1f58767\"\u003e\u003ccode\u003e27801b9\u003c/code\u003e\u003c/a\u003e [Backport 7.79.x]  Update curl (\u003ca href=\"https://redirect.github.com/DataDog/datadog-agent/issues/50966\"\u003e#50966\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/DataDog/datadog-agent/compare/pkg/api/v0.78.0...pkg/api/v0.79.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/Masterminds/semver/v3` from 3.4.0 to 3.5.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/Masterminds/semver/releases\"\u003egithub.com/Masterminds/semver/v3's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev3.5.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAdding more prerelease tests by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/273\"\u003eMasterminds/semver#273\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdate constraint error messages by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/278\"\u003eMasterminds/semver#278\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFix edge cases by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/279\"\u003eMasterminds/semver#279\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAdding some checks in by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/280\"\u003eMasterminds/semver#280\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdating deps by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/281\"\u003eMasterminds/semver#281\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump github/codeql-action from 4.35.1 to 4.35.2 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/282\"\u003eMasterminds/semver#282\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump actions/cache from 4.2.3 to 5.0.5 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/283\"\u003eMasterminds/semver#283\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eBump golangci/golangci-lint-action from 7.0.1 to 9.2.0 by \u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/284\"\u003eMasterminds/semver#284\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eUpdating gitignore for devcontainers by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/286\"\u003eMasterminds/semver#286\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFixing some quality issues by \u003ca href=\"https://github.com/mattfarina\"\u003e\u003ccode\u003e@​mattfarina\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/287\"\u003eMasterminds/semver#287\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dependabot\"\u003e\u003ccode\u003e@​dependabot\u003c/code\u003e\u003c/a\u003e[bot] made their first contribution in \u003ca href=\"https://redirect.github.com/Masterminds/semver/pull/282\"\u003eMasterminds/semver#282\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\"\u003ehttps://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/Masterminds/semver/blob/master/CHANGELOG.md\"\u003egithub.com/Masterminds/semver/v3's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003eChangelog\u003c/h1\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/8b89c86cb53c57cfd5d07c13de12bc4d78954e99\"\u003e\u003ccode\u003e8b89c86\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/287\"\u003e#287\u003c/a\u003e from mattfarina/fix-da-issues\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/29d51d0ea4bffe39173673685d0dd312447d74a7\"\u003e\u003ccode\u003e29d51d0\u003c/code\u003e\u003c/a\u003e Fixing some quality issues\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/87f651dbe2f616342d6408b997ad7116ba72ddf3\"\u003e\u003ccode\u003e87f651d\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/286\"\u003e#286\u003c/a\u003e from mattfarina/update-devcontainer\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/158a6852a7e66d99594653227d3e8c3dc6d160ca\"\u003e\u003ccode\u003e158a685\u003c/code\u003e\u003c/a\u003e Updating gitignore for devcontainers\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/7e83c080cfb4455752c654805b189274a10890ab\"\u003e\u003ccode\u003e7e83c08\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/284\"\u003e#284\u003c/a\u003e from Masterminds/dependabot/github_actions/golangci/g...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/697e27f32e7419eb896e7d3ec680c65fc673166b\"\u003e\u003ccode\u003e697e27f\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/283\"\u003e#283\u003c/a\u003e from Masterminds/dependabot/github_actions/actions/ca...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/1591f8e3806198f60fa4dcaf2751bfc805c7740d\"\u003e\u003ccode\u003e1591f8e\u003c/code\u003e\u003c/a\u003e Merge pull request \u003ca href=\"https://redirect.github.com/Masterminds/semver/issues/282\"\u003e#282\u003c/a\u003e from Masterminds/dependabot/github_actions/github/cod...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/3f5ff1737a28437e536d3ec54e41919577748ae6\"\u003e\u003ccode\u003e3f5ff17\u003c/code\u003e\u003c/a\u003e Bump golangci/golangci-lint-action from 7.0.1 to 9.2.0\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/04baa3376047b6d5e79ffcc60f69332dd3e26c85\"\u003e\u003ccode\u003e04baa33\u003c/code\u003e\u003c/a\u003e Bump actions/cache from 4.2.3 to 5.0.5\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Masterminds/semver/commit/45939fec77cd7d07d586b823284d11423028e9c2\"\u003e\u003ccode\u003e45939fe\u003c/code\u003e\u003c/a\u003e Bump github/codeql-action from 4.35.1 to 4.35.2\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/Masterminds/semver/compare/v3.4.0...v3.5.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/exaring/otelpgx` from 0.10.0 to 0.11.1\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/exaring/otelpgx/releases\"\u003egithub.com/exaring/otelpgx's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev0.11.1\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003efix: Tracer.logConnectionDetails defaults to true by \u003ca href=\"https://github.com/trygve-baerland\"\u003e\u003ccode\u003e@​trygve-baerland\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/80\"\u003eexaring/otelpgx#80\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/trygve-baerland\"\u003e\u003ccode\u003e@​trygve-baerland\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/80\"\u003eexaring/otelpgx#80\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.11.0...v0.11.1\"\u003ehttps://github.com/exaring/otelpgx/compare/v0.11.0...v0.11.1\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003ev0.11.0\u003c/h2\u003e\n\u003ch2\u003eWhat's Changed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003echore(deps): upgrade Go version to 1.25 + use latest stable otel semconv by \u003ca href=\"https://github.com/ValentinLvr\"\u003e\u003ccode\u003e@​ValentinLvr\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/74\"\u003eexaring/otelpgx#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efeat: add option to disable the AcquireTracer by \u003ca href=\"https://github.com/joshua-tianci\"\u003e\u003ccode\u003e@​joshua-tianci\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/73\"\u003eexaring/otelpgx#73\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003efix(stats): allow WithStatsAttributes to override library defaults by \u003ca href=\"https://github.com/obitech\"\u003e\u003ccode\u003e@​obitech\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/78\"\u003eexaring/otelpgx#78\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003echore: spring cleaning — Go matrix, pgx, testify, golangci-lint by \u003ca href=\"https://github.com/obitech\"\u003e\u003ccode\u003e@​obitech\u003c/code\u003e\u003c/a\u003e in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/79\"\u003eexaring/otelpgx#79\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003eNew Contributors\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/ValentinLvr\"\u003e\u003ccode\u003e@​ValentinLvr\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/74\"\u003eexaring/otelpgx#74\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/joshua-tianci\"\u003e\u003ccode\u003e@​joshua-tianci\u003c/code\u003e\u003c/a\u003e made their first contribution in \u003ca href=\"https://redirect.github.com/exaring/otelpgx/pull/73\"\u003eexaring/otelpgx#73\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eFull Changelog\u003c/strong\u003e: \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.0\"\u003ehttps://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.0\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/626246cecc54852957b15ff581eaadc139893e17\"\u003e\u003ccode\u003e626246c\u003c/code\u003e\u003c/a\u003e Fix lints\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/168b1050b5d09587aa3fab80da4a0aa50aa4b7d3\"\u003e\u003ccode\u003e168b105\u003c/code\u003e\u003c/a\u003e Refactor tests to use testify\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/795d56ddbeaca027d09b464e99bf693d68b264f3\"\u003e\u003ccode\u003e795d56d\u003c/code\u003e\u003c/a\u003e fix logConnectionDetails\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/76cf7a5e74d62b3d166720df7c2f2edbde5daee2\"\u003e\u003ccode\u003e76cf7a5\u003c/code\u003e\u003c/a\u003e Add tests for asserting trace attributes\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/25501deaaaeb09fc8a76c6719ab4b87ee7378b79\"\u003e\u003ccode\u003e25501de\u003c/code\u003e\u003c/a\u003e fix(ci): test from go1.25+\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/ca37215cd0dd8b46c2c17db02d424817278591f1\"\u003e\u003ccode\u003eca37215\u003c/code\u003e\u003c/a\u003e fix: Update .github/workflows/test.yaml\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/b0d28b5275d7e20efbc7420cadf8ff0fa0130729\"\u003e\u003ccode\u003eb0d28b5\u003c/code\u003e\u003c/a\u003e refactor(test): use typed context key in span name test\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/45dc29040173579735def2de9d112dd8b1a6577f\"\u003e\u003ccode\u003e45dc290\u003c/code\u003e\u003c/a\u003e chore(lint): switch from golint to golangci-lint\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/ad455b081c94019e793b969f26c9dcdc42dcc0c9\"\u003e\u003ccode\u003ead455b0\u003c/code\u003e\u003c/a\u003e refactor: switch to testify\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/exaring/otelpgx/commit/e630def1602b705641a39594c43336d8281e14b3\"\u003e\u003ccode\u003ee630def\u003c/code\u003e\u003c/a\u003e chore: update pgx\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/exaring/otelpgx/compare/v0.10.0...v0.11.1\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `github.com/redis/go-redis/v9` from 9.18.0 to 9.20.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/releases\"\u003egithub.com/redis/go-redis/v9's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e9.20.0\u003c/h2\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eClusterClient \u003ccode\u003eWatch\u003c/code\u003e retry\u003c/strong\u003e: User errors returned from a \u003ccode\u003eWatch\u003c/code\u003e callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. \u003ccode\u003enet.ErrClosed\u003c/code\u003e short-circuits immediately (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3821\"\u003e#3821\u003c/a\u003e) by \u003ca href=\"https://github.com/obiyang\"\u003e\u003ccode\u003e@​obiyang\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md\"\u003egithub.com/redis/go-redis/v9's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch1\u003e9.20.0 (2026-05-28)\u003c/h1\u003e\n\u003ch2\u003e🚀 Highlights\u003c/h2\u003e\n\u003ch3\u003eRedis 8.8 Support\u003c/h3\u003e\n\u003cp\u003eThis release adds support for \u003cstrong\u003eRedis 8.8\u003c/strong\u003e. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the \u003ccode\u003e8.8-rc1\u003c/code\u003e client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).\u003c/p\u003e\n\u003cp\u003eCoverage for the new commands that ship in the 8.x line, rounded out in this release:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eAR*\u003c/code\u003e array data type\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) — new array data structure, exposed via the \u003ccode\u003eArrayCmdable\u003c/code\u003e interface (see the experimental-features highlight below).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eINCREX\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) — atomic increment with expiration in a single round-trip.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXNACK\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) — explicit negative-acknowledge of pending stream entries.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAUTOCLAIM\u003c/code\u003e PEL deletes\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) — \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the pending entries list.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eTS.RANGE\u003c/code\u003e multiple aggregators\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) — \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e accept multiple aggregators in a single call.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eZ(UNION|INTER|DIFF)\u003c/code\u003e \u003ccode\u003eCOUNT\u003c/code\u003e aggregator\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) — \u003ccode\u003eCOUNT\u003c/code\u003e reducer for sorted-set set operations.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) — new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous FP arrays.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCI image bump (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3814\"\u003e#3814\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e. Command coverage contributions by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e, \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e, and \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003ch3\u003eStable RESP3 for RediSearch (\u003ccode\u003eUnstableResp3\u003c/code\u003e deprecated)\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eFT.SEARCH\u003c/code\u003e, \u003ccode\u003eFT.AGGREGATE\u003c/code\u003e, \u003ccode\u003eFT.INFO\u003c/code\u003e, \u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e, and \u003ccode\u003eFT.SYNDUMP\u003c/code\u003e now parse RESP3 (map) responses into the same typed result objects as RESP2 — \u003ccode\u003eVal()\u003c/code\u003e and \u003ccode\u003eResult()\u003c/code\u003e work uniformly on both protocols, no flag required. Previously, RESP3 search responses required \u003ccode\u003eUnstableResp3: true\u003c/code\u003e and were returned as opaque maps accessible only via \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAs a result, the \u003ccode\u003eUnstableResp3\u003c/code\u003e option is now a \u003cstrong\u003eno-op\u003c/strong\u003e across every options struct (\u003ccode\u003eOptions\u003c/code\u003e, \u003ccode\u003eClusterOptions\u003c/code\u003e, \u003ccode\u003eUniversalOptions\u003c/code\u003e, \u003ccode\u003eFailoverOptions\u003c/code\u003e, \u003ccode\u003eRingOptions\u003c/code\u003e) and has been marked \u003ccode\u003e// Deprecated:\u003c/code\u003e. The field is retained for backwards compatibility — existing code that sets \u003ccode\u003eUnstableResp3: true\u003c/code\u003e will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. \u003ccode\u003eRawResult()\u003c/code\u003e / \u003ccode\u003eRawVal()\u003c/code\u003e continue to work for callers that prefer the raw RESP payload.\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch3\u003eExperimental Array Data Structure Commands\u003c/h3\u003e\n\u003cp\u003eAdds an experimental \u003ccode\u003eArrayCmdable\u003c/code\u003e interface with the \u003ccode\u003eAR*\u003c/code\u003e command family (\u003ccode\u003eARSet\u003c/code\u003e, \u003ccode\u003eARGet\u003c/code\u003e, \u003ccode\u003eARGetRange\u003c/code\u003e, \u003ccode\u003eARMSet\u003c/code\u003e, \u003ccode\u003eARMGet\u003c/code\u003e, \u003ccode\u003eARDel\u003c/code\u003e, \u003ccode\u003eARDelRange\u003c/code\u003e, \u003ccode\u003eARScan\u003c/code\u003e, \u003ccode\u003eARSeek\u003c/code\u003e, \u003ccode\u003eARNext\u003c/code\u003e, \u003ccode\u003eARLastItems\u003c/code\u003e, \u003ccode\u003eARGrep\u003c/code\u003e, \u003ccode\u003eARGrepWithValues\u003c/code\u003e, \u003ccode\u003eARInfo\u003c/code\u003e/\u003ccode\u003eARInfoFull\u003c/code\u003e, and typed reducers \u003ccode\u003eAROpSum\u003c/code\u003e/\u003ccode\u003eAROpMin\u003c/code\u003e/\u003ccode\u003eAROpMax\u003c/code\u003e/\u003ccode\u003eAROpAnd\u003c/code\u003e/\u003ccode\u003eAROpOr\u003c/code\u003e/\u003ccode\u003eAROpXor\u003c/code\u003e/\u003ccode\u003eAROpMatch\u003c/code\u003e/\u003ccode\u003eAROpUsed\u003c/code\u003e) for working with Redis 8.8's new array data type. \u003cstrong\u003eAPI is experimental and may change in a future release.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e(\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3813\"\u003e#3813\u003c/a\u003e) by \u003ca href=\"https://github.com/cxljs\"\u003e\u003ccode\u003e@​cxljs\u003c/code\u003e\u003c/a\u003e\u003c/p\u003e\n\u003ch2\u003e✨ New Features\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eRESP3 search parser\u003c/strong\u003e: First-class RESP3 parsing for \u003ccode\u003eFT.SEARCH\u003c/code\u003e/\u003ccode\u003eFT.AGGREGATE\u003c/code\u003e/\u003ccode\u003eFT.INFO\u003c/code\u003e/\u003ccode\u003eFT.SPELLCHECK\u003c/code\u003e/\u003ccode\u003eFT.SYNDUMP\u003c/code\u003e responses with backwards compatibility for RESP2 (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3741\"\u003e#3741\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eINCREX\u003c/strong\u003e: New \u003ccode\u003eINCREX\u003c/code\u003e command support — atomic increment with expiration (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3816\"\u003e#3816\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eXNACK\u003c/strong\u003e: Client support for the \u003ccode\u003eXNACK\u003c/code\u003e stream command for explicitly negative-acknowledging pending entries (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3790\"\u003e#3790\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTS range multiple aggregators\u003c/strong\u003e: \u003ccode\u003eTS.RANGE\u003c/code\u003e/\u003ccode\u003eTS.REVRANGE\u003c/code\u003e/\u003ccode\u003eTS.MRANGE\u003c/code\u003e/\u003ccode\u003eTS.MREVRANGE\u003c/code\u003e now accept multiple aggregators in a single call (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3791\"\u003e#3791\u003c/a\u003e) by \u003ca href=\"https://github.com/elena-kolevska\"\u003e\u003ccode\u003e@​elena-kolevska\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eXAutoClaim\u003c/code\u003e deleted IDs\u003c/strong\u003e: \u003ccode\u003eXAUTOCLAIM\u003c/code\u003e/\u003ccode\u003eXAUTOCLAIMJUSTID\u003c/code\u003e now return the list of deleted message IDs from the PEL (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3798\"\u003e#3798\u003c/a\u003e) by \u003ca href=\"https://github.com/Khukharr\"\u003e\u003ccode\u003e@​Khukharr\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eJSON.SET FPHA\u003c/code\u003e\u003c/strong\u003e: \u003ccode\u003eJSON.SET\u003c/code\u003e accepts a new \u003ccode\u003eFPHA\u003c/code\u003e argument that specifies the floating-point type for homogeneous floating-point arrays (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3797\"\u003e#3797\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSorted-set union/intersection COUNT\u003c/strong\u003e: \u003ccode\u003eZUNION\u003c/code\u003e/\u003ccode\u003eZINTER\u003c/code\u003e/\u003ccode\u003eZDIFF\u003c/code\u003e aggregator now supports \u003ccode\u003eCOUNT\u003c/code\u003e (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3802\"\u003e#3802\u003c/a\u003e) by \u003ca href=\"https://github.com/ofekshenawa\"\u003e\u003ccode\u003e@​ofekshenawa\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003eFT.HYBRID\u003c/code\u003e vector validation\u003c/strong\u003e: Validates hybrid-search vector input types and adds proper typed vector parameters (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3756\"\u003e#3756\u003c/a\u003e) by \u003ca href=\"https://github.com/DengY11\"\u003e\u003ccode\u003e@​DengY11\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCluster pool wait stats\u003c/strong\u003e: \u003ccode\u003eClusterClient.PoolStats()\u003c/code\u003e now accumulates \u003ccode\u003eWaitCount\u003c/code\u003e and \u003ccode\u003eWaitDurationNs\u003c/code\u003e across all node pools (previously always zero) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3809\"\u003e#3809\u003c/a\u003e) by \u003ca href=\"https://github.com/LINKIWI\"\u003e\u003ccode\u003e@​LINKIWI\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2\u003e🐛 Bug Fixes\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eTLS-only Cluster PubSub\u003c/strong\u003e: \u003ccode\u003eCLUSTER SLOTS\u003c/code\u003e port-0 entries now fall back to the origin endpoint's port, fixing \u003ccode\u003edial tcp \u0026lt;ip\u0026gt;:0: connection refused\u003c/code\u003e on TLS-only clusters started with \u003ccode\u003e--port 0 --tls-port \u0026lt;port\u0026gt;\u003c/code\u003e (fixes \u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3726\"\u003e#3726\u003c/a\u003e) (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3828\"\u003e#3828\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSharded PubSub reconnect routing\u003c/strong\u003e: \u003ccode\u003ePubSub.conn()\u003c/code\u003e now passes both regular (\u003ccode\u003ec.channels\u003c/code\u003e) and sharded (\u003ccode\u003ec.schannels\u003c/code\u003e) channels into the per-PubSub \u003ccode\u003enewConn\u003c/code\u003e closure. Previously, \u003ccode\u003eClusterClient.SSubscribe\u003c/code\u003e-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the \u003ccode\u003eSSUBSCRIBE\u003c/code\u003e was sent to the wrong shard, and the resulting \u003ccode\u003eMOVED\u003c/code\u003e reply was silently dropped (\u003ca href=\"https://redirect.github.com/redis/go-redis/pull/3829\"\u003e#3829\u003c/a\u003e) by \u003ca href=\"https://github.com/ndyakov\"\u003e\u003ccode\u003e@​ndyakov\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03\"\u003e\u003ccode\u003e7d05dd3\u003c/code\u003e\u003c/a\u003e chore(release): v9.20.0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3832\"\u003e#3832\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453\"\u003e\u003ccode\u003e9756882\u003c/code\u003e\u003c/a\u003e fix(test): make waitForSentinelClusterStable robust to disconnected r… (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3830\"\u003e#3830\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833\"\u003e\u003ccode\u003e875ce21\u003c/code\u003e\u003c/a\u003e fix(sentinel): do not close sentinel when replica list is empty (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3795\"\u003e#3795\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7\"\u003e\u003ccode\u003e8a027f2\u003c/code\u003e\u003c/a\u003e chore(ci): add govulncheck workflow (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3779\"\u003e#3779\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97\"\u003e\u003ccode\u003ed8407df\u003c/code\u003e\u003c/a\u003e fix(pubsub): include shard channels in newConn routing list (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3829\"\u003e#3829\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96\"\u003e\u003ccode\u003e6af9bdc\u003c/code\u003e\u003c/a\u003e fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3828\"\u003e#3828\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0\"\u003e\u003ccode\u003efa5aa8c\u003c/code\u003e\u003c/a\u003e chore(doc): Update README and CI image. (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3822\"\u003e#3822\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3\"\u003e\u003ccode\u003efdcc6f9\u003c/code\u003e\u003c/a\u003e refactor(keyPos): Enhance key position retrieval with CommandInfo caching (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3\"\u003e#3\u003c/a\u003e...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762\"\u003e\u003ccode\u003e68a8bc1\u003c/code\u003e\u003c/a\u003e fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56\"\u003e\u003ccode\u003e00bf6d3\u003c/code\u003e\u003c/a\u003e fix: avoid retrying ClusterClient Watch callback errors (\u003ca href=\"https://redirect.github.com/redis/go-redis/issues/3821\"\u003e#3821\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/redis/go-redis/compare/v9.18.0...v9.20.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel` from 1.43.0 to 1.44.0\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eCommits\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/b62d92831b2dd142f5a0cc89c828270274196877\"\u003e\u003ccode\u003eb62d928\u003c/code\u003e\u003c/a\u003e Release 1.44.0 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8376\"\u003e#8376\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/94132a0a729e94c5aa6e9e1ce7640c0f802dcfea\"\u003e\u003ccode\u003e94132a0\u003c/code\u003e\u003c/a\u003e chore(deps): update golang.org/x/telemetry digest to 5997936 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8379\"\u003e#8379\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/6fdcf82adfebc3becfb5d357957546d6d7258469\"\u003e\u003ccode\u003e6fdcf82\u003c/code\u003e\u003c/a\u003e feat: add self-observability metrics to otlpmetricgrpc metric exporters (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/761bbfc2f4ae002f4a54f8c57c12b8a58135a741\"\u003e\u003ccode\u003e761bbfc\u003c/code\u003e\u003c/a\u003e fix(deps): update golang.org/x (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8377\"\u003e#8377\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/3a91dc62d3852313bab40ff151bb3e11fae1745e\"\u003e\u003ccode\u003e3a91dc6\u003c/code\u003e\u003c/a\u003e fix(deps): update googleapis to 3dc84a4 (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8375\"\u003e#8375\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f593185679130f56e14bed3c337fa7f8f60756b1\"\u003e\u003ccode\u003ef593185\u003c/code\u003e\u003c/a\u003e exporters/otlp: default max request size to 64 MiB (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8365\"\u003e#8365\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/f02feacf8652b69c051851cfa2945d2ed5f0d568\"\u003e\u003ccode\u003ef02feac\u003c/code\u003e\u003c/a\u003e Merge commit from fork\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/36c2f1bfd1a6a789dc575f8886399093d7600586\"\u003e\u003ccode\u003e36c2f1b\u003c/code\u003e\u003c/a\u003e semconvkit: add invariant test for histogram-exclusion rule (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8370\"\u003e#8370\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/d0b6cbdff5346557923fd05bd3f5f34df002aeee\"\u003e\u003ccode\u003ed0b6cbd\u003c/code\u003e\u003c/a\u003e sdk/metric: document unit-sensitivity of DefaultAggregationSelector (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8224\"\u003e#8224\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/commit/9a68034bd45c6f24c481d9f9c87ebbee0a61482f\"\u003e\u003ccode\u003e9a68034\u003c/code\u003e\u003c/a\u003e add self observability for stdout exporter (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdditional commits viewable in \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/compare/v1.43.0...v1.44.0\"\u003ecompare view\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr /\u003e\n\nUpdates `go.opentelemetry.io/otel/exporters/prometheus` from 0.65.0 to 0.66.0\n\u003cdetails\u003e\n\u003csummary\u003eRelease notes\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/releases\"\u003ego.opentelemetry.io/otel/exporters/prometheus's releases\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003ev1.44.0/v0.66.0/v0.20.0/v0.0.17\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply \u003ccode\u003eAttributeValueLengthLimit\u003c/code\u003e to \u003ccode\u003eattribute.SLICE\u003c/code\u003e type attribute values in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e, recursively truncating contained string values. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8217\"\u003e#8217\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eError\u003c/code\u003e field on \u003ccode\u003eRecord\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/log/logtest\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8148\"\u003e#8148\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithMaxRequestSize\u003c/code\u003e option in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8157\"\u003e#8157\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSettable\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to allow reusing attribute options. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8178\"\u003e#8178\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental support for splitting metric data across multiple batches in \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e.\nSet \u003ccode\u003eOTEL_GO_X_METRIC_EXPORT_BATCH_SIZE=\u0026lt;max_size\u0026gt;\u003c/code\u003e to enable for all periodic readers.\nSee \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8071\"\u003e#8071\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8192\"\u003e#8192\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8194\"\u003e#8194\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd experimental self-observability metrics in \u003ccode\u003ego.opentelemetry.io/otel/exporters/stdout/stdoutlog\u003c/code\u003e.\nEnable with \u003ccode\u003eOTEL_GO_X_SELF_OBSERVABILITY=true\u003c/code\u003e environment variable.\nSee \u003ccode\u003ego.opentelemetry.io/otel/stdout/stdoutlog/internal/x\u003c/code\u003e for feature documentation. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8263\"\u003e#8263\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eWithDefaultAttributes\u003c/code\u003e to \u003ccode\u003ego.opentelemetry.io/otel/metric/x\u003c/code\u003e to support setting default attributes on instruments. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8135\"\u003e#8135\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package.\nThe package contains semantic conventions from the \u003ccode\u003ev1.41.0\u003c/code\u003e version of the OpenTelemetry Semantic Conventions.\nSee the \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/HEAD/semconv/v1.41.0/MIGRATION.md\"\u003emigration documentation\u003c/a\u003e for information on how to upgrade from \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.40.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8324\"\u003e#8324\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd Observable variants of instruments to \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e package. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8350\"\u003e#8350\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eGenerate explicit histogram bucket boundaries from weaver configuration for HTTP and RPC duration instruments in \u003ccode\u003ego.opentelemetry.io/otel/semconv/v1.41.0\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8002\"\u003e#8002\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3\u003eChanged\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e⚠️ \u003cstrong\u003eBreaking Change:\u003c/strong\u003e \u003ccode\u003ego.opentelemetry.io/otel/sdk/metric\u003c/code\u003e now applies a default cardinality limit of 2000 to comply with the Metrics SDK specification recommendation.\nNew attribute sets are dropped when the cardinality limit is reached. The measurement of these sets are aggregated into a special attribute set containing \u003ccode\u003eattribute.Bool(\u0026quot;otel.metric.overflow\u0026quot;, true)\u003c/code\u003e.\nThis can break users who relied on the previous unlimited default.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c!-- raw HTML omitted --\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e... (truncated)\u003c/p\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eChangelog\u003c/summary\u003e\n\u003cp\u003e\u003cem\u003eSourced from \u003ca href=\"https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md\"\u003ego.opentelemetry.io/otel/exporters/prometheus's changelog\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003ch2\u003e[1.44.0/0.66.0/0.20.0/0.0.17] 2026-05-27\u003c/h2\u003e\n\u003ch3\u003eAdded\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAdd \u003ccode\u003eByteSlice\u003c/code\u003e and \u003ccode\u003eByteSliceValue\u003c/code\u003e functions for new \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7948\"\u003e#7948\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eKindBytes\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/log\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eApply attribute value limit to the \u003ccode\u003eBYTESLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/sdk/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/7990\"\u003e#7990\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/trace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlpmetric\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eBYTESLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/zipkin\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8153\"\u003e#8153\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eString\u003c/code\u003e method for \u003ccode\u003eValue\u003c/code\u003e type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8142\"\u003e#8142\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eAdd \u003ccode\u003eSlice\u003c/code\u003e and \u003ccode\u003eSliceValue\u003c/code\u003e functions for new \u003ccode\u003eSLICE\u003c/code\u003e attribute type in \u003ccode\u003ego.opentelemetry.io/otel/attribute\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8166\"\u003e#8166\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlptrace\u003c/code\u003e. (\u003ca href=\"https://redirect.github.com/open-telemetry/opentelemetry-go/issues/8216\"\u003e#8216\u003c/a\u003e)\u003c/li\u003e\n\u003cli\u003eSupport \u003ccode\u003eSLICE\u003c/code\u003e attributes in \u003ccode\u003ego.opentelemetry.io/otel/exporters/otlp/otlplog\u003c/code\u003e...\n\n_Description has been truncated_","html_url":"https://github.com/xmtp/xmtpd/pull/2010","url":"https://dependabot.ecosyste.ms/api/v1/hosts/GitHub/repositories/xmtp%2Fxmtpd/issues/2010","packages_url":"https://dependabot.ecosyste.ms/api/v1/issues/2010/packages"}}]}