{
  "schema_version": 2,
  "id": "integrate/redis-data-integration/when-to-use",
  "title": "When to use RDI",
  "url": "https://redis.io/docs/latest/integrate/redis-data-integration/1.19.1/when-to-use/",
  "summary": "Understand when (and when not) to use RDI.",
  "content": "\nRDI is designed to support apps that must use a disk-based database as the system of record\nbut must also be fast and scalable. This is a common requirement for mobile and web\napps with a rapidly-growing number of users; the performance of the main database is fine at first\nbut it will soon struggle to handle the increasing demand without a cache.\n\n## Guidelines for using RDI\n\nUse the information in the sections below to determine whether RDI is a good fit for your architecture.\n\n```decision-tree\n```\n\n### When to use RDI\n\nRDI is a good fit when:\n\n- You want your app/micro-services to read from Redis to scale reads at speed.\n- You want to transfer data to Redis from one or more source databases.\n- You must use a slow database as the system of record for the app.\n- The app must always *write* its data to the slow database.\n- Your app can tolerate *eventual* consistency of data in the Redis cache.\n- You want a self-managed solution or AWS based solution.\n- The source data changes frequently in small increments.\n- The source database has no more than 10K changes per second.\n- RDI throughput during [full sync](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines#pipeline-lifecycle)\n  stays below 30K records per second, assuming an average record size of 1KB and a pipeline without transformations.\n- RDI throughput during [CDC](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines#pipeline-lifecycle)\n  stays below 10K records per second, assuming an average record size of 1KB and a pipeline without transformations.\n- The total data size is no larger than 100GB, so a full sync completes in under an hour without exceeding the throughput\n  limits above.\n- You don’t need to perform join operations on the data from several tables\n  into a [nested Redis JSON object](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/data-denormalization#joining-one-to-many-relationships).\n- RDI supports the [data transformations](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/transform-examples) you need for your app.\n- Your data caching needs are too complex or demanding to implement and maintain yourself.\n- Your database administrator has reviewed RDI's requirements for the source database and\n  confirmed that they are acceptable.\n\nThe throughput and data-size limits above assume the\n[classic processor](https://redis.io/docs/latest/integrate/redis-data-integration/architecture/classic-vs-flink).\nThe Flink processor roughly doubles each limit.\n\n### When not to use RDI\n\nRDI is not a good fit when:\n\n- You are migrating an existing data set into Redis only once.\n- Your app needs *immediate* cache consistency (or a hard limit on latency) rather\n  than *eventual* consistency.\n- You need *transactional* consistency between the source and target databases.\n- The app must *write* data to the Redis cache, which then updates the source database\n  (write-behind/write-through patterns).\n- Your data set will only ever be small.\n- Your data is updated by some batch or ETL process with long and large transactions - RDI will fail\n  processing these changes.\n- You need complex stream processing of data (aggregations, sliding window processing, complex \n  custom logic).\n- You need to write data to multiple targets from the same pipeline (Redis supports other\n  ways to replicate data across Redis databases such as replicaOf and  Active Active).\n- Your database administrator has rejected RDI's requirements for the source database.\n\n\n### Decision tree for using RDI\n\nUse the decision tree below to determine whether RDI is a good fit for your architecture:\n\n\n```decision-tree {id=\"when-to-use-rdi\"}\nid: when-to-use-rdi\nscope: rdi\nindentWidth: 25\nrootQuestion: cacheTarget\nquestions:\n    cacheTarget:\n        text: |\n            Do you want to use Redis as the target database?\n        whyAsk: |\n            RDI is specifically designed to keep Redis in sync with a primary database. If you don't need Redis as a cache, RDI is not the right tool.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"❌ RDI only works with Redis as the target database\"\n                    id: noRedisCache\n                    sentiment: \"negative\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: deployment\n    deployment:\n        text: |\n            Do you want a self-managed solution or an AWS-based solution?\n        whyAsk: |\n            RDI is available as a self-managed solution or as an AWS-based managed service. If you need a different deployment model, RDI may not be suitable.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ Check deployment options to see if RDI is suitable for your needs before proceeding\"\n                    id: deploymentMismatch\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: consistency\n    consistency:\n        text: |\n            Can your app tolerate eventual consistency in the Redis cache?\n        whyAsk: |\n            RDI provides eventual consistency, not immediate consistency. If your app needs real-time cache consistency or hard latency limits, RDI is not suitable.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ Check that RDI's performance meets your latency requirements before proceeding (RDI can't guarantee *immediate* consistency)\"\n                    id: needsImmediate\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: systemOfRecord\n    systemOfRecord:\n        text: |\n            Does your app always *write* to the source database and not to Redis?\n        whyAsk: |\n            RDI requires the source database to be the authoritative source of truth. If your app writes to Redis first, RDI won't work.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"❌ RDI doesn't support syncing data from Redis back to the source database\"\n                    id: notSystemOfRecord\n                    sentiment: \"negative\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: dataChangePattern\n    dataChangePattern:\n        text: |\n            Does your source data change frequently in small increments?\n        whyAsk: |\n            RDI captures changes from the database transaction log. Large batch transactions or ETL processes can cause RDI to fail.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ Check that RDI can handle your data change pattern before proceeding (RDI will fail with batch/ETL processes and transactions beyond a certain size)\"\n                    id: batchProcessing\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: changeRate\n    changeRate:\n        text: |\n            Are there fewer than 10K changes per second in the source database?\n        whyAsk: |\n            RDI has throughput limits. Exceeding these limits will cause processing failures and data loss.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ RDI is fast but there are practical limits on throughput - check that RDI can handle your change rate before proceeding\"\n                    id: exceedsChangeRate\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: dataSize\n    dataSize:\n        text: |\n            Is your total data size smaller than 100GB?\n        whyAsk: |\n            RDI has practical limits on the total data size it can manage, based\n            on the throughput requirements for full sync.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ RDI might be unacceptably slow during the full-sync phase. Check that performance will be acceptable for your needs\"\n                    id: dataTooLarge\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: joins\n    joins:\n        text: |\n            Do you need to perform join operations on data from several tables into a nested Redis JSON object?\n        whyAsk: |\n            RDI has limitations with complex join operations. If you need to combine data from multiple tables into nested structures, you may need custom transformations.\n        answers:\n            yes:\n                value: \"Yes\"\n                outcome:\n                    label: \"⚠️ RDI may not be suitable - complex joins are not well supported, so check that RDI's data transformations will meet your needs\"\n                    id: complexJoins\n                    sentiment: \"indeterminate\"\n            no:\n                value: \"No\"\n                nextQuestion: transformations\n    transformations:\n        text: |\n            Does RDI support the data transformations you need for your app?\n        whyAsk: |\n            RDI provides built-in transformations, but if you need custom logic beyond what RDI supports, you may need a different approach.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ RDI supports a wide range of data transformations, but doesn't support free-form code execution. Check that RDI's data transformations will meet your needs\"\n                    id: unsupportedTransformations\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                nextQuestion: adminReview\n    adminReview:\n        text: |\n            Has your database administrator reviewed RDI's requirements for the source database\n            and confirmed they are acceptable?\n        whyAsk: |\n            RDI has specific requirements for the source database (binary logging, permissions, etc.). Your DBA must confirm these are acceptable before proceeding.\n        answers:\n            no:\n                value: \"No\"\n                outcome:\n                    label: \"⚠️ RDI has requirements that might conflict with practical considerations for your database (such as security policies). Check with your DBA before proceeding\"\n                    id: adminReviewNeeded\n                    sentiment: \"indeterminate\"\n            yes:\n                value: \"Yes\"\n                outcome:\n                    label: \"✅ RDI is a good fit for your use case\"\n                    id: goodFit\n                    sentiment: \"positive\"\n```\n\n",
  "tags": ["docs","integrate","rs","rdi"],
  "last_updated": "2026-09-19T17:55:58-07:00"
}
