A method implemented in a first data center, the method comprising: maintaining data in a memory cache of a first data center that is a memory cache data center, wherein the data is persisted in a database in a second data center located remotely from the first data center, and wherein the memory cache and the database include multiple memory banks, wherein maintaining data includes assigning identifiers and version numbers to data, storing said data in ascending numerical order based on said identifiers, and incrementing said version numbers in response to requests to change corresponding data; retrieving, in response to a request for data received at the first data center, the requested data from the memory cache if the data is in the memory cache, and otherwise obtaining the requested data from the second data center, adding the requested data to a volatile memory bank of the memory cache and to a nonvolatile memory bank of the memory, wherein the data is stored in the same numerical order in the volatile and the non-volatile memory banks wherein identifiers and version numbers of corresponding memory banks are compared sequentially to identify any differences between the data stored in said memory banks; returning the requested data to a requester from which the request was received; and storing, in response to a request received at the first-data center to store additional data in the first data center, the additional data in the memory cache after the additional data has been added to the database in the second data center; wherein the volatile memory bank is filled from the nonvolatile memory bank when the volatile memory bank is powered on from a powered-down state. maintaining data in a memory cache of a first data center that is a memory cache data center, wherein the data is persisted in a database in a second data center located remotely from the first data center, and wherein the memory cache and the database include multiple memory banks, wherein maintaining data includes assigning identifiers and version numbers to data, storing said data in ascending numerical order based on said identifiers, and incrementing said version numbers in response to requests to change corresponding data; retrieving, in response to a request for data received at the first data center, the requested data from the memory cache if the data is in the memory cache, and otherwise obtaining the requested data from the second data center, adding the requested data to a volatile memory bank of the memory cache and to a nonvolatile memory bank of the memory, wherein the data is stored in the same numerical order in the volatile and the non-volatile memory banks wherein identifiers and version numbers of corresponding memory banks are compared sequentially to identify any differences between the data stored in said memory banks; returning the requested data to a requester from which the request was received; and storing, in response to a request received at the first-data center to store additional data in the first data center, the additional data in the memory cache after the additional data has been added to the database in the second data center; wherein the volatile memory bank is filled from the nonvolatile memory bank when the volatile memory bank is powered on from a powered-down state.