private async Task CreateEntity(string entityName, IDictionary <string, string> properties)
        {
            var mutex = Semaphores.GetEntitySemaphore(entityName);
            await mutex.WaitAsync();

            try
            {
                if (await _setClient.SetContains(Constants.AllEntityNamesSetKeyName, entityName))
                {
                    throw new EntityAlreadyExistsException(entityName);
                }

                foreach (var property in properties)
                {
                    await _hashClient.SetHashField(Helpers.GetEntityPropertyTypesKey(entityName), property.Key, property.Value);
                }

                await _setClient.AddToSet(Constants.AllEntityNamesSetKeyName, entityName);

                await _stringClient.StoreValue(Helpers.GetEntityCountKey(entityName), 0.ToString());
            }
            finally
            {
                mutex.Release();
            }
        }
        private async Task AddEntityToStore <TEntity>(string entityName, string identifier, TEntity entity)
        {
            await CheckEntityExistance(entityName);

            await _setClient.AddToSet(Helpers.GetEntityIdentifierCollectionKey(entityName), identifier);

            await _stringClient.StoreValue(Helpers.GetEntityStoreKey(entityName, identifier), entity);

            await _stringClient.IncrementValue(Helpers.GetEntityCountKey(entityName));
        }
        private async Task UpdateEntityStore(string entityName, string key, IDictionary <string, string> updatedEntityProps)
        {
            var updatedEntity = await _insertionEngine.EncodeEntity(entityName, key, updatedEntityProps);

            await _stringClient.StoreValue(Helpers.GetEntityStoreKey(entityName, key), updatedEntity);
        }