3

RedisConnection Set メソッドを使用してバイト配列を設定していますが、データを取得するにはどうすればよいですか? 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());
            }
4

1 に答える 1

11

それは完全に正しいです。"Get" (BookSleeve) は遅延 を返しますbyte[]。Wait を正しく使用して実際の を取得しbyte[]、次に a を使用しMemoryStreamてprotobuf-net 経由byte[]で呼び出しました。Deserialize

すべて良い。

醜い手順を明確にしていただければ、より具体的に説明できるかもしれませんが、

  • BookSleeve は を介し​​て完全に非同期Taskであるため、WaitまたはContinueWithにアクセスする必要があります。byte[]
  • protobuf-net は完全にストリームベースであるためMemoryStreambyte[]

もちろん、一般的なユーティリティ メソッド (おそらく拡張メソッド) を追加する場合は、それを 1 回記述するだけで済みます。

さらに、ラッパー クラス (一部の追跡/スライド有効期限用) と L1 キャッシュ (L2 としての Redis) を追加すると、これは、stackoverflow で使用する方法とほぼ同じです。

1 つの注意: 接続はスレッド セーフであり、大量に共有されることを意図しています。操作ごとに接続を行わないでください。

于 2011-06-25T16:02:15.683 に答える