Generic Cache-Aware Data Adapter
Typically this scenario is done with a decorator pattern where you would wrap just the one and have the cache functionality in the one class. You would put the code in the CacheDataAdapter that I assume is currently in the code of the IDataAdapter cache.  Most of the time this will simplify your code as you can call base method to get the values if not in the backing store for the cache.  

For example if you are using the ConcurrentDictionary or MemoryCache they will have methods to GetOrCreate or AddOrUpdate that will take a lamba expression that you can call into your base method to get the value if missing.  Since you are doing async work while caching you should check out the AsyncLazy

If you don't want to do the decorator pattern I would swap Save and Delete to do it in the primary store before removing them from the cache.  You could have a situation where the save fails in the primary but your cache is updated to say it's good.  

As far if you should await the ReadAllAsync or not it doesn't matter a lot.  I personally wouldn't await it but either way is fine.  See answer on SO