Using #cache key on a render array generates 2 entries per role, how to change that?
Yes, by default cached render arrays are varied by the hashed user permissions. See this container parameter:

/sites/default/services.yml

parameters:
  renderer.config:
    # Renderer required cache contexts:
    #
    # The Renderer will automatically associate these cache contexts with every
    # render array, hence varying every render array by these cache contexts.
    #
    # @default ['languages:language_interface', 'theme', 'user.permissions']
    required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions']


Though this should be changed only in rare cases, because caching content with the wrong user permissions can cause security issues.

If you don't want the variations of the render cache, another approach might be to cache the query results directly:

use Drupal\Core\Cache\Cache;

  if ($cache = \Drupal::cache()-&gt;get($cid)) {
    $data = $cache-&gt;data;
  }
  else {
    $data = my_module_query();
    \Drupal::cache()-&gt;set($cid, $data, Cache::PERMANENT, $tags);
  }


Then you can manually pick a cid. With the cached query results the rendering of the list shouldn't take too much cpu time and so probably you don't need render caching anymore.