/// <summary>
 /// Unsubscribe from a set of patterns (which must match patterns previously subscribed)
 /// </summary>
 /// <param name="keys">The patterns to unsubscribe</param>
 /// <remarks>Channels are server-wide, not per-database</remarks>
 public Task PatternUnsubscribe(string[] keys)
 {
     ValidateKeys(keys, true);
     RemoveNamedSubscriptions(keys);
     return(ExecuteVoid(RedisMessage.CreateMultiSub(RedisLiteral.PUNSUBSCRIBE, keys), false));
 }
 /// <summary>
 /// Subscribe to a set of patterns (using wildcards, for exmaple "Foo*")
 /// </summary>
 /// <param name="keys">The patterns to subscribe</param>
 /// <param name="handler">A callback to invoke when matching messages are received; this can be null
 /// as the MessageReceived event will also be raised</param>
 /// <remarks>Channels are server-wide, not per-database</remarks>
 public Task PatternSubscribe(string[] keys, Action <string, byte[]> handler = null)
 {
     ValidateKeys(keys, true);
     AddNamedSubscriptions(keys, handler);
     return(ExecuteVoid(RedisMessage.CreateMultiSub(RedisLiteral.PSUBSCRIBE, keys), false));
 }