Является ли это допустимым использованием ServiceStack Redis?

Я новичок в Redis (используя его на хостинговой службе) и хочу использовать его в качестве хранилища данных для демонстрации/песочницы для списков.

Я использую следующий фрагмент кода. Меня устраивает. Но допустимо ли это (и не совсем плохая практика) для небольшого веб-сайта с несколькими (до 100) одновременными пользователями (для небольшого объема данных - до 1000 элементов списка)?

Я использую статическое соединение и статический список повторного набора, например:

public class MyApp
{   
    private static ServiceStack.Redis.RedisClient redisClient;

    public static IList<Person> Persons;
    public static IRedisTypedClient<Person> PersonClient;

    static MyApp()
    {
        redisClient = new RedisClient("nnn.redistogo.com", nnn) { Password = "nnn" };
        PersonClient = redisClient.GetTypedClient<Person>();
        Persons = PersonClient.Lists["urn:names:current"];
    }
}

Выполняя это, у меня очень простой в использовании постоянный список данных, который именно то, что я хочу, когда я строю/демонстрирую основные блоки своего приложения.

foreach (var person in MyApp.Persons) ...

Добавление нового человека:

MyApp.Persons.Add(new Person { Id = MyApp.PersonClient.GetNextSequence(), Name = "My Name" });

Мое беспокойство (в настоящее время) заключается не в том, что я загружаю полный список в память в appstart, а скорее из того, что мое соединение с хостом redis не соответствует хорошим стандартам - или что есть еще одна проблема, что я "Не знаю".

Спасибо

Ответ 1

Фактически, когда вы используете PersonClient.Lists["urn:names:current"], вы фактически сохраняете ссылку на соединение RedisClient, которое не является потокобезопасным. Это нормально, если оно в GUI или консольном приложении, но не идеально подходит для многопоточного веб-приложения. В большинстве сценариев вы хотите использовать поточное безопасное соединение factory i.e.

var redisManager = new PooledRedisClientManager("localhost:6379");

Что очень похоже на пул соединений с базой данных. Поэтому всякий раз, когда вы хотите получить доступ к работе RedisClient, выполните следующие действия:

using (var redis = redisManager.GetClient())
{
    var allItems = redis.As<Person>().Lists["urn:names:current"].GetAll();
}

Примечание: .As<T> - более короткий псевдоним для .GetTypedClient<T> Другим удобным сокращением для выполнения типизированного клиента из redisManager является:

var allItems = redisManager.ExecAs<Person>(r => r.Lists["urn:names:current"].GetAll());

Обычно я предпочитаю проходить IRedisClientsManager в моем коде, поэтому он не поддерживает соединение RedisClient, но может обращаться к нему всякий раз, когда ему нужно.

Ответ 2

Вот пример проекта здесь