{
  "schema_version": 2,
  "id": "operate/rs/databases/active-active/develop",
  "title": "Active-Active Redis applications",
  "url": "https://redis.io/docs/latest/operate/rs/databases/active-active/develop/",
  "summary": "General information to keep in mind while developing applications for an Active-Active database.",
  "tags": [
    "docs",
    "operate",
    "rs"
  ],
  "last_updated": "2026-10-01T15:48:36+01:00",
  "children": [
    {
      "id": "operate/rs/databases/active-active/develop/develop-for-aa",
      "summary": "Overview of how developing applications differs for Active-Active databases from standalone Redis databases.",
      "title": "Develop applications with Active-Active databases",
      "url": "https://redis.io/docs/latest/operate/rs/databases/active-active/develop/develop-for-aa/"
    },
    {
      "id": "operate/rs/databases/active-active/develop/data-types",
      "summary": "Introduction to differences in data types between standalone and Active-Active Redis databases.",
      "title": "Data types for Active-Active databases",
      "url": "https://redis.io/docs/latest/operate/rs/databases/active-active/develop/data-types/"
    },
    {
      "id": "operate/rs/databases/active-active/develop/app-failover-active-active",
      "summary": "How to failover your application to connect to a remote replica.",
      "title": "Application failover with Active-Active databases",
      "url": "https://redis.io/docs/latest/operate/rs/databases/active-active/develop/app-failover-active-active/"
    }
  ],
  "page_type": "content",
  "content_hash": "31e8cc1f9013debe79d7ea0f96da1d1ca2c02533c954675e7f06876b7e477a67",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "Developing globally distributed applications can be challenging, as\ndevelopers have to think about race conditions and complex combinations\nof events under geo-failovers and cross-region write conflicts. In Redis Software (RS), Active-Active databases\nsimplify developing such applications by directly using built-in smarts\nfor handling conflicting writes based on the data type in use. Instead\nof depending on just simplistic \"last-writer-wins\" type conflict\nresolution, geo-distributed Active-Active databases (formerly known as CRDBs) combine techniques defined in CRDT\n(conflict-free replicated data types) research with Redis types to\nprovide smart and automatic conflict resolution based on the data type's\nintent.\n\nAn Active-Active database is a globally distributed database that spans multiple Redis\nEnterprise Software clusters. Each Active-Active database can have many Active-Active database instances\nthat come with added smarts for handling globally distributed writes\nusing the proven\n[CRDT](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type)\napproach.\n[CRDT](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type)\nresearch describes a set of techniques for creating systems that can\nhandle conflicting writes. CRDBs powered by Multi-Master Replication\n(MMR) provide a straightforward and effective way to replicate your\ndata between regions and simplify development of complex applications\nthat can maintain correctness under geo-failovers and concurrent\ncross-region writes to the same data.\n\n![Geo-replication world map](https://redis.io/docs/latest/images/rs/crdbs.png)\n\nActive-Active databases replicate data between multiple Redis Software\nclusters. Common uses for Active-Active databases include disaster recovery,\ngeographically redundant applications, and keeping data closer to your\nusers' locations. MMR is always multi-directional amongst the clusters\nconfigured in the Active-Active database. For unidirectional replication, please see the\nReplica Of capabilities in Redis Software."
    },
    {
      "id": "example-of-synchronization",
      "title": "Example of synchronization",
      "role": "example",
      "text": "In the example below, database writes are concurrent at the points in\ntime t1 and t2 and happen before a sync can communicate the changes.\nHowever, writes at times t4 and t6 are not concurrent as a sync happened\nin between.\n\n|  **Time** | **CRDB Instance1** | **CRDB Instance2** |\n|  ------: | :------: | :------: |\n|  t1 | SET key1 \"a\" |  |\n|  t2 |  | SET key1 \"b\" |\n|  t3 | — Sync — | — Sync — |\n|  t4 | SET key1 \"c\" |  |\n|  t5 | — Sync — | — Sync — |\n|  t6 |  | SET key1 \"d\" |\n\n[Learn more about\nsynchronization for\neach supported data type](https://redis.io/docs/latest/operate/rs/databases/active-active/develop/data-types) and [how to develop applications](https://redis.io/docs/latest/operate/rs/databases/active-active/develop/develop-for-aa) with them on Redis Software."
    }
  ],
  "examples": []
}
