През повечето време, когато чакате да използвате нова команда Redis, ще трябва да изчакате актуализирана версия на ServiceStack.Redis за да добавите поддръжка за новите команди, също има моменти, когато Redis клиентът не предлага всяка пермутация, която redis-сървърът поддържа.
С новия Custom
и RawCommand
API на IRedisClient
и IRedisNativeClient
вече можете да използвате RedisClient, за да изпращате свои собствени персонализирани команди, които могат да извикват adhoc Redis команди:
public interface IRedisClient
{
...
RedisText Custom(params object[] cmdWithArgs);
}
public interface IRedisNativeClient
{
...
RedisData RawCommand(params object[] cmdWithArgs);
RedisData RawCommand(params byte[][] cmdWithBinaryArgs);
}
Тези персонализирани API приемат гъвкав object[]
аргументи, които приемат всяка сериализирана стойност, напр. byte[]
, string
, int
както и всички потребителски дефинирани сложни типове, които са прозрачно сериализирани като JSON и се изпращат по кабела като UTF-8 байта.
var ret = Redis.Custom("SET", "foo", 1); // ret.Text = "OK"
byte[] cmdSet = Commands.Set;
ret = Redis.Custom(cmdSet, "bar", "b"); // ret.Text = "OK"
ret = Redis.Custom("GET", "foo"); // ret.Text = "1"
Има и удобни методи за разширение на RedisData
и RedisText
които улесняват достъпа до структурирани данни, напр.:
var ret = Redis.Custom(Commands.Keys, "*");
var keys = ret.GetResults(); // keys = ["foo", "bar"]
ret = Redis.Custom(Commands.MGet, "foo", "bar");
var values = ret.GetResults(); // values = ["1", "b"]
Enum.GetNames(typeof(DayOfWeek)).ToList()
.ForEach(x => Redis.Custom(Commands.RPush, "DaysOfWeek", x));
ret = Redis.Custom(Commands.LRange, "DaysOfWeek", 1, -2);
var weekDays = ret.GetResults();
weekDays.PrintDump(); // ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
и още няколко примера за използване на сложни типове с персонализираните API:
var ret = Redis.Custom(Commands.Set, "foo", new Poco { Name = "Bar" }); // ret.Text = "OK"
ret = Redis.Custom(Commands.Get, "foo"); // ret.Text = {"Name":"Bar"}
Poco dto = ret.GetResult<Poco>();
dto.Name.Print(); // Bar
Този API се използва в повечето клиентска библиотека на Redis React UI на JavaScript клиентската библиотека на Redis, където сървърните команди на Redis са достъпни чрез единичната услуга ServiceStack:
public object Any(CallRedis request)
{
var args = request.Args.ToArray();
var response = new CallRedisResponse { Result = Redis.Custom(args) };
return response;
}