/// <summary>
        /// Gets or create a user session if one doesn't exist.
        /// </summary>
        /// <param name="userId">The user global id.</param>
        /// <param name="userName">Title of the user.</param>
        /// <param name="shardId"></param>
        /// <returns></returns>
        public UserSession GetOrCreateSession(Guid userId, string userName, string shardId)
        {
            var userSession = this.GetUserSession(userId);
            if (userSession == null)
            {
                userSession = new UserSession(userId, userName, shardId);

                this.cacheClient.Add(userSession.ToCacheKey(), userSession,
                                     userSession.ExpiryDate.GetValueOrDefault(DateTime.UtcNow) + TimeSpan.FromHours(1));
            }
            return userSession;
        }
        /// <summary>
        /// Gets the user session if it exists or null.
        /// </summary>
        /// <param name="userId">The user global id.</param>
        /// <returns></returns>
        public UserSession GetUserSession(Guid userId)
        {
            var cacheKey = UserSession.ToCacheKey(userId);

            return(this.cacheClient.Get <UserSession>(cacheKey));
        }
 /// <summary>
 /// Updates the UserSession in the cache, or removes expired ones.
 /// </summary>
 /// <param name="userSession">The user session.</param>
 public void UpdateUserSession(UserSession userSession)
 {
     var hasSessionExpired = userSession.HasExpired();
     if (hasSessionExpired)
     {
         LogIfDebug("Session has expired, removing: " + userSession.ToCacheKey());
         this.cacheClient.Remove(userSession.ToCacheKey());
     }
     else
     {
         LogIfDebug("Updating session: " + userSession.ToCacheKey());
         this.cacheClient.Replace(userSession.ToCacheKey(), userSession, userSession.ExpiryDate.Value);
     }
 }