##### SUMMARY
The current implementation of CachePluginAdjudicator is unable to flush the cache without loading everything in memory using `load_whole_cache`. Iterating over the plugins cache keys would avoid that step.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
ansible.plugins.cache
CachePluginAdjudicator

##### ANSIBLE VERSION
```
ansible 2.9.6
  config file = /home/harm/dev/closso-ansible/ansible.cfg
  configured module search path = ['/home/harm/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/harm/.virtualenvs/ansible/lib/python3.7/site-packages/ansible
  executable location = /home/harm/.virtualenvs/ansible/bin/ansible
  python version = 3.7.3 (default, Apr  3 2019, 05:39:12) [GCC 8.3.0]
```

##### CONFIGURATION
```
CACHE_PLUGIN(/home/harm/dev/closso-ansible/ansible.cfg) = jsonfile
CACHE_PLUGIN_CONNECTION(/home/harm/dev/closso-ansible/ansible.cfg) = ./cache/fact/
CACHE_PLUGIN_TIMEOUT(/home/harm/dev/closso-ansible/ansible.cfg) = 86400
DEFAULT_CALLBACK_PLUGIN_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/plugins/callback', '/usr/share/ansible/plugins/callback']
DEFAULT_CALLBACK_WHITELIST(/home/harm/dev/closso-ansible/ansible.cfg) = ['profile_tasks']
DEFAULT_FILTER_PLUGIN_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/plugins/filter', '/usr/share/ansible/plugins/filter']
DEFAULT_GATHERING(/home/harm/dev/closso-ansible/ansible.cfg) = smart
DEFAULT_HOST_LIST(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/netbox_inventory.yml']
DEFAULT_LOOKUP_PLUGIN_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/plugins/lookup', '/usr/share/ansible/plugins/lookup']
DEFAULT_ROLES_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/roles']
DEFAULT_VARS_PLUGIN_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/plugins/vars', '/usr/share/ansible/plugins/vars']
DOC_FRAGMENT_PLUGIN_PATH(/home/harm/dev/closso-ansible/ansible.cfg) = ['/home/harm/dev/closso-ansible/plugins/doc_fragments', '/usr/share/ansible/plugins/doc_fragments']
HOST_KEY_CHECKING(/home/harm/dev/closso-ansible/ansible.cfg) = False
INVENTORY_CACHE_ENABLED(/home/harm/dev/closso-ansible/ansible.cfg) = True
INVENTORY_ENABLED(/home/harm/dev/closso-ansible/ansible.cfg) = ['host_list', 'script', 'yaml', 'ini', 'netbox']
TRANSFORM_INVALID_GROUP_CHARS(/home/harm/dev/closso-ansible/ansible.cfg) = never
USE_PERSISTENT_CONNECTIONS(/home/harm/dev/closso-ansible/ansible.cfg) = True
```

##### STEPS TO REPRODUCE

```
>>> cache = CachePluginAdjudicator('jsonfile', _uri='./cache/netbox')
>>> cache._plugin.keys()
['netbox_b42bfs_d14a8', 'netbox_b42bfs_81f3c']
>>> cache.keys()
dict_keys([])
>>> cache.flush()
>>> cache._plugin.keys()
['netbox_b42bfs_d14a8', 'netbox_b42bfs_81f3c']
>>> cache.keys()
dict_keys([])
>>> cache.load_whole_cache()
>>> cache.keys()
dict_keys(['netbox_b42bfs_d14a8', 'netbox_b42bfs_81f3c'])
>>> cache.flush()
>>> cache.keys()
dict_keys([])
>>> cache._plugin.keys()
[]
```

##### EXPECTED RESULTS

Cache should be flushed without loading everything in memory.


##### ACTUAL RESULTS

`cache.flush()` does nothing.

ret = dict()
        for key in self.keys():
            ret[key] = self.get(key)
        return ret
    @abstractmethod
    def _load(self, filepath):
        """
        Read data from a filepath and return it as a value
        :arg filepath: The filepath to read from.
        :returns: The value stored in the filepath
        This method reads from the file on disk and takes care of any parsing
        and transformation of the data before returning it.  The value
        returned should be what Ansible would expect if it were uncached data.
        .. note:: Filehandles have advantages but calling code doesn't know
            whether this file is text or binary, should be decoded, or accessed via
            a library function.  Therefore the API uses a filepath and opens
            the file inside of the method.
        """
        pass
    @abstractmethod
    def _dump(self, value, filepath):
        """
        Write data to a filepath
        :arg value: The value to store
        :arg filepath: The filepath to store it at
        """
        pass
class CachePluginAdjudicator(MutableMapping):