Это допустимое использование ServiceStack Redis? - PullRequest
11 голосов
/ 11 ноября 2011

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

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

I 'используя статическое соединение и статический типизированный список с повторным использованием, например:

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" });

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

Спасибо

Ответы [ 2 ]

16 голосов
/ 11 ноября 2011

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

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, но мог обращаться к нему всякий раз, когда это необходимо.

0 голосов
/ 19 марта 2014

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

...