{"id":44610395,"url":"https://github.com/tair-opensource/TairString","last_synced_at":"2026-02-26T22:01:11.483Z","repository":{"id":39614189,"uuid":"342110655","full_name":"tair-opensource/TairString","owner":"tair-opensource","description":"A redis module, similar to redis string, but you can set expire and version for the value. It also provides many very useful commands, such as cas/cad, etc.","archived":false,"fork":false,"pushed_at":"2024-11-13T02:31:39.000Z","size":305,"stargazers_count":120,"open_issues_count":2,"forks_count":21,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-07T14:09:27.809Z","etag":null,"topics":["cad","cas","module","redis","string"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tair-opensource.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-02-25T03:26:54.000Z","updated_at":"2025-07-01T00:29:21.000Z","dependencies_parsed_at":"2024-11-29T22:34:30.528Z","dependency_job_id":null,"html_url":"https://github.com/tair-opensource/TairString","commit_stats":null,"previous_names":["alibaba/tairstring"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tair-opensource/TairString","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairString","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairString/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairString/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairString/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tair-opensource","download_url":"https://codeload.github.com/tair-opensource/TairString/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairString/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29874452,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T21:05:00.265Z","status":"ssl_error","status_checked_at":"2026-02-26T20:57:13.669Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cad","cas","module","redis","string"],"created_at":"2026-02-14T12:00:22.734Z","updated_at":"2026-02-26T22:01:11.473Z","avatar_url":"https://github.com/tair-opensource.png","language":"C","readme":"![](https://img.shields.io/badge/license-Apache--2.0-green)\n![](https://img.shields.io/badge/PRs-welcome-green)\n[![CMake](https://github.com/alibaba/TairString/actions/workflows/cmake.yml/badge.svg)](https://github.com/alibaba/TairString/actions/workflows/cmake.yml)\n[![CI](https://github.com/alibaba/TairString/actions/workflows/ci.yml/badge.svg)](https://github.com/alibaba/TairString/actions/workflows/ci.yml)\n[![Docker Image CI](https://github.com/alibaba/TairString/actions/workflows/docker-image.yml/badge.svg)](https://github.com/alibaba/TairString/actions/workflows/docker-image.yml)  \n\n\n\u003cdiv align=center\u003e\n\u003cimg src=\"imgs/tairstring_logo.jpg\" width=\"500\"/\u003e\n\u003c/div\u003e\n\n## 简介  [英文说明](README.md)\nTairString 是阿里巴巴 Tair 团队开发并开源的一个 redis module，主要包含两个功能：\n\n- 对 redis 原生 string 进行功能增强，增加了 CAS/CAD 两个命令\n- 新增数据类型`exstrtype`， 和原生 string 相比，其 value 上可以指定 version，从而可以方便的实现分布式锁等功能，同时 value 上还可以设置 flags，以支持 memcached 协议\n\n\u003cbr/\u003e\n\n## 我们的modules\n\n[TairHash](https://github.com/alibaba/TairHash): 和redis hash类似，但是可以为field设置expire和version，支持高效的主动过期和被动过期   \n[TairZset](https://github.com/alibaba/TairZset): 和redis zset类似，但是支持多（最大255）维排序，同时支持incrby语义，非常适合游戏排行榜场景   \n[TairString](https://github.com/alibaba/TairString): 和redis string类似，但是支持设置expire和version，并提供CAS/CAD等实用命令，非常适用于分布式锁等场景  \n\n\n\n\u003cbr/\u003e\n\n\n## 快速开始\n\n### 增删改查\n\n```shell\n127.0.0.1:6379\u003e EXSET foo 100\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"100\"\n2) (integer) 1\n127.0.0.1:6379\u003e EXSET foo 200 VER 1\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"200\"\n2) (integer) 2\n127.0.0.1:6379\u003e EXSET foo 300 VER 1\n(error) ERR update version is stale\n127.0.0.1:6379\u003e EXINCRBY foo 100\n(integer) 300\n127.0.0.1:6379\u003e EXGET foo\n1) \"300\"\n2) (integer) 3\n127.0.0.1:6379\u003e EXSETVER foo 100\n(integer) 1\n127.0.0.1:6379\u003e EXGET foo\n1) \"300\"\n2) (integer) 100\n127.0.0.1:6379\u003e EXCAS foo 400 100\n1) OK\n2)\n3) (integer) 101\n127.0.0.1:6379\u003e EXGET foo\n1) \"400\"\n2) (integer) 101\n127.0.0.1:6379\u003e EXCAD foo 101\n(integer) 1\n127.0.0.1:6379\u003e EXGET foo\n(nil)\n```\n\n## Docker\n```\ndocker run -p 6379:6379 tairmodule/tairstring:latest\n```\n\n# CAS/CAD - Redis 原生 String 的增强\n\n## 命令详解\n\n### CAS\n\n#### 语法及复杂度：\n\n\u003e CAS \u003cKey\u003e \u003coldvalue\u003e \u003cnewvalue\u003e [EX seconds][exat timestamp] [PX milliseconds][pxat timestamp]  \n\u003e 时间复杂度：O(1)\n\n#### 命令描述：\n\n\u003e CAS（Compare And Set），当 key 对应的 string 当前值和 oldvalue 相等时才将其值设置为 newvalue\n\n#### 参数描述：\n\n\u003e **key**: 用于定位 string 的键  \n\u003e **oldvalue**: 只有 string 当前值和 oldvalue 相等时才允许修改其值  \n\u003e **newvalue**：string 当前值和 oldvalue 相等时将值设置为 newvalue  \n\u003e **EX**：秒级相对过期时间  \n\u003e **EXAT**：秒级绝对过期时间  \n\u003e **PX**：毫秒级相对过期时间  \n\u003e **PXAT**：毫秒级绝对过期时间\n\n#### 返回值：\n\n\u003e 返回类型：Long  \n\u003e 成功：成功更新值返回 1，key 不存在返回-1，更新值失败返回 0  \n\u003e 错误（如语法错误）：返回对应异常信息\n\n#### 使用示例：\n\n```shell\n127.0.0.1:6379\u003e SET foo bar\nOK\n127.0.0.1:6379\u003e CAS foo baa bzz\n(integer) 0\n127.0.0.1:6379\u003e GET foo\n\"bar\"\n127.0.0.1:6379\u003e CAS foo bar bzz\n(integer) 1\n127.0.0.1:6379\u003e GET foo\n\"bzz\"\n127.0.0.1:6379\u003e CAS foo bzz too EX 10\n(integer) 1\n127.0.0.1:6379\u003e GET foo\n\"too\"\n127.0.0.1:6379\u003e debug sleep 10\nOK\n(10.00s)\n127.0.0.1:6379\u003e GET foo\n(nil)\n127.0.0.1:6379\u003e\n```\n\n### CAD\n\n#### 语法及复杂度：\n\n\u003e CAD \\\u003ckey\\\u003e \\\u003cvalue\\\u003e  \n\u003e 时间复杂度：O(1)\n\n#### 命令描述：\n\n\u003e CAD（Compare And Delete），当 value 和引擎中 value 相等时候删除 Key\n\n#### 参数描述：\n\n\u003e **key**: 用于定位 string 的键  \n\u003e **value**: 只有 string 当前值和 value 相等时才允许删除\n\n#### 返回值：\n\n\u003e 返回类型：Long  \n\u003e 成功：成功删除 key 返回 1，key 不存在返回-1，删除 key 失败返回 0  \n\u003e 错误（如语法错误）：返回对应异常信息\n\n#### 使用示例：\n\n```shell\n127.0.0.1:6379\u003e SET foo bar\nOK\n127.0.0.1:6379\u003e CAD foo bzz\n(integer) 0\n127.0.0.1:6379\u003e CAD not-exists xxx\n(integer) -1\n127.0.0.1:6379\u003e CAD foo bar\n(integer) 1\n127.0.0.1:6379\u003e GET foo\n(nil)\n```\n\n\u003cbr/\u003e\n\n# exstrtype - 一种带版本号和兼容 memcached 语义的 String\n\n## 命令介绍\n\n## 命令总览\n\n| 命令          | 语法                                                                                                                                                                             | 含义                                                                                                              |\n| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |\n| EXSET         | EXSET \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [EX time][px time] [EXAT time][pxat time] [NX \u0026#124; XX][ver version \u0026#124; abs version] [FLAGS flags][withversion]                                      | 将 value 保存到 key 中，各参数含义见后面具体解释。                                                                |\n| EXGET         | EXGET \\\u003ckey\\\u003e [WITHFLAGS]                                                                                                                                                        | 返回 TairStr 的 value + version                                                                                   |\n| EXSETVER      | EXSETVER \\\u003ckey\\\u003e \\\u003cversion\\\u003e                                                                                                                                                     | 直接对一个 key 设置 version，类似于 EXSET ABS                                                                     |\n| EXINCRBY      | EXINCRBY \\\u003ckey\\\u003e \\\u003cnum\\\u003e [EX time][px time] [EXAT time][exat time] [PXAT time][nx \u0026#124; xx] [VER version \u0026#124; ABS version][min minval] [MAX maxval][nonegative] [WITHVERSION] | 对 Key 做自增自减操作，num 的范围为 long。                                                                        |\n| EXINCRBYFLOAT | EXINCRBYFLOAT \\\u003ckey\\\u003e \\\u003cnum\\\u003e [EX time][px time] [EXAT time][exat time] [PXAT time][nx \u0026#124; xx] [VER version \u0026#124; ABS version][min minval] [MAX maxval]                      | 对 Key 做自增自减操作，num 的范围为 double。                                                                      |\n| EXCAS         | EXCAS \\\u003ckey\\\u003e \\\u003cnewvalue\\\u003e \\\u003cversion\\\u003e [EX time] [PX time] [EXAT time] [PXAT time] [KEEPTTL]                                                                                     | 指定 version 将 value 更新，当引擎中的 version 和指定的相同时才更新成功，不成功会返回旧的 value 和 version。      |\n| EXCAD         | EXCAD \\\u003ckey\\\u003e \\\u003cversion\\\u003e                                                                                                                                                        | 当指定 version 和引擎中 version 相等时候删除 Key，否则失败。                                                      |\n| EXAPPEND      | EXAPPEND \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [NX\\|XX][ver version \\| abs version]                                                                                                                  | 对 key 做字符串 append 操作                                                                                       |\n| EXPREPEND     | EXPREPEND \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [NX\\|XX][ver version \\| abs version]                                                                                                                 | 对 key 做字符串 prepend 操作                                                                                      |\n| EXGAE         | EXGAE \\\u003ckey\\\u003e [EX time][px time] [EXAT time][pxat time]                                                                                                                          | GAE（Get And Expire），返回 TairString 的 value+version+flags，同时设置 key 的 expire. **该命令不会自增 version** |\n|               |                                                                                                                                                                                  |                                                                                                                   |\n\n\u003cbr/\u003e\n\n## EXSET\n\n语法及复杂度：\n\n\u003e EXSET \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [EX time][px time] [EXAT time][exat time] [PXAT time][nx | xx] [VER version | ABS version][flags flags] [WITHVERSION]  \n\u003e 时间复杂度：O(1)\n\n命令描述：  \n\u003e 将 value 保存到 key 中\n\n参数描述：  \n\u003e **key**: 用于定位 TairString 的键  \n\u003e **value**: 要设置的 TairString 的值  \n\u003e **EX**：秒级相对过期时间  \n\u003e **EXAT**：秒级绝对过期时间  \n\u003e **PX**：毫秒级相对过期时间  \n\u003e **PXAT**：毫秒级绝对过期时间  \n\u003e **NX**：当数据不存在时写入    \n\u003e **XX**：当数据存在时写入  \n\u003e **VER**：版本号，如果数据存在，和已经存在的数据的版本号做比较，如果相等，写入，并版本号加 1；如果不相等，返回出错；如果数据不存在，忽略传入的版本号，写入成功之后，数据版本号变为 1  \n\u003e **ABS**：绝对版本号，不论数据是否存在，覆盖为指定的版本号    \n\u003e **FLAGS**：类型为uint32_t，以支持 memcached 协议，超出 UINT_MAX 返回出错，缺省时默认值为 0    \n\u003e **WITHVERSION**：修改返回值为 version 而不是\"OK\" \n \n返回值  ：  \n\u003e 返回类型：String    \n\u003e 成功：OK    \n\u003e 其他错误返回异常    \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e EXSET foo bar XX\n(nil)\n127.0.0.1:6379\u003e EXSET foo bar NX\nOK\n127.0.0.1:6379\u003e EXSET foo bar NX\n(nil)\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar\"\n2) (integer) 1\n127.0.0.1:6379\u003e EXSET foo bar1 VER 10\n(error) ERR update version is stale\n127.0.0.1:6379\u003e EXSET foo bar1 VER 1\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar1\"\n2) (integer) 2\n127.0.0.1:6379\u003e EXSET foo bar2 ABS 100\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar2\"\n2) (integer) 100\n127.0.0.1:6379\u003e\n```\n\n## EXGET\n\n语法及复杂度：\n\n\u003e EXGET \\\u003ckey\\\u003e [WITHFLAGS]  \n\u003e 时间复杂度：O(1)  \n\n命令描述：\n\u003e 返回 TairStr 的 value + version  \n\n参数描述：  \n\u003e **key**: 用于定位 TairString 的键  \n\u003e **WITHFLAGS**: 设置该参数则会多返回一个 flags  \n\n返回值：\n\n\u003e 返回类型：List\u003cString\u003e/List\u003cbyte[]\u003e  \n\u003e 成功：value+version  \n\u003e 其他错误返回异常  \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e EXSET foo bar ABS 100\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar\"\n2) (integer) 100\n127.0.0.1:6379\u003e DEL foo\n(integer) 1\n127.0.0.1:6379\u003e EXGET foo\n(nil)\n127.0.0.1:6379\u003e\n```\n\n## EXSETVER\n\n语法及复杂度：\n\n\u003e EXSETVER \\\u003ckey\\\u003e \\\u003cversion\\\u003e  \n\u003e 时间复杂度：O(1)  \n\n命令描述：\n\u003e 直接对一个 key 设置 version，类似于 EXSET ABS  \n \n参数描述：  \n\u003e **key**: 用于定位 TairString 的键  \n\u003e **version**: 强制设置的 TairString 的版本号  \n\n返回值：\n\u003e 返回类型：Long  \n\u003e 成功：1  \n\u003e key 不存在：0  \n\u003e 其他错误返回异常  \n\n使用示例：\n\n```shell\n127.0.0.1:6379\u003e EXSET foo bar\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar\"\n2) (integer) 1\n127.0.0.1:6379\u003e EXSETVER foo 2\n(integer) 1\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar\"\n2) (integer) 2\n127.0.0.1:6379\u003e EXSETVER not-exists 0\n(integer) 0\n127.0.0.1:6379\u003e\n```\n\n## EXINCRBY\n\n语法及复杂度：\n\u003e EXINCRBY | EXINCRBY \\\u003ckey\\\u003e \\\u003cnum\\\u003e [EX time][px time] [EXAT time][exat time] [PXAT time][nx | xx] [VER version | ABS version][min minval] [MAX maxval][nonegative] [WITHVERSION]\n\u003e 时间复杂度：O(1)\n\n命令描述：  \n\u003e 对 Key 做自增自减操作，num 的范围为 long  \n\n参数描述：\n\u003e **key**: 定位 TairString 的键  \n\u003e **num**: TairString 自增的数值，必须为自然数  \n\u003e **EX**：秒级相对过期时间  \n\u003e **EXAT**：秒级绝对过期时间  \n\u003e **PX**：毫秒级相对过期时间  \n\u003e **PXAT**：毫秒级绝对过期时间    \n\u003e **NX**：当数据不存在时写入  \n\u003e **XX**：当数据存在时写入    \n\u003e **VER**：版本号，如果数据存在，和已经存在的数据的版本号做比较，如果相等，写入，并版本号加 1；如果不相等，返回出错；如果数据不存在，忽略传入的版本号，写入成功之后，数据版本号变为 1  \n\u003e **ABS**：绝对版本号，不论数据是否存在，覆盖为指定的版本号  \n\u003e **MIN**：TairString 值的最小值  \n\u003e **MAX**：TairString 值的最大值  \n\u003e **NONEGATIVE**：设置后，若 incrby 的结果小于 0 则将 value 置为 0  \n\u003e **WITHVERSION**：额外返回一个 version  \n\n返回值：\n\u003e 返回类型：Long  \n\u003e 成功：引擎的 value 值  \n\u003e 其他错误返回异常  \n\n使用示例：\n\n```shell\n127.0.0.1:6379\u003e EXINCRBY foo 100\n(integer) 100\n127.0.0.1:6379\u003e EXINCRBY foo 100 MAX 150\n(error) ERR increment or decrement would overflow\n127.0.0.1:6379\u003e FLUSHALL\nOK\n127.0.0.1:6379\u003e EXINCRBY foo 100\n(integer) 100\n127.0.0.1:6379\u003e EXINCRBY foo 100 MAX 150\n(error) ERR increment or decrement would overflow\n127.0.0.1:6379\u003e EXINCRBY foo 100 MAX 300\n(integer) 200\n127.0.0.1:6379\u003e EXINCRBY foo 100 MIN 500\n(error) ERR increment or decrement would overflow\n127.0.0.1:6379\u003e EXINCRBY foo 100 MIN 500 MAX 100\n(error) ERR min or max is specified, but not valid\n127.0.0.1:6379\u003e EXINCRBY foo 100 MIN 50\n(integer) 300\n127.0.0.1:6379\u003e\n```\n\n## EXINCRBYFLOAT\n\n语法及复杂度：\n\n\u003e EXINCRBYFLOAT \u003ckey\u003e \u003cnum\u003e [EX time][px time] [EXAT time][exat time] [PXAT time][nx | xx] [VER version | ABS version][min minval] [MAX maxval]  \n\u003e 时间复杂度：O(1)\n\n命令描述：\n\u003e 对 Key 做自增自减操作，num 的范围为 double\n\n参数描述：  \n\u003e **key**: 定位 TairString 的键  \n\u003e **num**: TairString 自增的数值，浮点数类型  \n\u003e **EX**：秒级相对过期时间  \n\u003e **EXAT**：秒级绝对过期时间  \n\u003e **PX**：毫秒级相对过期时间  \n\u003e **PXAT**：毫秒级绝对过期时间  \n\u003e **NX**：当数据不存在时写入  \n\u003e **XX**：当数据存在时写入  \n\u003e **VER**：版本号，如果数据存在，和已经存在的数据的版本号做比较，如果相等，写入，并版本号加 1；如果不相等，返回出错；如果数据不存在，忽略传入的版本号，写入成功之后，数据版本号变为 1  \n\u003e **ABS**：绝对版本号，不论数据是否存在，覆盖为指定的版本号  \n\u003e **MIN**：TairString 值的最小值  \n\u003e **MAX**：TairString 值的最大值  \n\n返回值：\n\u003e 返回类型：Double  \n\u003e 成功：引擎的 value 值  \n\u003e 其他错误返回异常  \n\n使用示例：\n\n```shell\n127.0.0.1:6379\u003e EXSET foo 100\nOK\n127.0.0.1:6379\u003e EXINCRBYFLOAT foo 10.123\n\"110.123\"\n127.0.0.1:6379\u003e EXINCRBYFLOAT foo 20 MAX 100\n(error) ERR increment or decrement would overflow\n127.0.0.1:6379\u003e EXINCRBYFLOAT foo 20 MIN 100\n\"130.123\"\n127.0.0.1:6379\u003e EXGET foo\n1) \"130.123\"\n2) (integer) 3\n127.0.0.1:6379\u003e\n```\n\n## EXCAS\n\n语法及复杂度：\n\u003e EXCAS \u003ckey\u003e \u003cnewvalue\u003e \u003cversion\u003e [EX time] [PX time] [EXAT time] [PXAT time] [KEEPTTL]  \n\u003e 时间复杂度：O(1)\n\n命令描述：\n\u003e CAS（Compare And Set），对比指定 version 将 value 更新，当引擎中的 version 和指定的相同时才更新成功，不成功会返回旧的 value 和 version  \n\n返回值：\n\u003e 返回类型：List\u003cString\u003e/List\u003cbyte[]\u003e  \n\u003e 成功：[\"OK\", \"\", version]，中间值\"\"是空串无意义，version 是当前的 version  \n\u003e 删除失败：[\"Err\", value, version]。错误是\"ERR update version is stale\", value 和 version 都是引擎最新的  \n\u003e 其他错误返回异常  \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e EXSET foo bar\nOK\n127.0.0.1:6379\u003e EXCAS foo bzz 1\n1) OK\n2)\n3) (integer) 2\n127.0.0.1:6379\u003e EXGET foo\n1) \"bzz\"\n2) (integer) 2\n127.0.0.1:6379\u003e EXCAS foo bee 1\n1) ERR update version is stale  # 注意这里返回的是简单字符串（返回错误类型会导致 Jedis 抛异常）\n2) \"bzz\"\n3) (integer) 2\n127.0.0.1:6379\u003e\n```\n\n## EXCAD\n\n语法及复杂度：\n\u003e EXCAD \u003ckey\u003e \u003cversion\u003e  \n\u003e 时间复杂度：O(1)  \n\n命令描述：\n\u003e CAD（Compare And Delete），当指定 version 和引擎中 version 相等时候删除 Key，否则失败  \n\n返回值：\n\u003e 返回类型：Long  \n\u003e 成功：1  \n\u003e key 不存在：-1  \n\u003e 删除失败：0  \n\u003e 其他错误返回异常  \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e EXSET foo bar\nOK\n127.0.0.1:6379\u003e EXGET foo\n1) \"bar\"\n2) (integer) 1\n127.0.0.1:6379\u003e EXCAD not-exists 1\n(integer) -1\n127.0.0.1:6379\u003e EXCAD foo 0\n(integer) 0\n127.0.0.1:6379\u003e EXCAD foo 1\n(integer) 1\n127.0.0.1:6379\u003e EXGET foo\n(nil)\n127.0.0.1:6379\u003e\n```\n\n## EXAPPEND\n\n语法及复杂度：\n\u003e EXAPPEND \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [NX|XX][ver version | abs version]  \n\u003e 时间复杂度：O(1)\n\n命令描述：\n\u003e 对 key 做字符串 append 操作  \n\n参数描述：\n\u003e **key**：定位 TairString 的键  \n\u003e **value**：需要 append 的字符串  \n\u003e **NX**：当数据不存在时写入  \n\u003e **XX**：当数据存在时写入  \n\u003e **VER**：版本号，如果数据存在，和已经存在的数据的版本号做比较，如果相等，写入，并版本号加 1；如果不相等，返回出错；如果数据不存在，忽略传入的版本号，写入成功之后，数据版本号变为 1  \n\u003e **ABS**：绝对版本号，不论数据是否存在，覆盖为指定的版本号  \n  \n返回值：\n\u003e 返回类型：Long  \n\u003e 成功：自增后的 version  \n\u003e 其他错误返回异常  \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e exappend exstringkey foo\n(integer) 1\n127.0.0.1:6379\u003e exget exstringkey\n1) \"foo\"\n2) (integer) 1\n127.0.0.1:6379\u003e exappend exstringkey bar\n(integer) 2\n127.0.0.1:6379\u003e exget exstringkey\n1) \"foobar\"\n2) (integer) 2\n```\n  \n## EXPREPEND\n\n语法及复杂度：\n\n\u003e EXPREPEND \\\u003ckey\\\u003e \\\u003cvalue\\\u003e [NX|XX][ver version | abs version]  \n\u003e 时间复杂度：O(1)\n\n命令描述：\n\u003e 对 key 做字符串 prepend 操作  \n\n参数描述：  \n\u003e **key**：定位 TairString 的键  \n\u003e **value**：需要 prepend 的字符串  \n\u003e **NX**：当数据不存在时写入  \n\u003e **XX**：当数据存在时写入  \n\u003e **VER**：版本号，如果数据存在，和已经存在的数据的版本号做比较，如果相等，写入，并版本号加 1；如果不相等，返回出错；如果数据不存在，忽略传入的版本号，写入成功之后，数据版本号变为 1  \n\u003e **ABS**：绝对版本号，不论数据是否存在，覆盖为指定的版本号\n\n返回值：\n\u003e 返回类型：Long  \n\u003e 成功：自增后的 version  \n\u003e 其他错误返回异常  \n\n使用示例：\n```shell\n127.0.0.1:6379\u003e exprepend exstringkey foo\n(integer) 1\n127.0.0.1:6379\u003e exget exstringkey\n1) \"foo\"\n2) (integer) 1\n127.0.0.1:6379\u003e exprepend exstringkey bar\n(integer) 2\n127.0.0.1:6379\u003e exget exstringkey\n1) \"barfoo\"\n2) (integer) 2\n```\n\n## EXGAE\n\n语法及复杂度：\n\n\u003e EXGAE \\\u003ckey\\\u003e [EX time | EXAT time | PX time | PXAT time]  \n\u003e 时间复杂度：O(1)\n\n命令描述：\n\n\u003e GAE（Get And Expire），返回 TairString 的 value+version+flags，同时设置 key 的 expire. **该命令不会自增 version**  \n\n参数描述：\n\u003e **key**：定位 TairString 的键    \n\u003e **EX**：秒级相对过期时间     \n\u003e **EXAT**：秒级绝对过期时间    \n\u003e **PX**：毫秒级相对过期时间    \n\u003e **PXAT**：毫秒级绝对过期时间    \n\n返回值：\n\u003e 返回类型：List\\\u003cString\\\u003e/List\\\u003cbyte[]\\\u003e  \n\u003e 成功：value+version+flags  \n\u003e 其他错误返回异常  \n  \n使用示例：\n```shell\n127.0.0.1:6379\u003e exset exstringkey foo ex 10 flags 123 WITHVERSION\n(integer) 1\n127.0.0.1:6379\u003e ttl exstringkey\n(integer) 9\n127.0.0.1:6379\u003e exgae exstringkey ex 20\n1) \"foo\"\n2) (integer) 1\n3) (integer) 123\n127.0.0.1:6379\u003e ttl exstringkey\n(integer) 18\n127.0.0.1:6379\u003e debug sleep 20\nOK\n(20.00s)\n127.0.0.1:6379\u003e ttl exstringkey\n(integer) -2\n127.0.0.1:6379\u003e\n```\n\n\u003cbr/\u003e\n  \n## 编译及使用\n\n```\nmkdir build  \ncd build  \ncmake ../ \u0026\u0026 make -j\n```\n编译成功后会在lib目录下产生tairstring_module.so库文件\n\n```\n./redis-server --loadmodule /path/to/tairstring_module.so\n```\n## 测试方法\n\n1. 修改`tests`目录下tairstring.tcl文件中的路径为`set testmodule [file your_path/tairstring_module.so]`\n2. 将`tests`目录下tairstring.tcl文件路径加入到redis的test_helper.tcl的all_tests中\n3. 在redis根目录下运行./runtest --single tairstring\n\n\n## 客户端\n\n| language | GitHub |\n|----------|---|\n| Java     |https://github.com/alibaba/alibabacloud-tairjedis-sdk|\n| Python   |https://github.com/alibaba/tair-py|\n| Go       |https://github.com/alibaba/tair-go|\n| .Net     |https://github.com/alibaba/AlibabaCloud.TairSDK|\n","funding_links":[],"categories":["C"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftair-opensource%2FTairString","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftair-opensource%2FTairString","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftair-opensource%2FTairString/lists"}