An apparatus, comprising processing circuitry to: generate, for a cacheline, a first tag and a second tag, the first tag and the second tag generated as a function of user data stored and metadata in the cacheline stored in a first memory device, and a multiplication parameter derived from a secret key; store the user data, the metadata, the first tag and the second tag in the first cacheline of the first memory device; generate, for the cacheline, a third tag and a fourth tag, the third tag and the fourth tag generated as a function of the user data stored and metadata in the cacheline stored in a second memory device, and the multiplication parameter; store the user data, the metadata, the third tag and the fourth tag in the corresponding cacheline of the second memory device; receive, from a requesting device, a read operation directed to the cacheline; use the first tag, the second tag, the third tag, and the fourth tag to determine whether a read error occurred during the read operation, wherein determining whether a read error occurred comprises determining that a read error did occur (425 - YES) if the metadata retrieved from the cacheline in the first memory device does not match the metadata retrieved from the corresponding cacheline in the second memory device, or determining that a read error did not occur (425 - NO) if the metadata retrieved from the cacheline in the first memory device matches the metadata retrieved from the corresponding cacheline in the second memory device; in response to the read request: return the user data to the requesting device in response to a determination that a read error did not occur (425 - NO); or obtain a correct value of the metadata in response to a determination that a read error did occur (425 - YES), wherein the correct value of the metadata is obtained from the coupled cacheline; and return, to the requesting device, the user data stored in the first memory device in response to a determination (440 - YES) that the metadata retrieved from the cacheline in the first memory device matches a correct value of the metadata; or return, to the requesting device, the user data stored in the second memory device in response to a determination (450 - YES) that the metadata retrieved from the corresponding cacheline in the second memory device matches a correct value of the metadata. generate, for a cacheline, a first tag and a second tag, the first tag and the second tag generated as a function of user data stored and metadata in the cacheline stored in a first memory device, and a multiplication parameter derived from a secret key; store the user data, the metadata, the first tag and the second tag in the first cacheline of the first memory device; generate, for the cacheline, a third tag and a fourth tag, the third tag and the fourth tag generated as a function of the user data stored and metadata in the cacheline stored in a second memory device, and the multiplication parameter; store the user data, the metadata, the third tag and the fourth tag in the corresponding cacheline of the second memory device; receive, from a requesting device, a read operation directed to the cacheline; use the first tag, the second tag, the third tag, and the fourth tag to determine whether a read error occurred during the read operation, wherein determining whether a read error occurred comprises determining that a read error did occur (425 - YES) if the metadata retrieved from the cacheline in the first memory device does not match the metadata retrieved from the corresponding cacheline in the second memory device, or determining that a read error did not occur (425 - NO) if the metadata retrieved from the cacheline in the first memory device matches the metadata retrieved from the corresponding cacheline in the second memory device; in response to the read request: return the user data to the requesting device in response to a determination that a read error did not occur (425 - NO); or obtain a correct value of the metadata in response to a determination that a read error did occur (425 - YES), wherein the correct value of the metadata is obtained from the coupled cacheline; and return, to the requesting device, the user data stored in the first memory device in response to a determination (440 - YES) that the metadata retrieved from the cacheline in the first memory device matches a correct value of the metadata; or return, to the requesting device, the user data stored in the second memory device in response to a determination (450 - YES) that the metadata retrieved from the corresponding cacheline in the second memory device matches a correct value of the metadata. return the user data to the requesting device in response to a determination that a read error did not occur (425 - NO); or obtain a correct value of the metadata in response to a determination that a read error did occur (425 - YES), wherein the correct value of the metadata is obtained from the coupled cacheline; and return, to the requesting device, the user data stored in the first memory device in response to a determination (440 - YES) that the metadata retrieved from the cacheline in the first memory device matches a correct value of the metadata; or return, to the requesting device, the user data stored in the second memory device in response to a determination (450 - YES) that the metadata retrieved from the corresponding cacheline in the second memory device matches a correct value of the metadata.