Regarding your questions:
- This depends on whether or not you are isolating traffic to region-based zones. For example, if each of your availability zones are in separate regions, and you are isolating traffic from those regions to specific zones, you could have a separate Azure Redis Cache for each region. This could reduce cache latency. On the other hand, if you are not using zone isolation, and any client can hit any zone at any time, then you need one Azure Redis Cache instance, so that no matter which app services receives your user request, the same session state will be used.
- The answer will be the same when using Azure Redis Cache for both caching and session state.
- For Azure Storage, you would use one storage account shared by all app services. So, if someone uploads an image for one app service, the image will be available across all app services and availability zones.
I hope this helps.