Является ли это допустимым использованием 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
Вот пример проекта здесь