Как я должен использовать Booksleeve с protobuf-net?
Я использую метод Set RedisConnection для установки байтового массива, но как мне получить данные? Get возвращает упакованный байтовый массив?
Ссылки:
Это работает, но это не так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BookSleeve;
using ProtoBuf;
using System.IO;
namespace RedisTest001
{
[ProtoContract, Serializable]
public class Price
{
private string _ticker;
private double _value;
public Price()
{
}
public Price(string ticker, double value)
{
_ticker = ticker;
_value = value;
}
[ProtoMember(1)]
public string Ticker
{
get { return _ticker; }
set { _ticker = value; }
}
[ProtoMember(2)]
public double Value
{
get { return _value; }
set { _value = value; }
}
}
class Program
{
static void Main(string[] args)
{
using (var conn = new RedisConnection("localhost"))
{
Price p = new Price("IBM", 101.55);
byte[] raw;
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<Price>(ms,p);
raw = ms.ToArray();
}
conn.Open();
conn.Set(1, p.Ticker, raw);
var tb = conn.Get(1,"IBM");
var str = conn.Wait(tb);
Price p2 = Serializer.Deserialize<Price>(new MemoryStream(str));
}
}
}
}
Больше информации:
public static class pex
{
public static byte[] ToBArray<T>(this T o)
{
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize<T>(ms, o);
return ms.ToArray();
}
}
}
class Program
{
static void Main(string[] args)
{
Random RandomClass = new Random();
using (var conn = new RedisConnection("localhost"))
{
conn.Open();
for (int i = 0; i < 500000; i++)
{
Price p = new Price("IBM", RandomClass.Next(0, 1000));
conn.AddToSet(2, "PRICE.IBM", p.ToBArray());
}
1 ответ
Это совершенно правильно. "Get" (BookSleeve) возвращает отложенный byte[]
, Вы правильно использовали Wait, чтобы получить фактический byte[]
, а затем использовал MemoryStream
через это byte[]
звонить Deserialize
через протобуф-сеть.
Все хорошо.
Если вы поясните какие-либо шаги, которые вы считаете уродливыми, я мог бы быть более конкретным, но:
- BookSleeve полностью асинхронный через
Task
отсюда и необходимостьWait
или жеContinueWith
чтобы получить доступ кbyte[]
- Protobuf-net полностью основан на Stream, поэтому необходимо
MemoryStream
сидеть на вершинеbyte[]
Конечно, если вы добавляете универсальный служебный метод (возможно, метод расширения), вам нужно написать его только один раз.
И с добавлением класса-обертки (для некоторого прослеживания / скользящего истечения) и кэша L1 (Redis как L2), это в значительной степени точно, как мы используем его в stackru.
Одно замечание: соединение является поточно-ориентированным и предназначено для массового использования; не делайте соединение за операцию.